基于列值为多组柱状图设置连续颜色刻度
多组柱状图按额外连续列设置条形颜色
方法一: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
相关产品推荐
相关产品推荐

