Animation python中的动态绘图
我试图在Python中创建一个绘图,其中正在绘制的数据会随着模拟的进行而更新。在MATLAB中,我可以使用以下代码完成此操作:Animation python中的动态绘图,animation,matplotlib,Animation,Matplotlib,我试图在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\u voltage,该函数在我的模拟中的每个时间步后重新计算电压。我将其设置如下:
t = linspace(0, 1, 100);
figure
for i = 1:100
x = cos(2*pi*i*t);
plot(x)
drawnow
end
我试图在类中使用animation
模块中的matplotlib
函数FuncAnimation
。它调用一个函数plot\u 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-')`
当我的模拟运行时,数字显示出来,但只是冻结。但是,代码运行时没有错误。有人能告诉我我缺少什么吗?这里是使用
FuncAnimation
将matlab代码翻译成matplotlib的译文:
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation
t = np.linspace(0, 1, 100)
fig = plt.figure()
line, = plt.plot([],[])
def update(i):
x = np.cos(2*np.pi*i*t)
line.set_data(t,x)
ani = animation.FuncAnimation(fig, update,
frames=np.linspace(1,100,100), interval=100)
plt.xlim(0,1)
plt.ylim(-1,1)
plt.show()
下面是使用
FuncAnimation
将matlab代码翻译成matplotlib的过程:
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation
t = np.linspace(0, 1, 100)
fig = plt.figure()
line, = plt.plot([],[])
def update(i):
x = np.cos(2*np.pi*i*t)
line.set_data(t,x)
ani = animation.FuncAnimation(fig, update,
frames=np.linspace(1,100,100), interval=100)
plt.xlim(0,1)
plt.ylim(-1,1)
plt.show()
我会把第三个版本改编成。谢谢,@cphlewis。这个解决方案的问题是,如果我有另一个函数,比如说只对正整数进行计数的
count()
,我在plt.show()
之后运行这个函数,count()
在我关闭绘图之前不会运行。将plt.show()
替换为plt.draw()
会导致绘图根本不显示,但随后count()
运行。当程序继续并运行count()
时,如何更新绘图?我的后端是Qt5Agg,启用了交互模式。在第三种解决方案中,update()
将调用您的count()
,因此绘图将继续。谢谢,@cphlewis。当我在update()
中包含count()
函数时,代码运行并显示绘图,但窗口只是冻结,什么也不显示。我的代码是。永远不要在需要用户交互的程序中使用而True
。我会将第三个版本修改为。谢谢,@cphlewis。这个解决方案的问题是,如果我有另一个函数,比如说只对正整数进行计数的count()
,我在plt.show()
之后运行这个函数,count()
在我关闭绘图之前不会运行。将plt.show()
替换为plt.draw()
会导致绘图根本不显示,但随后count()
运行。当程序继续并运行count()
时,如何更新绘图?我的后端是Qt5Agg,启用了交互模式。在第三种解决方案中,update()
将调用您的count()
,因此绘图将继续。谢谢,@cphlewis。当我在update()
中包含count()
函数时,代码运行并显示绘图,但窗口只是冻结,什么也不显示。我的代码是。永远不要在需要用户交互的程序中使用而True
。谢谢,但是你上面的评论是对的-我应该更清楚。我有一个模拟,其中一个对象的参数正在更新。每次执行更新时,我都要绘制它们的值。这是一个最小的例子。我不一定需要使用动画
包。这只是我一直在尝试的东西。当我运行这个示例时,图形不会渲染,窗口也不会响应。当我按住ctrl+c键点击终端时,图形会打印,但程序会停止。你有什么想法吗?我在下面评论。谢谢,但是你上面的评论是正确的-我应该更清楚。我有一个模拟,其中一个对象的参数正在更新。每次执行更新时,我都要绘制它们的值。这是一个最小的例子。我不一定需要使用动画
包。这只是我一直在尝试的东西。当我运行这个示例时,图形不会渲染,窗口也不会响应。当我按住ctrl+c键点击终端时,图形会打印,但程序会停止。我在下面评论道,你有什么想法吗。