You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修改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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 00:25:17