[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. 通過在特定的時間間隔之後更改曲線來使曲線動畫化。

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

只有當數據被接收時,我才能通過增加更多的點來更新圖表嗎?