gpt4 book ai didi

python - 表面动画和使用 matplotlib 保存

转载 作者:行者123 更新时间:2023-12-05 09:02:52 24 4
gpt4 key购买 nike

我尝试做一个非常简单的动画并用 matplotlib 保存它,但没有成功。例如,我想看到一些振荡:这是我能做的最好的

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import matplotlib.animation as animation

#Define x,y vectors and meshgrid with function u on it

x = np.arange(0,10,0.1)
y = np.arange(0,10,0.1)
X,Y = np.meshgrid(x,y)
u = np.sin(X + Y)

#Create a figure and an axis object for the surface
#(which by the way is not initialized, because I don't know were to)

fig = plt.figure()
ax = fig.add_subplot(111,projection='3d')

#Define a kind-of animation function, imitating what I saw many times

def animate(n):
global u
for n in (1,20):
u = np.sin((X + Y)*n)
return fig,

#I'm missing many commands, I'm just putting what I know

anim = animation.FuncAnimation(fig,animate)
anim.save('A.mp4',fps=10)

我阅读了大量在线文档,包括官方文档,但我找不到表面随时间演变的明确示例。我还发现很难掌握使用 matplotlib 构建绘图背后的逻辑(我阅读了有关图形、关联的对象、轴、其他对象……我感到困惑),但我也在自学它以备考试和我不是一个真正的技术人员,所以也许这就是我遇到这么多麻烦的原因;从根本上说,如果您回答并能多花两分钟更详细地描述您在做什么,您会让我非常高兴。非常感谢您的帮助。

最佳答案

首先,您必须设置表面的数学域,它对于每个动画帧都是恒定的,因此您可以在开始时这样做:

x = np.arange(0,10,0.1)
y = np.arange(0,10,0.1)
X,Y = np.meshgrid(x,y)

然后你可以初始化图:

fig = plt.figure()
ax = fig.add_subplot(111,projection='3d')

这里是动画的东西,你必须定义一个函数来描述一个动画帧和下一帧之间的变化。首先你必须从图中清除你在前一帧中已经绘制的内容,这样你就可以使用 ax.cla()
然后是数学部分:您必须定义您的函数以及它如何随时间变化。注意animate函数有一个参数,在你的例子中是n,每帧增加1,你可以用它来描述连续帧之间发生了什么变化。例如,如果我写 u = np.sin((X + Y) + n) 那么正弦曲面将在每次迭代中增加其相位,因此它将“向前移动”;您可以重新定义此等式,以便通过正确使用 n 参数来实现您的目标。
然后是使用 ax.plot_surface(X, Y, u) 绘制曲面的时候了。这不是强制性的,但我建议修复轴限制,以改进动画,使用 ax.set_zlim(-2, 2)
这样,animate 函数定义为:

def animate(n):
ax.cla()

u = np.sin((X + Y) + n)

ax.plot_surface(X, Y, u)
ax.set_zlim(-2, 2)

return fig,

最后,您必须使用您想要的参数设置 FuncAnimation 对象:

anim = FuncAnimation(fig = fig, func = animate, frames = 10, interval = 1, repeat = False)

完整代码

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


x = np.arange(0,10,0.1)
y = np.arange(0,10,0.1)
X,Y = np.meshgrid(x,y)


fig = plt.figure()
ax = fig.add_subplot(111,projection='3d')


def animate(n):
ax.cla()

u = np.sin((X + Y) + n)

ax.plot_surface(X, Y, u)
ax.set_zlim(-2, 2)

return fig,


anim = FuncAnimation(fig = fig, func = animate, frames = 10, interval = 1, repeat = False)
anim.save('A.mp4',fps=10)

enter image description here


另一个改变表面公式的例子,如果你使用:

u = np.sin(5/2/np.pi*n)*np.sin((X + Y))

animate 函数中,表面相位将保持不变,但正弦表面振幅将发生变化,遵循正弦函数,因此您将得到:

enter image description here

关于python - 表面动画和使用 matplotlib 保存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70723644/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com