如何按用户自定义区间为直方图配置颜色映射(colormap)
复现带渐变调色板的直方图
解决步骤
生成数据并绘制基础直方图
先调用plt.hist()绘制直方图,同时获取柱子对象、区间边界等核心信息,以均匀分布数据为例:import matplotlib.pyplot as plt import numpy as np # 生成均匀分布模拟数据 data = np.random.uniform(0, 10, 1000) # 绘制直方图,获取频数、区间边界、柱子对象 n, bins, patches = plt.hist(data, bins=10, edgecolor='white')按柱子区间映射渐变颜色
以每个柱子的中心位置为依据,先将其归一化到[0,1]区间,再通过指定色板(如viridis)生成对应颜色,逐个赋值给柱子:# 计算每个柱子的中心坐标 bin_centers = 0.5 * (bins[:-1] + bins[1:]) # 归一化柱子中心值到[0,1],适配色板输入要求 norm = plt.Normalize(bin_centers.min(), bin_centers.max()) # 遍历设置每个柱子的填充色 for center, patch in zip(bin_centers, patches): color = plt.cm.viridis(norm(center)) patch.set_facecolor(color)添加颜色条(可选)
若需要和示例图一致显示颜色对应的数值范围,可添加颜色条:# 创建颜色条对应的映射对象 sm = plt.cm.ScalarMappable(norm=norm, cmap=plt.cm.viridis) sm.set_array([]) plt.colorbar(sm)调整显示细节
补充坐标轴标签、标题后完成绘图:plt.xlabel('数值') plt.ylabel('频数') plt.title('渐变颜色直方图') plt.show()
关键说明
- 之前颜色被限制在[0,1]是因为未对原始数值做归一化处理,上述代码通过
plt.Normalize()将柱子位置值映射到色板要求的[0,1]区间,完美匹配色板输入逻辑。 - 不管是
plt.hist还是sns.histplot,最终生成的都是matplotlib的Patch对象,都可以通过遍历patches(sns需通过ax.patches获取)的方式设置渐变颜色。
内容的提问来源于stack exchange,提问作者RKerr
相关产品推荐
相关产品推荐

