使用Matplotlib和Proplot自定义色条刻度对应指定变量值
问题描述
我通过for循环叠加绘制了一系列直方图,代码如下:
import matplotlib as plt import proplot as pplt cmap = colormap fig = pplt.figure(figsize=(12, 10), dpi=300) jj = [ 4, 3, 2, 1, 0] for j in jj: plt.fill_between(p[:,j], s[:, j], y2=0, alpha = 0.6, color = colormap[:,4-j], edgecolor=[0,0,0], linewidth=1.5)
所使用的色图是手动指定的RGB三元组列表(来自Fabio Crameri的'lajolla'色图):
0.64566 0.823453 0.895061 0.924676 0.957142 0.277907 0.386042 0.526882 0.657688 0.803006 0.259453 0.301045 0.317257 0.331596 0.408285
每种颜色对应不同条件下采集的数据,我希望色条的刻度手动指定为该变量值(如30、35、40、45、50),但目前色图仅使用其矩阵索引(0、1、2、3、4)作为映射变量值,设置超出该范围的刻度无法显示。我尝试过调整色图索引及以下代码:
cbar = fig.colorbar(np.transpose(cmap)) cbar.set_ticks([30, 35, 40, 45, 50]) cbar.set_ticklabels([30, 35, 40, 45, 50])
均未解决问题,现寻求实现色条刻度对应指定数值的方法。
解决方案
核心问题是直接手动给每个填充块指定颜色时,没有建立目标数值(30/35/.../50)和颜色的映射关联,导致修改色条刻度无效。需要创建自定义的ScalarMappable对象绑定数值范围与色图,具体步骤如下:
- 将手动给出的RGB值整理为标准的颜色数组格式
- 基于该数组创建自定义色图
- 用
Normalize指定目标数值范围,结合ScalarMappable建立数值与颜色的映射 - 基于
ScalarMappable生成色条并设置刻度
修改后的完整代码示例:
import matplotlib.pyplot as plt import proplot as pplt import numpy as np from matplotlib.cm import ScalarMappable from matplotlib.colors import ListedColormap # 整理RGB色值:转置后得到5个RGB三元组 rgb_values = np.array([ [0.64566, 0.823453, 0.895061, 0.924676, 0.957142], [0.277907, 0.386042, 0.526882, 0.657688, 0.803006], [0.259453, 0.301045, 0.317257, 0.331596, 0.408285] ]).T # 转置后得到(5,3)的颜色数组,每个元素对应一个RGB颜色 # 创建自定义ListedColormap custom_cmap = ListedColormap(rgb_values) # 替换为你的真实数据 p = np.random.rand(10,5) # 示例x轴数据 s = np.random.rand(10,5)*10 # 示例y轴数据 fig = pplt.figure(figsize=(12, 10), dpi=300) jj = [4,3,2,1,0] target_values = [30,35,40,45,50] # 你需要对应的变量值 # 循环绘图,确保颜色与目标数值顺序对应 for idx, j in enumerate(jj): plt.fill_between(p[:,j], s[:,j], y2=0, alpha=0.6, color=custom_cmap(idx), # 按索引从自定义色图取色 edgecolor=[0,0,0], linewidth=1.5) # 创建ScalarMappable,绑定数值范围与色图 norm = plt.Normalize(min(target_values), max(target_values)) sm = ScalarMappable(norm=norm, cmap=custom_cmap) sm.set_array([]) # 无需绑定具体数据,仅用于生成色条 # 添加色条并设置自定义刻度 cbar = fig.colorbar(sm) cbar.set_ticks(target_values) cbar.set_ticklabels(target_values) plt.show()
关键说明
ListedColormap将手动整理的RGB数组转换为matplotlib可识别的色图对象Normalize指定数值范围为[30,50],让色图颜色与目标数值一一对应ScalarMappable是连接数值与色图的核心载体,没有它色条无法关联自定义数值- 循环中通过
custom_cmap(idx)取色,确保颜色顺序与target_values完全匹配
内容的提问来源于stack exchange,提问作者ajsc4
相关产品推荐
相关产品推荐

