如何在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
相关产品推荐
相关产品推荐

