Следующее должно работать.Он работает в интерактивном режиме (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()