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
关键修改点:
- 用
fig, ax = plt.subplots()替代反复调用plt.axes(),确保整个动画只用一个坐标轴 - 所有绘图(
ax.plot、ax.text)和设置(ax.set_xlim、ax.grid等)都基于ax对象执行,不再使用全局的plt.xxx方法 - 文本变换
trans改为使用ax.transAxes,确保文本在正确的坐标轴范围内显示
内容的提问来源于stack exchange,提问作者butter3
相关产品推荐
相关产品推荐

