如何为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
相关产品推荐
相关产品推荐

