替换已弃用的tsplot

时间:2017-11-30 20:01:30

标签: python numpy matplotlib seaborn

我有一个带有均匀样本的时间序列保存到一个numpy数组,我想用自举置信区间绘制它们的平均值。通常情况下,我使用Seaborn的tsplot来完成此任务。但是,现在这是being deprecated。我应该用什么代替?

以下是改编自Seaborn文档的示例用法:

x = np.linspace(0, 15, 31)
data = np.sin(x) + np.random.rand(10, 31) + np.random.randn(10, 1)
sns.tsplot(data)

注意:这类似于问题“Seaborn tsplot error”和“Multi-line chart with seaborn tsplot”。但是,在我的情况下,我实际上需要Seaborn的置信区间功能,因此不能简单地使用Matplotlib而不需要一些笨拙的编码。

2 个答案:

答案 0 :(得分:12)

可以使用matplotlib轻松复制问题中的示例tsplot

使用标准差作为误差估计值

import numpy as np; np.random.seed(1)
import matplotlib.pyplot as plt
import seaborn as sns

x = np.linspace(0, 15, 31)
data = np.sin(x) + np.random.rand(10, 31) + np.random.randn(10, 1)


fig, (ax,ax2) = plt.subplots(ncols=2, sharey=True)
ax = sns.tsplot(data=data,ax=ax, ci="sd")

def tsplot(ax, data,**kw):
    x = np.arange(data.shape[1])
    est = np.mean(data, axis=0)
    sd = np.std(data, axis=0)
    cis = (est - sd, est + sd)
    ax.fill_between(x,cis[0],cis[1],alpha=0.2, **kw)
    ax.plot(x,est,**kw)
    ax.margins(x=0)

tsplot(ax2, data)

ax.set_title("sns.tsplot")
ax2.set_title("custom tsplot")

plt.show()

enter image description here

使用bootstrapping进行错误估计

import numpy as np; np.random.seed(1)
from scipy import stats
import matplotlib.pyplot as plt
import seaborn as sns

x = np.linspace(0, 15, 31)
data = np.sin(x) + np.random.rand(10, 31) + np.random.randn(10, 1)


fig, (ax,ax2) = plt.subplots(ncols=2, sharey=True)
ax = sns.tsplot(data=data,ax=ax)

def bootstrap(data, n_boot=10000, ci=68):
    boot_dist = []
    for i in range(int(n_boot)):
        resampler = np.random.randint(0, data.shape[0], data.shape[0])
        sample = data.take(resampler, axis=0)
        boot_dist.append(np.mean(sample, axis=0))
    b = np.array(boot_dist)
    s1 = np.apply_along_axis(stats.scoreatpercentile, 0, b, 50.-ci/2.)
    s2 = np.apply_along_axis(stats.scoreatpercentile, 0, b, 50.+ci/2.)
    return (s1,s2)

def tsplotboot(ax, data,**kw):
    x = np.arange(data.shape[1])
    est = np.mean(data, axis=0)
    cis = bootstrap(data)
    ax.fill_between(x,cis[0],cis[1],alpha=0.2, **kw)
    ax.plot(x,est,**kw)
    ax.margins(x=0)

tsplotboot(ax2, data)

ax.set_title("sns.tsplot")
ax2.set_title("custom tsplot")

plt.show()

enter image description here

我猜这个被弃用的原因正是这个功能的使用相当有限,在大多数情况下,你最好只是直接绘制想要绘制的数据。

答案 1 :(得分:8)

版本tsplot中引入了名为lineplot0.9.0的替代品。它不支持类似Numpy的“wide-form”数据,因此必须使用Pandas转换数据。

x = np.linspace(0, 15, 31)
data = np.sin(x) + np.random.rand(10, 31) + np.random.randn(10, 1)
df = pd.DataFrame(data).melt()
sns.lineplot(x="variable", y="value", data=df)