系列文章目录
Python 建模学习:绘制一个连续的、波动三维模型
前言
这个动画展示了一个随时间波动的三维曲面。通过调整 update 函数中的参数,我们可以控制波动的频率和振幅。动画的帧率和质量可以通过调整 FuncAnimation 的参数来优化。
一、项目需求
要求通过python代码,创建一个动态的三维波动模型,并使用 matplotlib 的动画功能来展示这个波动效果。
二、代码具体分析
1.导入必要的库:
代码如下:
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from matplotlib.animation import FuncAnimation
分析如下:
numpy:用于数值计算。
matplotlib.pyplot:用于绘图。
mpl_toolkits.mplot3d:提供了三维绘图的支持。
matplotlib.animation:提供了动画功能。
2.初始化图形和3D子图:
代码如下:
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
分析如下:
创建一个新的图形窗口。
添加一个三维子图。
3.准备数据:
代码如下:
x = np.linspace(-3.0, 3.0, 100)
y = np.linspace(-3.0, 3.0, 100)
X, Y = np.meshgrid(x, y)
分析如下:
使用 np.linspace 创建 x 和 y 轴的值,范围从 -3.0 到 3.0,共 100 个点。
使用 np.meshgrid 创建二维网格。
4.定义更新函数:
代码如下:
def update(frame):
# 计算新的Z值,创建波动效果
Z = np.sin(X + frame * 5) * np.cos(Y + frame * 5)
# 清除当前的图形
ax.clear()
# 重新绘制曲面
surf = ax.plot_surface(X, Y, Z, cmap='viridis', rstride=5, cstride=5)
# 设置坐标轴标签
ax.set_xlabel('X axis')
ax.set_ylabel('Y axis')
ax.set_zlabel('Z axis')
# 设置坐标轴的范围
ax.set_xlim(-5, 5)
ax.set_ylim(-5, 5)
ax.set_zlim(-5, 5)
return surf,
分析如下:
update 函数是动画的每一帧调用的函数。
计算新的 Z 值,使用正弦和余弦函数创建波动效果,frame * 5 用于控制波动的速度。
使用 ax.clear() 清除上一帧的图形。
使用 ax.plot_surface 重新绘制曲面,cmap='viridis' 设置颜色映射,rstride=5 和 cstride=5 控制网格的粗糙度。
设置坐标轴的标签和范围。
5.创建动画:
代码如下:
ani = FuncAnimation(fig, update, frames=np.linspace(0, 4 * np.pi, 250),
init_func=lambda: update(0), blit=False)
分析如下:
使用 FuncAnimation 创建动画。
fig 是图形对象。
update 是更新函数。
frames=np.linspace(0, 4 * np.pi, 250) 定义了动画的帧数和帧间隔,这里从 0 到 4 * np.pi,共 250 帧。
init_func=lambda: update(0) 定义了动画开始时的初始化函数。
blit=False 表示每次更新都会重绘整个场景。如果设置为 True,可以提高动画的性能,但需要一个合适的环境来支持。
6.显示动画:
代码如下:
plt.show()
分析如下:
使用 plt.show() 显示动画。
三、源代码
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from matplotlib.animation import FuncAnimation
# 初始化图形和3D子图
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
# 准备数据
x = np.linspace(-3.0, 3.0, 100)
y = np.linspace(-3.0, 3.0, 100)
X, Y = np.meshgrid(x, y)
# 更新函数
def update(frame):
# 计算新的Z值,创建波动效果
Z = np.sin(X + frame * 5) * np.cos(Y + frame * 5)
# 清除当前的图形
ax.clear()
# 重新绘制曲面
surf = ax.plot_surface(X, Y, Z, cmap='viridis', rstride=5, cstride=5)
# 设置坐标轴标签
ax.set_xlabel('X axis')
ax.set_ylabel('Y axis')
ax.set_zlabel('Z axis')
# 可以在这里设置其他轴参数,例如轴的范围
ax.set_xlim(-5, 5)
ax.set_ylim(-5, 5)
ax.set_zlim(-5, 5)
return surf,
# 创建动画
ani = FuncAnimation(fig, update, frames=np.linspace(0, 4 * np.pi, 250),
init_func=lambda: update(0), blit=False)
# 显示动画
plt.show()
总结
这段代码通过动态更新三维曲面的 Z 值来模拟波动效果,使用 matplotlib 的动画功能来实现连续的动态展示。