求助:无法用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
相关产品推荐
相关产品推荐

