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

Matplotlib摆线动画生成异常:白色方块遮挡内容求助

解决Matplotlib摆线动画出现白色方块遮挡的问题

你的代码里**重复调用plt.axes()**是导致白色方块遮挡的核心原因——每次调用这个函数都会创建一个新的坐标轴实例,叠加在原有画布上,最终导致动画内容被多层坐标轴遮挡。

修复方案:

  • 提前创建并复用同一个坐标轴对象,避免重复生成新坐标轴
  • 所有绘图、坐标轴设置都基于这个唯一的坐标轴来操作

修正后的完整代码:

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

plt.rcParams['animation.html'] = 'html5'
R = 1

def circle(a, b, r):
    # (a,b): 圆心坐标
    # r: 圆半径
    # T: 分段数
    T = 100
    x, y = [0]*T, [0]*T
    for i,theta in enumerate(np.linspace(0,2*np.pi,T)):
        x[i] = a + r*np.cos(theta)
        y[i] = b + r*np.sin(theta)
    return x, y

# 计算摆线轨迹
thetas = np.linspace(0,4*np.pi,100)
cycloid_x = R*(thetas-np.sin(thetas))
cycloid_y = R*(1-np.cos(thetas))
cycloid_c = R*thetas

fig, ax = plt.subplots()  # 提前创建画布和唯一坐标轴
trans = ax.transAxes  # 使用这个坐标轴的变换

lns = []
for i in range(len(thetas)):
    x,y = circle(cycloid_c[i], R, R)
    ln1, = ax.plot(x, y, 'g-', lw=2)
    ln2, = ax.plot(cycloid_x[:i+1] ,cycloid_y[:i+1], 'r-', lw=2)
    ln3, = ax.plot(cycloid_x[i], cycloid_y[i], 'bo', markersize=4)
    ln4, = ax.plot([cycloid_c[i], cycloid_x[i]], [R,cycloid_y[i]], 'y-', lw=2)
    tx1  = ax.text(0.05, 0.8, r'$\theta$ = %.2f $\pi$' % (thetas[i]/np.pi), transform=trans)
    lns.append([ln1,ln2,ln3,ln4,tx1])

# 所有坐标轴设置都用ax对象操作
ax.set_xlim(0,15)
ax.set_ylim(0,3)
ax.set_xlabel('x')
ax.set_ylabel('y')
ax.grid()
ax.set_aspect('equal')

ani = animation.ArtistAnimation(fig, lns, interval=50)
ani.save('cycloid_ArtistAnimation.gif',writer='pillow')
ani

关键修改点:

  1. 用fig, ax = plt.subplots()替代反复调用plt.axes(),确保整个动画只用一个坐标轴
  2. 所有绘图(ax.plot、ax.text)和设置(ax.set_xlim、ax.grid等)都基于ax对象执行,不再使用全局的plt.xxx方法
  3. 文本变换trans改为使用ax.transAxes,确保文本在正确的坐标轴范围内显示

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 12:05:20