pcolormesh绘制非规则间隔数据时bin显示不符合预期
解决pcolormesh非规则间隔数据的色块边界匹配问题
你的问题出在pcolormesh的输入逻辑匹配错误上:这个函数要求x、y边界数组的长度必须比对应数据维度多1——因为x/y数组定义的是色块的边界,而数据数组的每个值对应一个由相邻边界围成的矩形色块。你的代码里边界长度和数据维度完全不匹配,导致绘图混乱。
问题拆解
你提供的:
- x边界数组
[20,30,40](长度3),对应数据列数应该是3-1=2,但你的数据有3列; - y边界数组
[1,2,5,6,12,13](长度6),对应数据行数应该是6-1=5,但你的数据有6行;
这种维度不匹配直接导致色块的位置和你预期的完全不符。
修正方案
按照你的预期,我们需要让每个数据行对应一个y区间(比如[1,2]、[2,5]等),每个数据列对应一个x区间。调整边界数组长度,使其满足边界数=数据维度+1即可:
import matplotlib.pyplot as plt import numpy as np cmap = plt.cm.jet fig, ax = plt.subplots(figsize=(10,8)) # 修正边界:y边界增加一个结束值(比如14),对应6行数据的6个y区间 y_bounds = [1, 2, 5, 6, 12, 13, 14] # 若要对应3列数据,x边界需要4个值(这里按你预期的标签扩展一个结束值50) x_bounds = [20, 30, 40, 50] cax = ax.pcolormesh(x_bounds, y_bounds, np.array([[1,2,5], # 对应y区间1-2 [0,2,0], # 对应y区间2-5 [1,2,3], # 对应y区间5-6 [2,2,0], # 对应y区间6-12 [3,2,3], # 对应y区间12-13 [4,2,0]]), # 对应y区间13-14 cmap=cmap, alpha=1) # 设置x轴标签为你需要的原始标签 ax.set_xticks([20,30,40]) # 设置y轴标签为所有边界值,清晰展示区间 ax.set_yticks(y_bounds) cbar = fig.colorbar(cax) cbar.ax.tick_params(labelsize=12) plt.show()
额外调整(可选)
如果希望x标签对应色块的中心位置(更贴合“x数据代表标签”的描述),可以把x边界改成[15,25,35,45],这样每个色块的中心正好是20、30、40,再设置ax.set_xticks([20,30,40])即可。
内容的提问来源于stack exchange,提问作者earnric
相关产品推荐
相关产品推荐

