簡體   English   中英

將第二個動畫圖嵌入到PyQt5 GUI

[英]Embedding second animated graph to PyQt5 GUI

我想在GUI中添加第二個動畫圖,其中包含我的第一個動畫圖,並且兩個圖同時進行動畫處理,但是我不確定該如何做。

這是我的代碼:

import sys
import numpy as np
from matplotlib.backends.qt_compat import QtWidgets
from matplotlib.backends.backend_qt5agg import (
        FigureCanvas, NavigationToolbar2QT as NavigationToolbar)
from matplotlib.figure import Figure
from matplotlib import animation


class ApplicationWindow(QtWidgets.QMainWindow):
    def __init__(self):
        super().__init__()
        self._main = QtWidgets.QWidget()
        self.setCentralWidget(self._main)
        layout = QtWidgets.QVBoxLayout(self._main)

        self.fig = Figure(figsize=(5, 3))
        self.canvas = FigureCanvas(self.fig)
        layout.addWidget(self.canvas)
        self.addToolBar(NavigationToolbar(self.canvas, self))

        self.setup()

    def setup(self):
        self.ax = self.fig.subplots()
        self.ax.set_aspect('equal')
        self.ax.grid(True, linestyle = '-', color = '0.10')
        self.ax.set_xlim([-15, 15])
        self.ax.set_ylim([-15, 15])

        self.scat = self.ax.scatter([], [], c=(0.9, 0.1, 0.5),  zorder=3)
        self.scat.set_alpha(0.8)

        self.anim = animation.FuncAnimation(self.fig, self.update,
                                                 frames = 720, interval = 10)

    def update(self, i):

        self.scat.set_offsets(([np.cos(np.radians(i))*7.5, np.sin(np.radians(i))*7.5], [0,0]))

if __name__ == "__main__":
    qapp = QtWidgets.QApplication(sys.argv)
    app = ApplicationWindow()
    app.show()
    qapp.exec_()

這是一些示例代碼,在同一窗口內有兩個圖形(例如我想要的樣子)。在這里,它們為動畫圖使用_update_canvas函數,而在應用程序窗口中將其繪制為另一個圖(只是靜態圖)類。 我正在使用update繪圖功能為圖形制作動畫,是否需要第二個 update繪圖功能? 怎么樣?

樣例代碼:

import sys
import time
import numpy as np

from matplotlib.backends.qt_compat import QtCore, QtWidgets, is_pyqt5
if is_pyqt5():
    from matplotlib.backends.backend_qt5agg import (
        FigureCanvas, NavigationToolbar2QT as NavigationToolbar)
else:
    from matplotlib.backends.backend_qt4agg import (
        FigureCanvas, NavigationToolbar2QT as NavigationToolbar)
from matplotlib.figure import Figure


class ApplicationWindow(QtWidgets.QMainWindow):
    def __init__(self):
        super().__init__()
        self._main = QtWidgets.QWidget()
        self.setCentralWidget(self._main)
        layout = QtWidgets.QVBoxLayout(self._main)

        static_canvas = FigureCanvas(Figure(figsize=(5, 3)))
        layout.addWidget(static_canvas)
        self.addToolBar(NavigationToolbar(static_canvas, self))

        dynamic_canvas = FigureCanvas(Figure(figsize=(5, 3)))
        layout.addWidget(dynamic_canvas)
        self.addToolBar(QtCore.Qt.BottomToolBarArea,
                        NavigationToolbar(dynamic_canvas, self))

        self._static_ax = static_canvas.figure.subplots()
        t = np.linspace(0, 10, 501)
        self._static_ax.plot(t, np.tan(t), ".")

        self._dynamic_ax = dynamic_canvas.figure.subplots()
        self._timer = dynamic_canvas.new_timer(
            100, [(self._update_canvas, (), {})])
        self._timer.start()

    def _update_canvas(self):
        self._dynamic_ax.clear()
        t = np.linspace(0, 10, 101)
        # Shift the sinusoid as a function of time.
        self._dynamic_ax.plot(t, np.sin(t + time.time()))
        self._dynamic_ax.figure.canvas.draw()


if __name__ == "__main__":
    qapp = QtWidgets.QApplication(sys.argv)
    app = ApplicationWindow()
    app.show()
    qapp.exec_()

在此處輸入圖片說明

要嵌入多個動畫圖,您需要創建多個繪圖對象( FigureFigureCanvas ),然后將每個對象添加到QVBoxLayout 如果要水平顯示它,可以使用QHBoxLayout 每個圖對象將具有其自己的子圖,網格和數據。 要更新每個圖的數據,您將需要每個圖具有其單獨的圖更新功能,您可以在其中將其傳遞給animation.FuncAnimation處理函數。 因此,在您的情況下,要擁有兩個動畫圖,您將需要兩個更新繪圖功能。

from matplotlib.figure import Figure
from matplotlib import animation
import numpy as np
import sys, matplotlib
from PyQt5 import QtWidgets, QtCore
from matplotlib.backends.backend_qt5agg import (FigureCanvas, NavigationToolbar2QT as NavigationToolbar)

class ApplicationWindow(QtWidgets.QMainWindow):
    def __init__(self):
        super().__init__()
        self._main = QtWidgets.QWidget()
        self.setCentralWidget(self._main)
        layout = QtWidgets.QVBoxLayout(self._main)

        # Configure figure 1 
        self.fig1 = Figure(figsize=(5, 3))
        self.canvas1 = FigureCanvas(self.fig1)

        # Configure figure 2
        self.fig2 = Figure(figsize=(5, 3))
        self.canvas2 = FigureCanvas(self.fig2)

        layout.addWidget(self.canvas1)
        layout.addWidget(self.canvas2)
        self.addToolBar(NavigationToolbar(self.canvas1, self))
        self.addToolBar(QtCore.Qt.BottomToolBarArea, NavigationToolbar(self.canvas2, self))

        self.setup()

    def setup(self):
        # Plot 1 (top)
        self.ax1 = self.fig1.subplots()
        self.ax1.set_aspect('equal')
        self.ax1.grid(True, linestyle = '-', color = '0.10')
        self.ax1.set_xlim([-15, 15])
        self.ax1.set_ylim([-15, 15])

        # Plot 2 (bottom)
        self.ax2 = self.fig2.subplots()
        self.ax2.set_aspect('equal')
        self.ax2.grid(True, linestyle = '-', color = '0.10')
        self.ax2.set_xlim([-15, 15])
        self.ax2.set_ylim([-15, 15])

        self.scat1 = self.ax1.scatter([], [], c=(0.9, 0.1, 0.5),  zorder=3)
        self.scat1.set_alpha(0.8)

        self.scat2 = self.ax2.scatter([], [], c=(0.9, 0.1, 0.5),  zorder=3)
        self.scat2.set_alpha(0.8)

        self.anim1 = animation.FuncAnimation(self.fig1, self.update1,frames = 720, interval = 10)
        self.anim2 = animation.FuncAnimation(self.fig2, self.update2,frames = 720, interval = 10)

    # Update data for plot 1
    def update1(self, i):
        self.scat1.set_offsets(([np.cos(np.radians(i))*7.5, np.sin(np.radians(i))*7.5], [0,0]))

    # Update data for plot 2
    def update2(self, i):
        self.scat2.set_offsets(([np.cos(np.radians(i))*7.5, np.sin(np.radians(i))*7.5], [0,0]))

if __name__ == "__main__":
    qapp = QtWidgets.QApplication(sys.argv)
    app = ApplicationWindow()
    app.show()
    qapp.exec_()

是否有特定原因需要您使用兩個單獨的畫布和兩個單獨的圖形? 如果不是,那么我同意ImportanceOfBeingErnest的評論,您應該只創建一個具有2個子圖的圖形/畫布,並調用一個用於更新兩個軸的內容的更新函數。

從本質上說,你的問題將是一個重復的這一個 ,除了事實,你嵌入動畫Qt的應用程序。

import sys
import time
import numpy as np

from matplotlib.backends.qt_compat import QtCore, QtWidgets, is_pyqt5
if is_pyqt5():
    from matplotlib.backends.backend_qt5agg import (
        FigureCanvas, NavigationToolbar2QT as NavigationToolbar)
else:
    from matplotlib.backends.backend_qt4agg import (
        FigureCanvas, NavigationToolbar2QT as NavigationToolbar)
from matplotlib.figure import Figure


class ApplicationWindow(QtWidgets.QMainWindow):
    def __init__(self):
        super().__init__()
        self._main = QtWidgets.QWidget()
        self.setCentralWidget(self._main)
        layout = QtWidgets.QVBoxLayout(self._main)

        self.fig = Figure(figsize=(5, 6))
        self.canvas = FigureCanvas(self.fig)
        layout.addWidget(self.canvas)
        self.addToolBar(QtCore.Qt.BottomToolBarArea,
                        NavigationToolbar(self.canvas, self))

        self._axs = self.fig.subplots(2, 1)

        self._timer = self.canvas.new_timer(
            100, [(self._update_canvas, (), {})])
        self._timer.start()

    def _update_canvas(self):
        [ax.clear() for ax in self._axs]
        t = np.linspace(0, 10, 501)
        self._axs[0].plot(t, np.tan(t + time.time()), ".")

        t = np.linspace(0, 10, 101)
        self._axs[1].plot(t, np.sin(t + time.time()))
        self.canvas.draw()


if __name__ == "__main__":
    qapp = QtWidgets.QApplication(sys.argv)
    app = ApplicationWindow()
    app.show()
    qapp.exec_()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM