Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将第二个动画图形嵌入PyQt5 GUI_Python_Matplotlib_Graph_Pyqt_Pyqt5 - Fatal编程技术网

Python 将第二个动画图形嵌入PyQt5 GUI

Python 将第二个动画图形嵌入PyQt5 GUI,python,matplotlib,graph,pyqt,pyqt5,Python,Matplotlib,Graph,Pyqt,Pyqt5,我想将第二个动画图形添加到保存第一个动画图形的GUI中,两个图形同时动画,但我不确定如何添加 这是我的密码: 导入系统 将numpy作为np导入 从matplotlib.backends.qt\u compat导入QtWidgets 从matplotlib.backends.backend_qt5agg导入( 图CAVAS,导航工具栏2QT作为导航工具栏) 从matplotlib.figure导入图形 从matplotlib导入动画 类ApplicationWindow(QtWidgets.QM

我想将第二个动画图形添加到保存第一个动画图形的GUI中,两个图形同时动画,但我不确定如何添加

这是我的密码:

导入系统 将numpy作为np导入 从matplotlib.backends.qt\u compat导入QtWidgets 从matplotlib.backends.backend_qt5agg导入( 图CAVAS,导航工具栏2QT作为导航工具栏) 从matplotlib.figure导入图形 从matplotlib导入动画 类ApplicationWindow(QtWidgets.QMainWindow): 定义初始化(自): super()。\uuuu init\uuuuu() self.\u main=qtwidts.QWidget() self.setCentralWidget(self.\u main) layout=qtwidts.QVBoxLayout(self.\u main) self.fig=图(figsize=(5,3)) self.canvas=FigureCanvas(self.fig) layout.addWidget(self.canvas) self.addToolBar(导航工具栏(self.canvas,self)) self.setup() def设置(自): self.ax=self.fig.子批次() 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) 自散射集α(0.8) self.anim=animation.FuncAnimation(self.fig、self.update、, 帧=720,间隔=10) def更新(自我,i): 自散射集_偏移([np.cos(np.radians(i))*7.5,np.sin(np.radians(i))*7.5],[0,0])) 如果名称=“\uuuuu main\uuuuuuuu”: qapp=qtwidts.QApplication(sys.argv) app=ApplicationWindow() app.show() qapp.exec() 下面是一些示例代码,它在同一个窗口中有两个图(就像我想要的那样) 在这里,他们对动画图形使用
\u update\u canvas
函数,另一个图形(只是静态图形)在应用程序窗口类中绘制。 我正在使用
update
plot函数来设置图形的动画,是否需要第二个
update
plot函数?怎么做

示例代码:

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_()

要嵌入多个动画图形,您需要创建多个绘图对象(
Figure
FigureCanvas
),然后将每个对象添加到图形中。如果要水平显示,可以使用。每个绘图对象都有自己的子绘图、网格和数据。要更新每个绘图的数据,您需要每个绘图都有其单独的绘图更新功能,您可以将其传递给
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_()

使用单个
FuncAnimation
会更有效率。@非常感谢您,这非常有帮助,我更了解它,并且我可以将相同的属性行用于第三个或第四个属性行(我刚刚尝试过)。非常感谢!