【发布时间】:2017-07-22 21:30:35
【问题描述】:
我正在尝试在 Python 中创建一个绘图,其中正在绘制的数据会随着我的模拟进行而更新。在 MATLAB 中,我可以使用以下代码来做到这一点:
t = linspace(0, 1, 100);
figure
for i = 1:100
x = cos(2*pi*i*t);
plot(x)
drawnow
end
我正在尝试在animation 模块中使用matplotlib 的FuncAnimation 函数在类中执行此操作。它调用了一个函数plot_voltage,它在我的模拟中的每个时间步之后重新计算电压。我的设置如下:
import matplotlib.pyplot as plt
import matplotlib.animation as animation
def __init__(self):
ani = animation.FuncAnimation(plt.figure(2), self.plot_voltage)
plt.draw()
def plot_voltage(self, *args):
voltages = np.zeros(100)
voltages[:] = np.nan
# some code to calculate voltage
ax1 = plt.figure(2).gca()
ax1.clear()
ax1.plot(np.arange(0, len(voltages), 1), voltages, 'ko-')`
当我的模拟运行时,数字会显示,但只是冻结。但是,代码运行没有错误。有人可以告诉我我缺少什么吗?
【问题讨论】:
-
我会把第三个版本改成this answer。
-
谢谢,@cphlewis。该解决方案的问题在于,如果我有另一个函数,比如
count(),它只是对正整数进行计数,并且我在plt.show()之后运行它,count()在关闭绘图之前不会运行。用plt.draw()替换plt.show()会导致绘图根本不显示,但随后count()运行。如何在程序继续运行和count()运行时更新情节?我的后端是开启交互模式的 Qt5Agg。 -
在第三种解决方案中,
update()将同时调用您的count(),因此绘图继续。 -
谢谢,@cphlewis。当我在
update()中包含count()函数时,代码运行并显示了绘图,但窗口只是冻结并且没有显示任何内容。我的代码是here。 -
永远不要在需要用户交互的程序中使用
while True。
标签: animation matplotlib