23

我想要一个看起来像这样的情节: 具有不确定性的情节

我正在尝试用 matplotlib 做到这一点:

fig, ax = plt.subplots()

with sns.axes_style("darkgrid"):
    for i in range(5):
        ax.plot(means.ix[i][list(range(3,104))], label=means.ix[i]["label"])
        ax.fill_between(means.ix[i][list(range(3,104))]-stds.ix[i][list(range(3,104))], means.ix[i][list(range(3,104))]+stds.ix[i][list(range(3,104))])
    ax.legend()

我希望阴影区域与中心线的颜色相同。但是现在,我的问题是means有一些NaNs 并且fill_between不接受。我得到错误

TypeError: 输入类型不支持 ufunc 'isfinite',并且根据转换规则 ''safe'' 无法安全地将输入强制转换为任何支持的类型

关于如何实现我想要的任何想法?该解决方案不需要使用matplotlib,只要它可以绘制我的一系列点以及多个系列的不确定性。

4

2 回答 2

26

好的。所以问题之一是dtype我的数据是object不是,当它查看数字是否有限时float,这会导致失败。fill_between我终于设法做到了(a)转换为float然后(b)解决不确定性和线条匹配颜色的问题,使用调色板。所以我有:

import seaborn as sns
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
fig, ax = plt.subplots()
clrs = sns.color_palette("husl", 5)
with sns.axes_style("darkgrid"):
    epochs = list(range(101))
    for i in range(5):
        meanst = np.array(means.ix[i].values[3:-1], dtype=np.float64)
        sdt = np.array(stds.ix[i].values[3:-1], dtype=np.float64)
        ax.plot(epochs, meanst, label=means.ix[i]["label"], c=clrs[i])
        ax.fill_between(epochs, meanst-sdt, meanst+sdt ,alpha=0.3, facecolor=clrs[i])
    ax.legend()
    ax.set_yscale('log')

这给了我以下结果: 在此处输入图像描述

于 2017-03-28T12:39:45.703 回答
3

您可以简单地NaNsmeansDataFrame 中删除并绘制结果数据框吗?

在下面的示例中,我试图接近您的结构,我有一个meansDataFrame,NaN周围散布着一些。我想stdsDataFrame 可能NaN在相同的位置,但在这种情况下,这并不重要,我将NaNfrommeans放到 gettemp_means中,并使用留下的索引temp_meansstds.

NaN这些图显示了删除s之前(顶部)和之后(底部)的结果

x = np.linspace(0, 30, 100)
y = np.sin(x/6*np.pi)
error = 0.2

means = pd.DataFrame(np.array([x,y]).T,columns=['time','mean'])
stds = pd.DataFrame(np.zeros(y.shape)+error)

#sprinkle some NaN in the mean
sprinkles = means.sample(10).index
means.loc[sprinkles] = np.NaN


fig, axs = plt.subplots(2,1)

axs[0].plot(means.ix[:,0], means.ix[:,1])
axs[0].fill_between(means.ix[:,0], means.ix[:,1]-stds.ix[:,0], means.ix[:,1]+stds.ix[:,0])

temp_means = means.dropna()

axs[1].plot(temp_means.ix[:,0], temp_means.ix[:,1])
axs[1].fill_between(temp_means.ix[:,0], temp_means.ix[:,1]-stds.loc[temp_means.index,0], temp_means.ix[:,1]+stds.loc[temp_means.index,0])


plt.show()

在此处输入图像描述

于 2017-03-28T09:27:25.330 回答