如何使用Seaborn为[Samples, X_Range]格式的纯矩阵绘制误差带?
问题根源
你直接传入shape为[样本数, x值数量]的数组/宽表DataFrame时,Seaborn的lineplot会默认将每一列识别为独立的待绘制序列,而非同一个x下的多个观测值,因此不会做聚合计算,只会逐个绘制列对应的曲线,和你要的效果完全相反。你参考的fmri数据集是标准长表格式:每一行对应单次观测,单独的列存储x值、y值,所以Seaborn可以正确识别相同x的所有观测并聚合生成误差带。
解决方法
只需要将你的宽表数据转换为Seaborn支持的长表格式即可,无需提前手动计算标准差或置信区间,Seaborn会自动完成聚合计算。
完整修改代码
import numpy as np import seaborn as sns from matplotlib import pyplot as plt import pandas as pd np.random.seed(22) sns.set(color_codes=True) num_x: int = 10 rep_per_x: int = 5 x = np.linspace(start=0.0, stop=1.0, num=num_x) noise_uniform: np.ndarray = np.random.rand(rep_per_x, num_x) noise_normal: np.ndarray = np.random.randn(rep_per_x, 1) sin_signal: np.ndarray = np.sin(x) data: np.ndarray = sin_signal + noise_uniform + noise_normal # 核心修改:宽表转长表 # 先生成宽表,列名为对应x值 df_wide = pd.DataFrame(data, columns=x) # 转换为长表:每行对应一次观测,两列分别存储x值和对应的观测y df_long = df_wide.melt(var_name='x', value_name='y') # 画图,自动聚合生成误差带 ax = sns.lineplot(data=df_long, x='x', y='y', err_style='band', ci='sd') plt.show()
多曲线拓展(支持多条曲线各自带误差带)
如果你有多组数据矩阵需要绘制多条曲线,只需要在长表中添加分组列,使用hue参数区分即可:
# 示例:生成第二组数据 data2: np.ndarray = np.cos(x) + noise_uniform + noise_normal df_wide2 = pd.DataFrame(data2, columns=x) df_long2 = df_wide2.melt(var_name='x', value_name='y') # 添加分组标识 df_long['group'] = 'sin曲线' df_long2['group'] = 'cos曲线' # 合并两个长表 df_all = pd.concat([df_long, df_long2], axis=0) # 画图,两条曲线各自带误差带 ax = sns.lineplot(data=df_all, x='x', y='y', hue='group', err_style='band', ci='sd') plt.show()
内容的提问来源于stack exchange,提问作者Charlie Parker
相关产品推荐
相关产品推荐

