如何基于数值为Pandas多列条形图的每个柱子设置不同颜色
分组条形图按值自定义颜色实现方案
核心思路
pandas调用plot()方法生成条形图后,所有柱子对象都会存储在返回的Axes对象的patches属性中,只需遍历所有柱子,根据柱子高度(即对应销售额数值)判断修改填充色即可,无需单独适配多列逻辑,支持任意列数的数据集。
完整实现代码
步骤1:导入依赖与构造示例数据
import pandas as pd import matplotlib.pyplot as plt # 构造示例数据:行为地区,列为季度,可替换为你的14列DataFrame data = { "Q1": [52000, 63000, 48000, 71000], "Q2": [58000, 59000, 65000, 49000], "Q3": [61000, 47000, 72000, 56000], "Q4": [75000, 62000, 54000, 68000] } df = pd.DataFrame(data, index=["华东", "华北", "华南", "西南"])
步骤2:绘图与颜色修改
# 生成分组条形图,拿到Axes对象 ax = df.plot(kind="bar", figsize=(10, 6), edgecolor="black") threshold = 60000 # 销售额阈值:高于6万标红 # 遍历所有柱子修改颜色 for patch in ax.patches: sale_value = patch.get_height() if sale_value > threshold: patch.set_facecolor("red") else: patch.set_facecolor("#1f77b4") # 基础蓝色,可替换为其他蓝色系色值 # 图表样式优化 plt.title("各地区季度销售额统计", fontsize=12) plt.xlabel("地区", fontsize=10) plt.ylabel("销售额(元)", fontsize=10) plt.xticks(rotation=0) plt.legend(title="季度") plt.tight_layout() plt.show()
扩展:蓝色系渐变效果
如果需要低于阈值的柱子按数值高低显示深浅不同的蓝色,可引入matplotlib的颜色映射实现:
from matplotlib.colors import Normalize from matplotlib.cm import Blues ax = df.plot(kind="bar", figsize=(10, 6), edgecolor="black") threshold = 60000 # 归一化低于阈值的数值范围,映射蓝色系 norm = Normalize(vmin=df.min().min(), vmax=threshold) cmap = Blues for patch in ax.patches: sale_value = patch.get_height() if sale_value > threshold: patch.set_facecolor("red") else: patch.set_facecolor(cmap(norm(sale_value))) # 其余样式优化代码同上
内容的提问来源于stack exchange,提问作者SRA
相关产品推荐
相关产品推荐

