如何修改Python代码实现绕y轴的旋转体动画(Matplotlib)
如何将绕X轴旋转的旋转体动画改为绕Y轴旋转?
我有一段基于Stack Overflow修改的Python代码,原本用来绘制由曲线y=1/(x²+4)、x=1、x=4和y=0围成区域的旋转体动画,但当前是绕X轴旋转,想改成绕Y轴旋转,该怎么操作?原代码如下:
import gif import numpy as np import matplotlib.pyplot as plt import mpl_toolkits.mplot3d.axes3d as axes3d @gif.frame def plot_volume(angle): fig = plt.figure(figsize = (20, 15)) ax2 = fig.add_subplot(1, 1, 1, projection = '3d') angles = np.linspace(0, 360, 20) x = np.linspace(1, 4, 60) v = np.linspace(0, 2*angle, 60) U, V = np.meshgrid(x, v) Y1 = (1 / (U**2 + 4 ))*np.cos(V) Z1 = (1 / (U**2 + 4 ))*np.sin(V) X = U ax2.plot_surface(X, Y1, Z1, alpha = 0.2, color = 'blue', rstride = 6, cstride = 6) ax2.set_xlim(-2,5) ax2.set_ylim(-0.5,0.5) ax2.set_zlim(-1,1) ax2.view_init(elev = 50, azim = 30*angle) ax2.plot_wireframe(X, Y1, Z1, color = 'black') ax2._axis3don = False frames = [] for i in np.linspace(0, 2*np.pi, 20): frame = plot_volume(i) frames.append(frame) gif.save(frames, '/home/browni/LasthrimProjection/Python/solidofrevolution1.gif', duration = 500)
修改后的完整代码
import gif import numpy as np import matplotlib.pyplot as plt import mpl_toolkits.mplot3d.axes3d as axes3d @gif.frame def plot_volume(angle): fig = plt.figure(figsize=(20, 15)) ax2 = fig.add_subplot(1, 1, 1, projection='3d') # 生成原曲线的x取值和旋转角度序列 x = np.linspace(1, 4, 60) v = np.linspace(0, 2*angle, 60) U, V = np.meshgrid(x, v) # 绕Y轴旋转的坐标转换逻辑 Y = 1 / (U**2 + 4) # 原y值固定在Y轴 X = U * np.cos(V) # 原x值在X-Z平面旋转的X分量 Z = U * np.sin(V) # 原x值在X-Z平面旋转的Z分量 ax2.plot_surface(X, Y, Z, alpha=0.2, color='blue', rstride=6, cstride=6) # 调整坐标轴范围以适配绕Y轴旋转后的图形 ax2.set_xlim(-5, 5) ax2.set_ylim(0, 0.25) ax2.set_zlim(-5, 5) ax2.view_init(elev=50, azim=30*angle) ax2.plot_wireframe(X, Y, Z, color='black') ax2._axis3don = False frames = [] for i in np.linspace(0, 2*np.pi, 20): frame = plot_volume(i) frames.append(frame) # 修改文件名避免覆盖原文件 gif.save(frames, '/home/browni/LasthrimProjection/Python/solidofrevolution_y_axis.gif', duration=500)
核心修改说明
- 坐标转换逻辑重构:绕Y轴旋转时,原曲线的y值保持在Y轴不变,而原x值需要在X-Z平面内做圆周运动,所以用三角函数分解为X和Z轴的分量
- 坐标轴范围适配:绕Y轴旋转后,X和Z轴的范围要覆盖原x区间(1-4)的正负两侧,Y轴范围对应原曲线的y值范围(0到0.2),调整后能完整显示旋转体
- 文件名区分:修改输出文件名,方便区分绕X/Y轴的不同结果
内容的提问来源于stack exchange,提问作者Freya the Goddess
相关产品推荐
相关产品推荐

