如何用Matplotlib为分组百分比堆叠柱状图添加组间空白?
简便实现分组百分比堆叠柱状图的组间空白分隔
针对你的需求,最简便的方法是在数据中插入空的“占位样本”,让这些占位样本的所有类别数值都为0,这样绘制堆叠柱状图时就会自动出现空白,完美区分不同样本组。下面是具体的实现思路和代码示例:
核心思路
- 在需要分隔的位置(样本B与C之间、样本D与E之间)插入一个空的样本标签(比如空字符串)
- 给这个空样本对应的所有数据列赋值为0,确保堆叠后是空白柱子
- 绘图后可以根据需要调整x轴标签的显示(保留空标签或隐藏都可以,空标签本身就会形成视觉空白)
代码示例(基于Matplotlib + Pandas)
假设你原来的代码是类似这样的百分比堆叠柱状图:
import pandas as pd import matplotlib.pyplot as plt # 原始数据示例 data = pd.DataFrame({ '类别1': [25, 30, 20, 15, 10], '类别2': [35, 30, 40, 45, 50], '类别3': [40, 40, 40, 40, 40] }, index=['样本A', '样本B', '样本C', '样本D', '样本E']) # 绘制原始百分比堆叠柱状图 ax = data.plot(kind='bar', stacked=True) # 设置y轴为百分比格式 ax.set_yticklabels(['{:.0f}%'.format(x) for x in ax.get_yticks()]) plt.title("原始百分比堆叠柱状图") plt.tight_layout() plt.show()
修改后添加组间空白的代码:
import pandas as pd import matplotlib.pyplot as plt # 原始数据 data = pd.DataFrame({ '类别1': [25, 30, 20, 15, 10], '类别2': [35, 30, 40, 45, 50], '类别3': [40, 40, 40, 40, 40] }, index=['样本A', '样本B', '样本C', '样本D', '样本E']) # 1. 构造新的索引,插入空占位符分隔组 new_index = ['样本A', '样本B', '', '样本C', '样本D', '', '样本E'] # 2. 插入全0的占位行,然后按新索引重新排序 data.loc[''] = 0 new_data = data.reindex(new_index) # 3. 绘制带组间空白的百分比堆叠柱状图 ax = new_data.plot(kind='bar', stacked=True) # 设置y轴百分比格式 ax.set_yticklabels(['{:.0f}%'.format(x) for x in ax.get_yticks()]) # 可选:如果不想显示空标签,可以把空字符串替换成空格或者直接隐藏 ax.set_xticklabels([label if label != '' else ' ' for label in new_index]) plt.title("带组间空白的分组百分比堆叠柱状图") plt.tight_layout() plt.show()
为什么这个方法简便?
- 不需要手动调整x轴的刻度位置或间距,完全通过数据结构的小改动实现需求
- 代码改动极小,只需要几行代码插入占位样本,对原有绘图逻辑几乎没有影响
- 视觉效果清晰,空白的占位柱子自然分隔开不同的样本组
内容的提问来源于stack exchange,提问作者user1912925




