Mr.*_*ysl 4 data-visualization matplotlib seaborn
我seaborn.lineplot
用来生成一些时间序列图。我在两个列表中预先计算了一种特定类型的误差线,例如upper=[1,2,3,4,5] lower=[0,1,2,3,4]
. 有没有办法在这里自定义误差线,而不是在 中使用 CI 或 Std 误差线lineplot
?
我能够通过调用fill_between
自身返回的轴来实现这一点lineplot
:
from seaborn import lineplot
ax = lineplot(data=dataset, x=dataset.index, y="mean", ci=None)
ax.fill_between(dataset.index, dataset.lower, dataset.upper, alpha=0.2)
Run Code Online (Sandbox Code Playgroud)
结果图像:
作为参考,dataset
是 apandas.DataFrame
并且看起来像:
lower mean upper
timestamp
2022-01-14 12:00:00 55.575585 62.264151 68.516173
2022-01-14 12:20:00 50.258980 57.368421 64.185814
2022-01-14 12:40:00 49.839738 55.162242 60.369063
Run Code Online (Sandbox Code Playgroud)
如果您想要提供的错误带/条以外的错误带/条seaborn.lineplot
,则必须自己绘制它们。以下是如何在 matplotlib 中绘制误差带和误差条并获得与 seaborn 中的图相似的图的几个示例。它们是使用fmri样本数据集作为熊猫数据框导入的,并且基于 seaborn 文档中关于lineplot 函数的示例之一。
import numpy as np # v 1.19.2
import pandas as pd # v 1.1.3
import matplotlib.pyplot as plt # v 3.3.2
import seaborn as sns # v 0.11.0
# Import dataset as a pandas dataframe
df = sns.load_dataset('fmri')
# display(df.head(3))
subject timepoint event region signal
0 s13 18 stim parietal -0.017552
1 s5 14 stim parietal -0.080883
2 s12 18 stim parietal -0.081033
Run Code Online (Sandbox Code Playgroud)
该数据集包含一个称为时间点的时间变量,在 19 个时间点的每个时间点对信号进行56 次测量。我使用默认的估计量,即平均值。为了简单起见,我没有使用平均值的标准误差的置信区间作为不确定性的度量(又名误差),而是使用每个时间点的测量值的标准偏差。这在设置lineplot
通过传递ci='sd'
,错误延伸到一个标准偏差对平均值的每一侧(即是对称的)。以下是带有误差带的 seaborn 线图(默认情况下):
# Draw seaborn lineplot with error band based on the standard deviation
fig, ax = plt.subplots(figsize=(9,5))
sns.lineplot(data=df, x="timepoint", y="signal", ci='sd')
sns.despine()
plt.show()
Run Code Online (Sandbox Code Playgroud)
现在让我们说我更喜欢有一个误差带,它跨越平均值每一侧每个时间点测量值的一半标准偏差。由于在调用lineplot
函数时无法设置此首选项,据我所知,最简单的解决方案是使用 matplotlib 从头开始创建绘图。
# Matplotlib plot with custom error band
# Define variables to plot
y_mean = df.groupby('timepoint').mean()['signal']
x = y_mean.index
# Compute upper and lower bounds using chosen uncertainty measure: here
# it is a fraction of the standard deviation of measurements at each
# time point based on the unbiased sample variance
y_std = df.groupby('timepoint').std()['signal']
error = 0.5*y_std
lower = y_mean - error
upper = y_mean + error
# Draw plot with error band and extra formatting to match seaborn style
fig, ax = plt.subplots(figsize=(9,5))
ax.plot(x, y_mean, label='signal mean')
ax.plot(x, lower, color='tab:blue', alpha=0.1)
ax.plot(x, upper, color='tab:blue', alpha=0.1)
ax.fill_between(x, lower, upper, alpha=0.2)
ax.set_xlabel('timepoint')
ax.set_ylabel('signal')
ax.spines['top'].set_visible(False)
ax.spines['right'].set_visible(False)
plt.show()
Run Code Online (Sandbox Code Playgroud)
如果你更喜欢有误差线,这就是 seaborn 线图的样子:
# Draw seaborn lineplot with error bars based on the standard deviation
fig, ax = plt.subplots(figsize=(9,5))
sns.lineplot(data=df, x="timepoint", y="signal", ci='sd', err_style='bars')
sns.despine()
plt.show()
Run Code Online (Sandbox Code Playgroud)
以下是如何使用自定义误差线与 matplotlib 获得相同类型的图:
# Matplotlib plot with custom error bars
# If for some reason you only have lists of the lower and upper bounds
# and not a list of the errors for each point, this seaborn function can
# come in handy:
# error = sns.utils.ci_to_errsize((lower, upper), y_mean)
# Draw plot with error bars and extra formatting to match seaborn style
fig, ax = plt.subplots(figsize=(9,5))
ax.errorbar(x, y_mean, error, color='tab:blue', ecolor='tab:blue')
ax.set_xlabel('timepoint')
ax.set_ylabel('signal')
ax.spines['top'].set_visible(False)
ax.spines['right'].set_visible(False)
plt.show()
# Note: in this example, y_mean and error are stored as pandas series
# so the same plot can be obtained using this pandas plotting function:
# y_mean.plot(yerr=error)
Run Code Online (Sandbox Code Playgroud)
Matplotlib 文档:fill_between,指定误差线,子样本误差线
Pandas 文档:误差线
归档时间: |
|
查看次数: |
3233 次 |
最近记录: |