如何让matplotlib(pyplot)绘图在循环中更新?

2024-06-28 16:16:22 发布

您现在位置:Python中文网/ 问答频道 /正文

我读过很多类似的帖子,但都没用。我有一个循环,正在尝试用文本覆盖更新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)

症状是只有图3更新,其他的保持静态,直到我杀死程序,然后他们刷新。我在一个ipython终端(在Spyder)工作


Tags: 图像文本图形datadeffigpltax
1条回答
网友
1楼 · 发布于 2024-06-28 16:16:22

下面的方法应该有效。它以交互模式(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()

相关问题 更多 >