Matplotlib中图形尺寸变化时如何更新QuadMesh?
解决Matplotlib QuadMesh帧尺寸更新问题
问题场景
使用Python 3.x的Matplotlib时,用QuadMesh展示动态变化的帧,帧初始尺寸相同时可正常运行,但切换到不同尺寸的帧时,更新操作报错:
TypeError: Dimensions of A (4, 4) are incompatible with X (4) and/or Y (4)
原代码尝试通过m.update({'axes': [x2, y2]})更新轴信息但未生效,核心问题是没有正确更新QuadMesh的坐标网格数据。
错误原因
QuadMesh的update方法不支持通过axes参数直接修改X/Y坐标网格。pcolormesh生成的QuadMesh对象,其坐标数据存储在_coordinates属性中,仅更新array无法适配新的帧尺寸,必须同步更新坐标网格并调整轴范围。
解决方案
- 针对不同尺寸的帧,重新生成对应的二维坐标网格
- 直接更新QuadMesh的
_coordinates属性替换坐标网格 - 使用
set_array更新数据数组(需将二维数组展平为一维) - 调用
ax.relim()和ax.autoscale_view()调整坐标轴范围,适配新尺寸
修改后的代码
import numpy as np import matplotlib.pyplot as plt from matplotlib.collections import QuadMesh from random import random frame1 = np.array([[1,2,3], [4,5,6], [7,8,9]]) frame2 = np.array([[1,2,3, 9], [4,5,6, 9], [7,8,9, 9], [10,11,12,13]]) # 生成对应帧尺寸的一维坐标,再转为二维网格 x1_1d = np.array([1,2,3]) * random() y1_1d = np.array([1,2,3]) * random() x1, y1 = np.meshgrid(x1_1d, y1_1d) x2_1d = np.array([1,2,3,4]) * random() y2_1d = np.array([1,2,3,4]) * random() x2, y2 = np.meshgrid(x2_1d, y2_1d) index = 0 with plt.style.context("classic"): plt.ion() fig, ax = plt.subplots() m: QuadMesh = ax.pcolormesh(x1, y1, frame1, shading='nearest') fig.colorbar(m) while True: if index <= 25: current_frame = frame1 current_x, current_y = x1, y1 else: current_frame = frame2 current_x, current_y = x2, y2 # 更新数据数组(需展平为一维) m.set_array(current_frame.ravel()) # 更新QuadMesh的坐标网格 m._coordinates = np.stack([current_x, current_y], axis=-1) # 重新计算并适配坐标轴范围 ax.relim() ax.autoscale_view() print(index) index += 1 plt.draw() plt.pause(0.1) # 控制刷新频率,确保画面正常更新
关键说明
- 用
meshgrid生成二维坐标网格,保证和帧数据的维度严格匹配 - 直接修改
_coordinates是更新QuadMesh坐标的有效方式,这是其存储坐标的核心属性 ax.relim()和ax.autoscale_view()确保坐标轴自动适配新的帧尺寸,避免画面偏移- 添加
plt.draw()和plt.pause()解决交互模式下的画面刷新问题
内容的提问来源于stack exchange,提问作者Josh.h
相关产品推荐
相关产品推荐

