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

如何使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 11:15:05