Matplotlib - 在子图中绘制2个图形 - 其中1个是动画

3

我有两个图形要在子图中绘制:

fig = plt.figure()
ax1 = fig.add_subplot(1,2,1)
ax2 = fig.add_subplot(1,2,2)

假设ax1将被填充为一个添加点的动画(散点图)。然后,Ax2将这些点分配到网格中,并显示密度。
我能否在subplot1中显示动画,在完成后将密度图像添加到subplot2中?

可以的。细节取决于您所说的“完成”是什么意思。 - ev-br
动画由yield语句驱动。一旦yield返回false(完成),我希望相邻的图形出现/填充。我可以预渲染空间,但不能预渲染绘制的密度。 - Jzl5325
1个回答

2
这应该是可能的。请查看示例。您还可以查看先前的问题:使用matplotlib和pyplot进行2D坐标的简单动画

以下是一个样本实现。第二个图在第一个停止渲染之前将被隐藏:

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

def update_line(num, data, line, img):
    line.set_data(data[...,:num])
    if num == 24:
        img.set_visible(True)
    return line, img

fig1 = plt.figure()

data = np.random.rand(2, 25)
ax1=plt.subplot(211)
l, = plt.plot([], [], 'rx')
plt.xlim(0, 1)
plt.ylim(0, 1)
plt.xlabel('x')
plt.title('test')
ax2=plt.subplot(212)
nhist, xedges, yedges = np.histogram2d(data[0,:], data[1,:])
img = plt.imshow(nhist, aspect='auto', origin='lower')
img.set_visible(False)
line_ani = animation.FuncAnimation(fig1, update_line, 25, 
                                   fargs=(data, l, img),
                                   interval=50, blit=True)
line_ani.repeat = False
plt.show()

我需要延迟生成第二个图形,直到第一个图形完全渲染。有什么控制流的建议吗? - Jzl5325
@Jzl5325 我更新了答案并提供了一个示例解决方案。虽然不是最优的,但据我所知,matplotlib不会触发结束动画事件。 - btel
很有趣的方法!我刚刚尝试使用线程和is_alive()相同的想法。这看起来是一个更简单的实现。谢谢! - Jzl5325
如果你有一个迭代器函数而不是一个间隔集会怎么办?你仍然可以从update_line返回img吗?我认为迭代器需要返回一组线条的元组,所以不确定是否可以使其在blit期间更新轴文本。 - bretcj7

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接