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

如何在matplotlib中更新已创建的PolyCollection实现重绘

问题原因

你调用set_verts时传入的参数格式不符合要求,fill_between返回的PolyCollection对应的填充区域是闭合多边形,需要传入按顺序排列的闭合顶点坐标,而非直接传入x、y数组。另外原代码中plt.subplots(1,1)生成的是单个坐标轴,直接解包为(ax,ax2)会触发解包错误,首先需要修正这个问题。

正确实现代码

import matplotlib.pyplot as plt
import numpy as np

x = np.arange(0.0, 2, 0.01)
y = np.sin(2*np.pi*x)

# 修正子图解包错误,1行1列只返回1个ax对象
fig, ax = plt.subplots(1,1)
# 打开交互模式方便动画渲染,也可自行添加plt.pause控制刷新间隔
plt.ion()

polycollection = ax.fill_between(x, y)
# 固定坐标轴范围避免画面跳动
ax.set_ylim(-1.3, 1.3)
ax.set_xlim(0, 2)

for i in range(1, 11):
    y_new = 1.2 * np.sin(i * np.pi * x)
    # 构造闭合顶点:先按x正序走下边界(默认y=0),再按x倒序走上边界(新y值),形成闭合区域
    # 所有顶点拼成(n,2)格式的数组,n为顶点总数
    verts = np.vstack([np.column_stack([x, np.zeros_like(x)]),
                       np.column_stack([x[::-1], y_new[::-1]])])
    # 更新顶点,set_verts接收的是列表,每个元素对应一个多边形的顶点数组
    polycollection.set_verts([verts])
    fig.canvas.draw()
    fig.canvas.flush_events()
    # 可选添加0.2秒暂停方便观察动画效果
    plt.pause(0.2)

plt.ioff()
plt.show()

关键逻辑说明

  • 填充区域的顶点需要按顺序拼接:默认fill_between(x,y)的填充范围是y=0到y,所以顶点顺序是从x最小值到最大值、y取0的所有点,接着从x最大值倒回最小值、y取新计算的y值的所有点,形成闭合多边形
  • set_verts的入参是列表,列表的每个元素对应PolyCollection中单个多边形的(N,2)形状的顶点坐标数组,这里只有一个填充区域,所以传[verts]即可

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 15:27:04