如何在matplotlib的pcolormesh中固定颜色条范围?
解决pcolormesh固定颜色条范围的问题
我明白你的困扰:想用pcolormesh绘制极坐标图,固定颜色条范围在[0.0, 0.5],让colormap的最小值对应0.0、最大值对应0.5,但目前颜色没达到预期的最深色(cool colormap的品红色),而且颜色条也没同步显示出来。
问题原因拆解
- 缺少颜色条组件:你的代码里没有添加
colorbar,所以没法直观看到vmin/vmax对应的颜色范围; - 数据范围与设定范围不匹配:你的
values数组最大值只有约0.159,远小于设置的vmax=0.5。pcolormesh会把vmin到vmax之间的数值线性映射到colormap全范围,所以数据最大值只会对应colormap的0.159/0.5 ≈ 32%位置,也就是青色到品红色之间的中间色,自然不会显示出品红色。
解决方案
如果你确实需要固定颜色条范围在[0.0, 0.5](不管数据实际范围),只需要在代码中添加颜色条,并确保它和pcolormesh的归一化规则绑定即可。修改后的代码如下:
import matplotlib.pyplot as plt import numpy as np thetas = np.array([-4.86946861, -4.55530935, -4.24115008, -3.92699082, -3.61283155, -3.29867229, -2.98451302, -2.67035376, -2.35619449, -2.04203522, -1.72787596, -1.41371669, -1.09955743, -0.78539816, -0.4712389, -0.15707963, 0.15707963, 0.4712389, 0.78539816, 1.09955743, 1.41371669]) radii = np.array([[0.], [10.]]) values = np.array([[0.00049802, 0.0008128, 0.00177386, 0.00426617, 0.01010776, 0.02224737, 0.04396539, 0.07626507, 0.11427899, 0.14629945, 0.15897023, 0.14629945, 0.11427899, 0.07626507, 0.04396539, 0.02224737, 0.01010776, 0.00426617, 0.00177386, 0.0008128]]) fig, ax = plt.subplots(1, 1, subplot_kw={'polar':True}) # 绘制pcolormesh并保存返回的QuadMesh对象 mesh = ax.pcolormesh(thetas, radii, values, vmin=0.0, vmax=0.5, cmap='cool') # 添加颜色条,绑定到mesh对象的归一化规则 fig.colorbar(mesh, ax=ax, label='Value') plt.show()
关键说明
- 保存
pcolormesh的返回值(QuadMesh对象),并将其传入fig.colorbar(),这样颜色条会自动同步vmin/vmax的设置; - 如果你的需求是让数据的最大值映射到colormap的品红色(也就是让数据填满
0-0.5的颜色范围),那你需要调整vmax为数据的最大值,或者使用Normalize类手动设置归一化,但这会打破“固定颜色条范围为0-0.5”的需求,需要根据实际场景选择。
内容的提问来源于stack exchange,提问作者python_freak
相关产品推荐
相关产品推荐

