在循环内调用图形函数时,图形未作图

时间:2019-03-11 10:31:57

标签: python matplotlib pyqt5

我希望通过从文件中读取数据以幻灯片形式显示图形。首先,我希望绘制第一组数据,然后再绘制,依此类推。 我尝试过的是:

class MatplotlibWidget(QMainWindow):

    def __init__(self):
        ---
        self.playbutton.clicked.connect(self.drawGraph)
        self.pausebutton.clicked.connect(self.pauseGraph)

        ----      

   def drawGraph(self):
        f1 = open('TESTIP2.txt', 'r')        
        data = np.genfromtxt(f1)
        m = np.size(data, 0)
        n = np.size(data, 1)
        x = data[:, 0].reshape(m, 1)
        y = data[:, 1].reshape(m, 1)
        iters = m // 4
        current_iter=0
        self.plotGraph(x,y,iters,current_iter)

   def plotGraph(x,y,iters,current_iter):
        for i in range(iters):
           self.plotDraw(x[current_iter:current_iter+iters],y[current_iter:current_iter+iters])
           current_iter=current_iter+iters
           time.sleep(1)

   def plotDraw(x,y)       
        self.MplWidget.canvas.axes.clear()
        self.MplWidget.canvas.axes.plot(x,y)
        self.MplWidget.canvas.axes.legend(('cosinus', 'sinus'), loc='upper right')
        self.MplWidget.canvas.axes.set_title('Signal' )
        self.MplWidget.canvas.draw()
在循环内部调用

plotDraw函数以显示每组数据,但它仅显示最后一组数据。在指定的时间间隔后,是否可以显示第一,第二等等。

1 个答案:

答案 0 :(得分:1)

最简单的方法是使用PyQt5中的QTimer。这真的很容易使用:您指定一个应在超时后触发的函数,并指定时间间隔。通过以下代码,我每秒在PyQt5内的Matplotlib小部件中绘制随机数据。

from PyQt5.QtWidgets import QMainWindow, QApplication
from PyQt5.QtCore import QTimer
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
from matplotlib.figure import Figure
import numpy as np


class M(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setGeometry(100,100,640,480)
        self.Figure = Figure()
        self.Canvas = FigureCanvas(self.Figure)
        self.Canvas.setParent(self)
        self.Canvas.move(0,0)

        self.ax = self.Figure.add_subplot(111)
        self.plotItem, = self.ax.plot([], [])
        self.plot()

        # Create timer
        self.t = QTimer()
        self.t.timeout.connect(self.plot) # specify function 
        self.t.start(1000) # 1 s


    def plot(self):
        """plots random data and adjusts the x and y limits"""
        x = np.linspace(0, np.random.randn()*100)
        y = np.random.randn(50)

        self.plotItem.set_xdata(x)
        self.plotItem.set_ydata(y)
        self.ax.set_ylim([y.min()-1, y.max()+1])
        self.ax.set_xlim([x.min()-1, x.max()+1])
        self.Canvas.draw() # update plot


if __name__ == '__main__':
    app = QApplication([])
    m = M()
    m.show()
    app.exec_()

上面的代码为您提供了这一点:

Changing x and y data every second using QTimer object

例如,您可以使用按钮触发self.t.stop()以停止更新/循环,如果要继续,则可以再次self.t.start(your_interval)