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

matplotlib动画中linspace生成的点无法正常绘图如何解决

问题现象

使用matplotlib开发动态绘图功能时出现异常:手动输入坐标列表时绘图功能正常,切换为np.linspace生成坐标点时,图表点位空白无法渲染。打印校验确认linspace已正常生成目标数值,但无法在图表中显示。
复现代码如下:

import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation
import numpy as np
%matplotlib qt

fig = plt.figure(figsize=(6,4))
axes = fig.add_subplot(1,1,1)
plt.title("Image That's Moving")

P=np.linspace(1,50,100)
T=np.linspace(1,50,100)

Position =[P]
Time = [T]
p2=[P]
t2=[T]


x,y=[],[]
x2,y2=[],[]


def animate(i):
    x.append(Time[i])
    y.append((Position[i]))
    x2.append(t2[i])
    y2.append((p2[i]))

    plt.xlim(0,100)
    plt.ylim(0,100)
    plt.plot(x,y, color="blue")
    plt.plot(x2,y2, color="red")



anim = FuncAnimation(fig, animate, interval=300)
故障原因
  • 核心问题是对numpy生成的一维数组做了多余的列表包裹:Position = [P]这类写法会把长度为100的numpy数组作为唯一元素,存成长度为1的列表。逐帧执行Time[i]取值时,i=0取到的是整个长度100的数组,i≥1时直接触发索引越界,动画进程中断,这是图表显示空白的核心原因。
  • 未给FuncAnimation显式指定frames参数,组件自动生成的帧序列超出列表索引范围后,会直接抛出错误终止渲染,Qt后端默认不会把错误日志顶到前台,容易误以为是数值生成问题。
  • 逐帧调用plt.plot会重复生成新的线条对象,运行时间稍长就会占用大量资源,也会加剧渲染异常。
修复方案
  • 去掉numpy数组外层多余的方括号包裹,让坐标序列结构和手动输入的标量列表一致:
    Position = P
    Time = T
    p2 = P
    t2 = T
    
  • 给FuncAnimation传入frames参数,明确动画总帧数和坐标点长度匹配,避免索引越界:
    anim = FuncAnimation(fig, animate, frames=len(P), interval=300)
    
  • (可选优化)初始化时提前创建两个线条对象,每帧只更新线条数据,不要重复调用plot,避免内存占用过高。
    优化后完整可运行代码:
    import matplotlib.pyplot as plt
    from matplotlib.animation import FuncAnimation
    import numpy as np
    %matplotlib qt
    
    fig = plt.figure(figsize=(6,4))
    axes = fig.add_subplot(1,1,1)
    plt.title("Image That's Moving")
    plt.xlim(0,100)
    plt.ylim(0,100)
    
    P = np.linspace(1,50,100)
    T = np.linspace(1,50,100)
    # 提前初始化空线条
    line1, = plt.plot([], [], color="blue")
    line2, = plt.plot([], [], color="red")
    
    x,y=[],[]
    x2,y2=[],[]
    
    def animate(i):
        x.append(T[i])
        y.append(P[i])
        x2.append(T[i])
        y2.append(P[i])
        # 仅更新线条数据,不新建plot对象
        line1.set_data(x, y)
        line2.set_data(x2, y2)
        return line1, line2
    
    anim = FuncAnimation(fig, animate, frames=len(P), interval=300, blit=True)
    plt.show()
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 17:45:40