如何根据Trimestre值修改Pandas柱状图的条形颜色?
根据Trimestre值为柱状图条形上色解决方案
没问题!我来帮你实现根据Trimestre值给柱状图条形上色的需求~下面我会结合示例数据,分别用matplotlib和seaborn两种常用绘图库来演示实现方法,你可以根据自己的使用习惯选择。
准备示例数据(对应你的DataFrame结构)
首先我先构造一个和你结构一致的多层索引DataFrame,方便你对应自己的数据:
import pandas as pd import matplotlib.pyplot as plt import seaborn as sns # 构造与你结构匹配的示例数据 data = { 'Cantidad': [12, 18, 9, 15, 11, 16], 'Trimestre': [1, 1, 2, 2, 3, 3], 'Proovedor': ['Proveedor A', 'Proveedor B', 'Proveedor A', 'Proveedor B', 'Proveedor A', 'Proveedor B'], 'Tipo': ['Tipo X', 'Tipo Y', 'Tipo X', 'Tipo Y', 'Tipo X', 'Tipo Y'] } df = pd.DataFrame(data).set_index(['Trimestre', 'Proovedor', 'Tipo'])
方法一:使用Matplotlib实现
步骤1:提取每个条形对应的Trimestre值
因为你的DataFrame是多层索引,我们可以直接从索引的第0层(Trimestre层)提取每个数据行对应的季度值:
# 从多层索引中提取每个条形对应的Trimestre trimestres = df.index.get_level_values('Trimestre')
步骤2:定义季度与颜色的映射关系
你可以根据喜好自定义每个季度对应的颜色:
# 自定义季度-颜色映射字典 color_map = { 1: '#FF5733', # 橙色 2: '#33FF57', # 绿色 3: '#3357FF', # 蓝色 4: '#FF33A6' # 粉色(如果有第4季度) } # 生成每个条形对应的颜色列表 bar_colors = [color_map[t] for t in trimestres] # 可选:如果怕有未定义的季度值,添加默认灰色兜底 # bar_colors = [color_map.get(t, '#CCCCCC') for t in trimestres]
步骤3:绘制带颜色的柱状图
# 创建绘图对象 fig, ax = plt.subplots(figsize=(10, 6)) # 绘制柱状图并指定颜色 bars = ax.bar(df.index, df['Cantidad'], color=bar_colors) # 优化x轴标签(多层索引标签较长,旋转后更易读) ax.set_xticklabels(df.index, rotation=45, ha='right') # 添加自定义图例(展示每个季度对应的颜色) from matplotlib.patches import Patch legend_elements = [Patch(facecolor=color_map[t], label=f'Trimestre {t}') for t in color_map.keys()] ax.legend(handles=legend_elements, loc='upper right') # 添加标题和轴标签 plt.title('Cantidad por Trimestre, Proveedor y Tipo', fontsize=14) plt.ylabel('Cantidad', fontsize=12) plt.tight_layout() plt.show()
方法二:使用Seaborn实现(更简洁)
Seaborn的barplot支持直接用hue参数按列分组上色,我们只需要先把多层索引重置为普通列即可:
# 将多层索引重置为普通列,方便Seaborn调用 df_reset = df.reset_index() # 绘制柱状图,用hue指定按Trimestre分组上色 plt.figure(figsize=(10, 6)) sns.barplot( data=df_reset, x=df_reset.index, # 用行索引作为x轴位置 y='Cantidad', hue='Trimestre', palette=color_map # 复用之前定义的颜色映射 ) # 自定义x轴标签,展示完整的Trimestre-Proovedor-Tipo信息 plt.xticks( ticks=range(len(df_reset)), labels=df_reset.apply(lambda row: f"{row['Trimestre']} | {row['Proovedor']} | {row['Tipo']}", axis=1), rotation=45, ha='right' ) # 添加标题和轴标签 plt.title('Cantidad por Trimestre, Proveedor y Tipo', fontsize=14) plt.ylabel('Cantidad', fontsize=12) plt.tight_layout() plt.show()
这样就能轻松实现按Trimestre值给不同条形上色的效果啦!如果你的季度数量更多,只需要在color_map里添加对应的键值对即可。
内容的提问来源于stack exchange,提问作者CamiloFalla
相关产品推荐
相关产品推荐

