我努力使它工作,因为许多帖子都在谈论这个问题,但似乎没有人关心提供一个工作示例。然而,在这种情况下,原因是不同的:
- 我不能使用 Tiago 或 Bily 的答案,因为它们与问题的范式不同。在问题中,刷新是由算法本身安排的,而对于 funcanimation 或 videofig,我们处于事件驱动的范例中。事件驱动编程对于现代用户界面编程来说是不可避免的,但是当你从一个复杂的算法开始时,可能很难将它转换为事件驱动方案——我也希望能够在经典的过程范式中做到这一点。
- Bub Espinja 的回复遇到了另一个问题:我没有在 jupyter 笔记本的上下文中尝试过,但是重复 imshow 是错误的,因为它每次都会重新创建新的数据结构,这会导致重要的内存泄漏并减慢整个显示过程。
Tiago 还提到了调用draw()
,但没有指定从哪里获取它 - 顺便说一下,你不需要它。你真正需要调用的函数是flush_event()
. 有时它可以在没有的情况下工作,但这是因为它是从其他地方触发的。你不能指望它。真正棘手的一点是,如果你调用imshow()
一个空表,你需要指定 vmin 和 vmax 否则它将无法初始化它的颜色映射并且 set_data 也会失败。
这是一个有效的解决方案:
IMAGE_SIZE = 500
import numpy as np
import matplotlib.pyplot as plt
plt.ion()
fig1, ax1 = plt.subplots()
fig2, ax2 = plt.subplots()
fig3, ax3 = plt.subplots()
# this example doesn't work because array only contains zeroes
array = np.zeros(shape=(IMAGE_SIZE, IMAGE_SIZE), dtype=np.uint8)
axim1 = ax1.imshow(array)
# In order to solve this, one needs to set the color scale with vmin/vman
# I found this, thanks to @jettero's comment.
array = np.zeros(shape=(IMAGE_SIZE, IMAGE_SIZE), dtype=np.uint8)
axim2 = ax2.imshow(array, vmin=0, vmax=99)
# alternatively this process can be automated from the data
array[0, 0] = 99 # this value allow imshow to initialise it's color scale
axim3 = ax3.imshow(array)
del array
for _ in range(50):
print(".", end="")
matrix = np.random.randint(0, 100, size=(IMAGE_SIZE, IMAGE_SIZE), dtype=np.uint8)
axim1.set_data(matrix)
fig1.canvas.flush_events()
axim2.set_data(matrix)
fig1.canvas.flush_events()
axim3.set_data(matrix)
fig1.canvas.flush_events()
print()
更新:我根据@Jettero 的评论添加了 vmin/vmax 解决方案(一开始我错过了)。