由于该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="")
Edit2:既然您询问如何tsplot计算其置信区间:它使用自举法来估计每个时间点的平均值分布,然后从这些分布中找到上下百分比值(与所使用的置信区间相对应)。默认的置信区间为68%–假设正态分布,等于平均值??的±一个标准偏差。低百分比和高百分比分别为16%和84%。您可以通过ci关键字参数更改置信区间。