You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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对象绑定数值范围与色图,具体步骤如下:

  1. 将手动给出的RGB值整理为标准的颜色数组格式
  2. 基于该数组创建自定义色图
  3. 用Normalize指定目标数值范围,结合ScalarMappable建立数值与颜色的映射
  4. 基于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 07:15:44