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

使用matplotlib绘制周转圆时代码无法正常运行问题求助

代码问题分析
  • 循环内每次都调用plt.figure()和plt.subplots()新建画布,导致每个圆被绘制在独立窗口,无法叠加出周转圆效果
  • plt.Circle()的圆心参数要求传入标量坐标,但原代码中prevx/prevy会被赋值为数组类型(因为theta是数组,三角函数计算输出为数组),参数类型不匹配会报错
  • phaseList的相位值用的是角度单位,但numpy的np.cos()/np.sin()接收弧度值作为输入,相位计算错误
  • 没有绘制最终的周转圆轨迹曲线,只有圆的轮廓
修正后可运行代码
import matplotlib.pyplot as plt
import numpy as np

freqList = [1,2,3]
ampList = [1,2,4]
# 相位统一转为弧度单位
phaseList = np.deg2rad([0,10,20])

# 提前创建唯一画布与坐标轴
fig, ax = plt.subplots()
circles = []
# 初始化总轨迹坐标数组
total_x = np.zeros(150)
total_y = np.zeros(150)
# 当前周转圆的圆心标量坐标,初始在原点
current_center_x = 0
current_center_y = 0

theta = np.linspace(0, 2*np.pi, 150)

for i in range(len(freqList)):
    # 绘制当前层级周转圆
    circle = plt.Circle((current_center_x, current_center_y), ampList[i], fill=False)
    ax.add_patch(circle)
    # 计算当前圆周运动的偏移量
    offset_x = ampList[i] * np.cos(theta * freqList[i] + phaseList[i])
    offset_y = ampList[i] * np.sin(theta * freqList[i] + phaseList[i])
    # 累加到总轨迹中
    total_x += offset_x
    total_y += offset_y
    # 更新下一层周转圆的圆心,取初始时刻的端点即可
    current_center_x += offset_x[0]
    current_center_y += offset_y[0]

# 绘制最终的合运动轨迹
ax.plot(total_x, total_y, c='r')
plt.axis("equal")
plt.xlim(-10, 10)
plt.ylim(-10, 10)
plt.show()
逻辑说明
  • 所有图形元素都绘制在同一个坐标系下,保证周转圆的层级叠加效果
  • 单独维护周转圆的圆心标量值,避免参数类型不匹配报错
  • 相位单位统一转换为弧度,保证三角函数计算结果正确
  • 累加每个圆周运动的偏移值得到最终的合运动轨迹,完整呈现周转圆效果

内容的提问来源于stack exchange,提问作者vito

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 10:06:03