Dynamically updating plot in matplotlib

前端 未结 4 616
难免孤独
难免孤独 2020-11-22 08:31

I am making an application in Python which collects data from a serial port and plots a graph of the collected data against arrival time. The time of arrival for the data is

4条回答
  •  暗喜
    暗喜 (楼主)
    2020-11-22 09:15

    In order to do this without FuncAnimation (eg you want to execute other parts of the code while the plot is being produced or you want to be updating several plots at the same time), calling draw alone does not produce the plot (at least with the qt backend).

    The following works for me:

    import matplotlib.pyplot as plt
    plt.ion()
    class DynamicUpdate():
        #Suppose we know the x range
        min_x = 0
        max_x = 10
    
        def on_launch(self):
            #Set up plot
            self.figure, self.ax = plt.subplots()
            self.lines, = self.ax.plot([],[], 'o')
            #Autoscale on unknown axis and known lims on the other
            self.ax.set_autoscaley_on(True)
            self.ax.set_xlim(self.min_x, self.max_x)
            #Other stuff
            self.ax.grid()
            ...
    
        def on_running(self, xdata, ydata):
            #Update data (with the new _and_ the old points)
            self.lines.set_xdata(xdata)
            self.lines.set_ydata(ydata)
            #Need both of these in order to rescale
            self.ax.relim()
            self.ax.autoscale_view()
            #We need to draw *and* flush
            self.figure.canvas.draw()
            self.figure.canvas.flush_events()
    
        #Example
        def __call__(self):
            import numpy as np
            import time
            self.on_launch()
            xdata = []
            ydata = []
            for x in np.arange(0,10,0.5):
                xdata.append(x)
                ydata.append(np.exp(-x**2)+10*np.exp(-(x-7)**2))
                self.on_running(xdata, ydata)
                time.sleep(1)
            return xdata, ydata
    
    d = DynamicUpdate()
    d()
    

提交回复
热议问题