首页 > 解决方案 > 如何让 matplotlib (pyplot) 图循环更新?

问题描述

我读过很多类似的帖子,但没有任何效果。我有一个循环,正在尝试更新 3 个包含带有文本覆盖的图像的数字,有点像这样:

def updatePlot(data, fig):
  fig.clear()
  ax = fig.subplots()
  ax.imshow(...)
  ax.text(...)
  plt.show()
  plt.draw()
  plt.pause(0.0001)

fig1 = plt.figure()
fig2 = plt.figure()
fig3 = plt.figure()

while True:
  # do computation
  updatePlot(..., fig1)
  updatePlot(..., fig2)
  updatePlot(..., fig3)

症状是只有 fig3 更新和其他保持静止,直到我终止程序,然后它们刷新。我在 ipython 终端(在 Spyder 中)工作。

标签: pythonmatplotlib

解决方案


以下应该工作。它以交互模式 ( plt.ion()) 运行并刷新每个图形上的事件。

import numpy as np
import matplotlib.pyplot as plt

plt.ion()

def updatePlot(data, fig):
  fig.clear()
  ax = fig.subplots()
  ax.imshow(data)
  ax.text(2,2, np.mean(data))

  plt.pause(0.1)
  fig.canvas.draw_idle()
  fig.canvas.flush_events()

fig1 = plt.figure()
fig2 = plt.figure()
fig3 = plt.figure()

while True:
  # do computation
  updatePlot(np.random.rand(4,4), fig1)
  updatePlot(np.random.rand(6,6), fig2)
  updatePlot(np.random.rand(10,10), fig3)

但是,这非常不稳定且效率低下。也许考虑使用FuncAnimation.

import numpy as np
import matplotlib.animation
import matplotlib.pyplot as plt


def updatePlot(data, image, text):
    image.set_data(data)
    text.set_text(data.mean())

fig1, ax1 = plt.subplots()
image1 = ax1.imshow(np.random.rand(4,4))
text1 = ax1.text(2,2, "")

fig2, ax2 = plt.subplots()
image2 = ax2.imshow(np.random.rand(6,6))
text2 = ax2.text(2,2, "")

fig3, ax3 = plt.subplots()
text3 = ax3.text(2,2, "")
image3 = ax3.imshow(np.random.rand(10,10))

def update_plots(i):
    # do computation
    updatePlot(np.random.rand(4,4), image1, text1)
    updatePlot(np.random.rand(6,6), image2, text2)
    updatePlot(np.random.rand(10,10), image3, text3)
    fig2.canvas.draw_idle()
    fig3.canvas.draw_idle()

ani = matplotlib.animation.FuncAnimation(fig1, update_plots, interval=40)

plt.show()

推荐阅读