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

如何为pandas DataFrame绘制按值映射颜色、条块宽度固定的水平堆叠条形图

问题1:颜色映射需求实现方法

你可以预先定义数值到颜色的映射表,将原始DataFrame的数值全部替换为对应颜色后,传入绘图的color参数即可,参考代码:

import pandas as pd
import random
import matplotlib.pyplot as plt

# 原始数据生成代码
row1 = [random.randint(0,2) for i in range(10)]
row2 = [random.randint(0,2) for i in range(10)]
df = pd.DataFrame([{i:row1[i] for i in range(10)}, {i:row2[i] for i in range(10)}])
# 更简洁的全1辅助DataFrame写法
df2 = pd.DataFrame(1, index=df.index, columns=df.columns)

# 定义数值到颜色的映射
color_map = {0: 'gray', 1: 'blue', 2: 'red'}
# 生成每个色块对应的颜色列表
plot_colors = df.apply(lambda x: x.map(color_map)).values.tolist()

# 绘图
df2.plot(kind='barh', stacked=True, legend=False, color=plot_colors)
plt.show()

问题2:更优的生成方法

不用手动生成全1辅助DataFrame,直接使用seaborn.heatmap绘制离散热图是更简洁的方案,天然满足每个块等大的需求,代码更短、可配置性更高:

import seaborn as sns

sns.heatmap(df,
            cmap=['gray', 'blue', 'red'], # 对应0/1/2的颜色
            cbar=False, # 隐藏右侧色条
            yticklabels=True,
            xticklabels=True)
plt.show()

问题3:图表的专门名称

这类等大离散色块展示数值的图表最常用的名称是分类热图(Categorical Heatmap),也可称为瓷砖图(Tile Plot),如果是用于展示序列状态,也会被叫做状态序列图。

问题4:使用色阶映射数值的实现

完全支持。如果使用热图方案,直接将cmap参数替换为连续色带名称即可(比如cmap='viridis'、cmap='RdYlBu_r'),工具会自动将0-2的数值映射到色带上的对应颜色;如果使用堆叠条形图方案,可以借助matplotlib.colors.Normalize和连续色带对象,将数值映射为对应色阶颜色后再传入绘图参数。

问题5:给色块加边框的实现

两种绘图方案都可以轻松实现:

  • 堆叠条形图方案:绘图时增加edgecolor='black', linewidth=1参数即可给每个色块添加黑色边框
  • 热图方案:增加linewidths=1, linecolor='black'参数即可实现边框效果,相邻同色色块会被边框明显区分开

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 17:15:03