You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何用Matplotlib为分组百分比堆叠柱状图添加组间空白?

简便实现分组百分比堆叠柱状图的组间空白分隔

针对你的需求,最简便的方法是在数据中插入空的“占位样本”,让这些占位样本的所有类别数值都为0,这样绘制堆叠柱状图时就会自动出现空白,完美区分不同样本组。下面是具体的实现思路和代码示例:

核心思路

  1. 在需要分隔的位置(样本B与C之间、样本D与E之间)插入一个空的样本标签(比如空字符串)
  2. 给这个空样本对应的所有数据列赋值为0,确保堆叠后是空白柱子
  3. 绘图后可以根据需要调整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

火山引擎 最新活动