python - 如何让 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 中)工作。
解决方案
以下应该工作。它以交互模式 ( 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()
推荐阅读
- amazon-web-services - Terraform 无法使用具有完全访问权限的附加策略文档的用户进行初始化
- icloud - Xcode 13 Beta 和 CloudKit 问题
- terraform-provider-aws - 特定 ENI 的流日志
- ios - 在不知道类型的情况下初始化 swift 变量
- angular - Angular Storybook 函数和动画
- redirect - 是否可以将 Shopify 注册的域重定向到另一个网站(Squarespace)?
- node.js - TypeScript 装饰器:将对象从装饰器注入方法
- reactjs - Pre Populate Material UI 复选框、滑块和地图字段
- reactjs - 顺风条件转换
- powershell - Powershell Start-Process 文件名或扩展名太长