You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助:无法用Matplotlib绘制样本细菌群落组成堆叠柱状图

解决堆叠柱状图绘制错误的问题

问题原因

你当前的代码逻辑完全搞反了堆叠柱状图的维度:

  • 错误地将细菌名称设为x轴类别,导致每个细菌对应一组堆叠的样本数据,这和你要展示「每个样本的细菌群落组成」的需求完全不符。
  • 正确逻辑应为:每个样本作为x轴的一个柱子,每个柱子内部堆叠不同细菌的丰度。

修正方案

方法1:使用Pandas内置方法(最简单高效)

Pandas的DataFrame自带堆叠柱状图绘制能力,无需手动计算堆叠位置,代码简洁易维护:

import matplotlib.pyplot as plt
import pandas as pd

# 读取数据集(替换为你的数据文件路径或已加载的DataFrame)
df = pd.read_csv("你的数据文件.csv")
# 将细菌名称设为索引,方便后续转置绘图
df.set_index('#Classification', inplace=True)

# 转置DataFrame,让样本成为x轴类别,细菌作为堆叠项
ax = df.T.plot(kind='bar', stacked=True, figsize=(12, 8))

# 配置图表标签与标题
ax.set_xlabel('样本')
ax.set_ylabel('丰度(%)')
ax.set_title('各样本的细菌群落组成')
# 将图例移至图表外侧,避免遮挡数据
ax.legend(bbox_to_anchor=(1.05, 1), loc='upper left')

plt.tight_layout()
plt.show()

方法2:手动用Matplotlib实现(更灵活可控)

如果需要自定义绘图细节,可以手动控制x轴位置与堆叠逻辑:

import matplotlib.pyplot as plt
import pandas as pd

df = pd.read_csv("你的数据文件.csv")
samples = df.columns[1:]
bacteria_list = df['#Classification']
# 设置x轴位置(对应每个样本)
x_pos = range(len(samples))
# 初始化堆叠基准值为0
bottom_values = [0] * len(samples)

fig, ax = plt.subplots(figsize=(12, 8))
# 循环每个细菌,绘制其在各样本中的丰度并堆叠
for idx, bac_name in enumerate(bacteria_list):
    bac_abundances = df.loc[idx, samples].values
    ax.bar(x_pos, bac_abundances, bottom=bottom_values, label=bac_name)
    # 更新堆叠基准值,为下一个细菌的绘制做准备
    bottom_values = [b + a for b, a in zip(bottom_values, bac_abundances)]

# 配置x轴刻度为样本名称
ax.set_xticks(x_pos)
ax.set_xticklabels(samples)
# 配置标签与标题
ax.set_xlabel('样本')
ax.set_ylabel('丰度(%)')
ax.set_title('各样本的细菌群落组成')
ax.legend(bbox_to_anchor=(1.05, 1), loc='upper left')

plt.tight_layout()
plt.show()

优化建议

你提供的数据中大部分细菌丰度极低,绘制后会被高丰度细菌(如S37样本中占比20%+的Actinomyces)完全覆盖,建议先过滤低丰度细菌提升图表可读性:

# 过滤掉所有样本中丰度均低于0.1%的细菌
filtered_df = df[(df[samples] >= 0.1).any(axis=1)]
# 后续用filtered_df替代原df进行绘图即可

内容的提问来源于stack exchange,提问作者Miri J

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 00:48:19