Animation python中的动态绘图

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,该函数在我的模拟中的每个时间步后重新计算电压。我将其设置如下:

我试图在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
,该函数在我的模拟中的每个时间步后重新计算电压。我将其设置如下:

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键点击终端时,图形会打印,但程序会停止。我在下面评论道,你有什么想法吗。