使用pcolormesh时如何设置网格?附2D直方图重叠代码问题
修正pcolormesh与2D直方图重叠网格的问题
我来帮你排查下代码里的问题,主要是两个关键细节没处理对,导致网格显示异常:
问题分析
- histogram2d参数顺序错误:numpy的
histogram2d要求第一个参数是x轴数据,第二个是y轴数据,但你的代码里传成了(y, x),这直接导致直方图的分箱维度和后续网格坐标不匹配。 - 直方图数组维度不匹配pcolormesh要求:
histogram2d返回的直方图数组形状是(x分箱数, y分箱数),但pcolormesh需要的数组形状是(y分箱数, x分箱数)才能对应x和y的边缘坐标。
修正后的代码
import matplotlib.pyplot as plt import numpy as np import random # 生成随机数据 x = [random.randrange(1, 161, 1) for _ in range(10)] y = [random.randrange(1, 121, 1) for _ in range(10)] fig, ax = plt.subplots() ax.set_xlim(0, 160) ax.set_ylim(0, 120) # 正确传入x、y数据,bins参数对应(x方向分箱数, y方向分箱数) hist, x_edges, y_edges = np.histogram2d(x, y, bins=(120, 50)) # 转置直方图数组,匹配pcolormesh的维度要求 hist_transposed = hist.T # 掩蔽0值,隐藏无数据的网格单元 hist_masked = np.ma.masked_equal(hist_transposed, 0) # 绘制网格:直接传入一维的边缘坐标即可 ax.pcolormesh(x_edges, y_edges, hist_masked, edgecolors='black') # 绘制原始散点,加红色区分网格 scat = ax.scatter(x, y, s=2, color='red') plt.show()
关键修正点详解
- 参数顺序修正:
np.histogram2d(x, y, ...)确保x轴数据对应x方向分箱,y轴数据对应y方向分箱,避免坐标错位。 - 数组转置:用
.T转置直方图数组,让其维度从(x分箱数, y分箱数)变为(y分箱数, x分箱数),完美匹配pcolormesh对输入数据的要求。 - 掩蔽0值:保留你原来的掩蔽逻辑,确保没有数据的网格单元不被渲染,让可视化更清晰。你也可以用
hist_transposed[hist_transposed == 0] = np.nan替代掩蔽,matplotlib会自动忽略NaN值,效果一致。 - 散点颜色调整:给散点加了红色,让原始数据点和黑色网格更容易区分,这是可选优化。
内容的提问来源于stack exchange,提问作者user9639519
相关产品推荐
相关产品推荐

