[python] 動態更新matplotlib中的圖


Answers

為了在沒有FuncAnimation的情況下執行此操作(例如,在生成繪圖或者想要同時更新多個繪圖時執行代碼的其他部分),單獨調用draw不會生成繪圖(至少與qt後端)。

以下適用於我:

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

我正在使用Python收集來自串行端口的數據,並根據到達時間繪製收集到的數據圖。 數據到達的時間不確定。 我希望在收到數據時更新繪圖。 我搜索瞭如何做到這一點,並找到了兩種方法:

  1. 清除繪圖並重新繪製所有點的繪圖。
  2. 通過在特定時間間隔之後更改繪圖來動畫。

我不喜歡第一個程序運行並收集數據很長一段時間(例如一天),並且重繪該圖的速度會很慢。 第二個也不是最好的,因為數據的到達時間是不確定的,我希望只有在收到數據時才更新圖。

有沒有辦法讓我可以通過僅在收到數據時才添加更多點來更新繪圖?




Links