如何使用二维数组正确绘制seaborn barplot柱状图
错误原因
你的代码存在两个核心问题,直接触发一维数组输入报错:
- 数组切片逻辑错误:
x= peaks_width[0,:]取的是二维数组第一行的2个数值,而y= peaks_width[:,0]取的是第一列共80个初始峰宽值,两个数组长度完全不匹配 - 数据格式不符合seaborn.barplot的输入要求:你当前存储的是宽表结构(每行对应一个样本,两列分别存初始、最终峰宽),seaborn的分组柱状图要求输入长表结构,不能直接传入两个不匹配的切片调用绘图。
正确实现方法
首先确保已经导入依赖库,再根据绘图需求选择对应代码:
场景1:绘制两组峰宽的整体统计柱状图(展示均值+误差棒)
这是barplot最常用的场景,直接对比初始、最终读取的峰宽整体差异:
import seaborn as sns import pandas as pd import numpy as np import matplotlib.pyplot as plt # 转换为seaborn兼容的长表结构 df = pd.DataFrame({ "测量阶段": ["初始读取"] * len(peaks_width) + ["最终读取"] * len(peaks_width), "峰宽值": np.concatenate([peaks_width[:, 0], peaks_width[:, 1]]) }) # 绘图 ax = sns.barplot(data=df, x="测量阶段", y="峰宽值") plt.show()
场景2:绘制每个样本对应的初始/最终峰宽对比柱状图
x轴为样本编号,每个样本对应两个柱子区分测量阶段:
import seaborn as sns import pandas as pd import numpy as np import matplotlib.pyplot as plt # 生成长表 sample_ids = np.arange(len(peaks_width)) df = pd.DataFrame({ "样本编号": np.tile(sample_ids, 2), "测量阶段": ["初始读取"] * len(peaks_width) + ["最终读取"] * len(peaks_width), "峰宽值": np.concatenate([peaks_width[:, 0], peaks_width[:, 1]]) }) # 绘图,样本数量多可旋转x轴标签避免重叠 ax = sns.barplot(data=df, x="样本编号", y="峰宽值", hue="测量阶段") plt.xticks(rotation=90) plt.show()
注:新版seaborn已经不推荐直接传入x、y位置参数不指定数据源的写法,优先传入结构化的DataFrame作为
data参数,再指定x、y对应的列名,可以避免90%以上的输入格式报错。
内容的提问来源于stack exchange,提问作者Sheryl Sanchez
相关产品推荐
相关产品推荐

