您可以将四分位距绘制为 seaborn 线图上的误差带吗?

Posted

技术标签:

【中文标题】您可以将四分位距绘制为 seaborn 线图上的误差带吗?【英文标题】:Can you plot interquartile range as the error band on a seaborn lineplot? 【发布时间】:2020-09-05 09:04:05 【问题描述】:

我正在使用 seaborn lineplot (https://seaborn.pydata.org/generated/seaborn.lineplot.html) 绘制时间序列数据,并绘制中位数而不是平均值。示例代码:

import seaborn as sns; sns.set()
import matplotlib.pyplot as plt

fmri = sns.load_dataset("fmri")
ax = sns.lineplot(x="timepoint", y="signal", estimator = np.median, data=fmri)

我希望误差带显示四分位数范围,而不是置信区间。我知道我可以使用ci = "sd" 作为标准差,但是有没有一种简单的方法可以添加 IQR?我想不通。

谢谢!

【问题讨论】:

我不认为你可以通过lineplot 做到这一点。您可能必须自己计算并使用 matplotlib 将其绘制到绘图上 【参考方案1】:

我不知道这是否可以单独使用 seaborn 完成,但这里有一种使用 matplotlib 的方法,保持 seaborn 风格。 describe() 方法方便地为 DataFrame 提供汇总统计信息,其中包括四分位数,我们可以使用它来绘制具有四分位数间距的中位数。

import seaborn as sns; sns.set()
import matplotlib.pyplot as plt

fmri = sns.load_dataset("fmri")
fmri_stats = fmri.groupby(['timepoint']).describe()

x = fmri_stats.index
medians = fmri_stats[('signal', '50%')]
medians.name = 'signal'
quartiles1 = fmri_stats[('signal', '25%')]
quartiles3 = fmri_stats[('signal', '75%')]

ax = sns.lineplot(x, medians) 
ax.fill_between(x, quartiles1, quartiles3, alpha=0.3); 

【讨论】:

谢谢@Arne,这太棒了!【参考方案2】:

您可以像以前一样计算线图中的中位数,将 ci 设置为 none 并使用ax.fill_between() 填写

import numpy as np
import seaborn as sns; sns.set()
import matplotlib.pyplot as plt

fmri = sns.load_dataset("fmri")
ax = sns.lineplot(x="timepoint", y="signal", estimator = np.median, 
                  data=fmri,ci=None)

bounds = fmri.groupby('timepoint')['signal'].quantile((0.25,0.75)).unstack()
ax.fill_between(x=bounds.index,y1=bounds.iloc[:,0],y2=bounds.iloc[:,1],alpha=0.1)

【讨论】:

这太好了,谢谢!我不确定我是否应该接受你的答案或@Arne 的答案,因为它们相似?

以上是关于您可以将四分位距绘制为 seaborn 线图上的误差带吗?的主要内容,如果未能解决你的问题,请参考以下文章

数据分析分位距

python numpy求四分位距

箱型图

箱型图

R语言箱线图(boxplot)四分位算法

箱线图(Box Plot)理论篇