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

基于列值为多组柱状图设置连续颜色刻度

多组柱状图按额外连续列设置条形颜色

方法一:Matplotlib手动实现

1. 准备示例数据

先构造包含分组、类别、数值、颜色控制列的数据集:

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.colors import Normalize
from matplotlib.cm import ScalarMappable

# 模拟业务数据
data = {
    'group': ['A', 'A', 'A', 'B', 'B', 'B', 'C', 'C', 'C'],
    'category': ['X', 'Y', 'Z', 'X', 'Y', 'Z', 'X', 'Y', 'Z'],
    'value': [10, 15, 8, 12, 9, 14, 7, 11, 13],
    'color_score': [0.2, 0.7, 0.4, 0.9, 0.3, 0.6, 0.1, 0.8, 0.5]  # 控制颜色深浅的连续字段
}
df = pd.DataFrame(data)

2. 配置绘图基础参数

确定分组、类别数量,计算每个条形的轴位置:

groups = df['group'].unique()
categories = df['category'].unique()
n_groups = len(groups)
n_cats = len(categories)
bar_width = 0.25  # 单类别条形宽度
x = np.arange(n_groups)  # 分组的x轴基准位置

3. 建立连续值到颜色的映射

用Normalize把连续的color_score归一化,再绑定颜色映射表:

norm = Normalize(vmin=df['color_score'].min(), vmax=df['color_score'].max())
cmap = plt.get_cmap('viridis')  # 可替换为plasma、coolwarm等配色

4. 绘制带颜色映射的条形图

循环遍历每个类别,为每个条形匹配对应颜色:

fig, ax = plt.subplots(figsize=(10, 6))

for i, cat in enumerate(categories):
    cat_data = df[df['category'] == cat]
    bar_x = x + i * bar_width  # 当前类别条形的x轴位置
    bars = ax.bar(bar_x, cat_data['value'], width=bar_width, label=cat)
    # 为每个条形单独设置颜色
    for bar, score in zip(bars, cat_data['color_score']):
        bar.set_color(cmap(norm(score)))

# 配置轴标签与标题
ax.set_xticks(x + bar_width * (n_cats - 1)/2)
ax.set_xticklabels(groups)
ax.set_xlabel('分组')
ax.set_ylabel('数值')
ax.set_title('多组柱状图(按color_score设置颜色深浅)')
ax.legend()

# 添加颜色刻度条,展示颜色与连续值的对应关系
sm = ScalarMappable(norm=norm, cmap=cmap)
sm.set_array([])
fig.colorbar(sm, ax=ax, label='颜色分数')

plt.tight_layout()
plt.show()

方法二:Seaborn简化实现

利用Seaborn的barplot,结合自定义调色板快速实现:

import seaborn as sns

# 定义颜色映射函数
def get_color(score):
    return cmap(norm(score))

fig, ax = plt.subplots(figsize=(10, 6))
# 直接通过palette参数传入每个条形的颜色
sns.barplot(data=df, x='group', y='value', hue='category', ax=ax, dodge=True, 
            palette=[get_color(s) for s in df['color_score']])

# 添加颜色刻度条
sm = ScalarMappable(norm=norm, cmap=cmap)
sm.set_array([])
fig.colorbar(sm, ax=ax, label='颜色分数')

ax.set_title('Seaborn实现多组柱状图颜色映射')
plt.tight_layout()
plt.show()

关键说明

  • 核心逻辑:将连续数值归一化后,映射到预设的颜色映射表,实现颜色深浅随连续值变化
  • 颜色映射表可根据需求替换,比如coolwarm适合正负对比场景,viridis适合中性渐变场景
  • 颜色刻度条是必要的,能让读者快速理解颜色与数值的对应关系

内容的提问来源于stack exchange,提问作者Clara Marti

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 20:57:20