如何用Pandas定位三个堆叠柱状图及解决两类相关问题
解决堆叠柱状图重叠与重复图例问题
我来帮你搞定这两个可视化的问题,咱们一步步拆解:
问题1:解决堆叠柱状图重叠问题
你之前用position参数没生效的原因是,每个df.plot()生成的柱状图默认绑定原DataFrame的x轴索引(0-3),单纯设置position值会让三组柱子挤在同一个x刻度位置上。除了缩小柱宽,更合理的方案是手动指定每组柱子的x坐标,通过偏移量让它们在x轴上依次排列:
- 先定义基础x坐标:
x = np.arange(len(df))(对应4个数据行) - 给每个堆叠柱组设置不同的偏移量,比如
0、0.25、0.5 - 配合合适的柱宽(比如
0.2),让三组柱子刚好相邻不重叠
问题2:生成唯一类别的图例
因为三个堆叠图都包含B、C、D这几个公共类别,默认图例会重复显示它们。我们可以先创建一个清晰的类别-颜色映射字典,把6个类别对应的颜色统一管理,然后基于这个字典手动创建图例,就能得到只包含唯一类别的图例了。
修改后的完整代码
import matplotlib.pyplot as plt import numpy as np import pandas as pd # 生成数据(和你的DataFrame一致) df = pd.DataFrame(abs(np.random.randn(4, 6)), columns=list('ABCDEF')) # 定义每个类别的颜色映射(统一管理,避免重复) color_map = { 'A': '#a50f15', 'B': '#9ecae1', 'C': '#6baed6', 'D': '#3182bd', 'E': '#fb6a4a', 'F': '#fcbba1' } # 基础x坐标,对应4个数据行 x = np.arange(len(df)) # 每组柱子的宽度和偏移量 bar_width = 0.2 offsets = [0, bar_width, bar_width*2] fig, ax = plt.subplots(figsize=(8,6)) # 绘制第一组堆叠柱:A+B+C+D df[['A', 'B', 'C', 'D']].plot( ax=ax, kind='bar', stacked=True, width=bar_width, color=[color_map['A'], color_map['B'], color_map['C'], color_map['D']] ) # 绘制第二组堆叠柱:E+B+C+D df[['E', 'B', 'C', 'D']].plot( ax=ax, kind='bar', stacked=True, width=bar_width, color=[color_map['E'], color_map['B'], color_map['C'], color_map['D']], position=offsets[1] ) # 绘制第三组堆叠柱:F+B+C+D df[['F', 'B', 'C', 'D']].plot( ax=ax, kind='bar', stacked=True, width=bar_width, color=[color_map['F'], color_map['B'], color_map['C'], color_map['D']], position=offsets[2] ) # 手动创建唯一图例 handles = [plt.Rectangle((0,0),1,1, color=color_map[cat]) for cat in color_map.keys()] ax.legend(handles, color_map.keys(), ncol=3, title='Categories') # 设置x轴标签(让x轴刻度更居中清晰) ax.set_xticks(x + bar_width) ax.set_xticklabels(df.index) plt.tight_layout() plt.show()
关键改动说明
- x轴坐标调整:通过
offsets数组给每组柱子设置不同的偏移,配合bar_width,让三组柱子在x轴上有序排列,彻底解决重叠问题。 - 颜色映射字典:统一管理所有类别的颜色,既保证公共类别(B/C/D)的颜色在三组图中一致,也方便后续创建唯一图例。
- 手动创建图例:基于
color_map生成自定义的图例手柄(handles),只显示6个唯一类别,避免重复。
内容的提问来源于stack exchange,提问作者Leonardo
相关产品推荐
相关产品推荐

