由于tsplot
函数没有直接设置误差条值或更改计算方法的方式,我找到的唯一解决方案是对timeseries
模块进行猴子补丁:
import seaborn.timeseries
def _plot_std_bars(*args, central_data=None, ci=None, data=None, **kwargs):
std = data.std(axis=0)
ci = np.asarray((central_data - std, central_data + std))
kwargs.update({"central_data": central_data, "ci": ci, "data": data})
seaborn.timeseries._plot_ci_bars(*args, **kwargs)
def _plot_std_band(*args, central_data=None, ci=None, data=None, **kwargs):
std = data.std(axis=0)
ci = np.asarray((central_data - std, central_data + std))
kwargs.update({"central_data": central_data, "ci": ci, "data": data})
seaborn.timeseries._plot_ci_band(*args, **kwargs)
seaborn.timeseries._plot_std_bars = _plot_std_bars
seaborn.timeseries._plot_std_band = _plot_std_band
然后,要使用标准偏差误差线绘制图表,请使用
ax = sns.tsplot(data, err_style="std_bars", n_boot=0)
或者
ax = sns.tsplot(data, err_style="std_band", n_boot=0)
用标准差带绘制图表。
编辑:受SO上这个答案的启发,另一种(可能更明智)的方法是使用以下内容代替tsplot
:
import pandas as pd
import seaborn as sns
df = pd.DataFrame.from_dict({
"mean": data.mean(axis=0),
"std": data.std(axis=0)
}).reset_index()
g = sns.FacetGrid(df, size=6)
ax = g.map(plt.errorbar, "index", "mean", "std")
ax.set(xlabel="", ylabel="")
编辑2:既然你问了关于tsplot
如何计算置信区间的问题:它使用自助法来估计每个时间点的平均值分布,然后从这些分布中找到低和高百分位数(对应于使用的置信区间)。默认置信区间为68%——相当于平均值的±一个标准差,假设正态分布。相应的低和高百分位数为16%和84%。您可以通过ci
关键字参数更改置信区间。