我正在尝试使用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
有一些NaN
,fill_between
不接受。我收到了错误
TypeError:输入类型不支持ufunc'isfinite',而且 输入无法安全地强制转换为任何支持的类型 施法规则''安全''
关于如何实现我想要的任何想法?该解决方案不需要使用matplotlib,只要它可以绘制我的一系列点与多个系列的不确定性。
答案 0 :(得分:5)
确定。因此,问题之一是我的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')
答案 1 :(得分:2)
您可以直接从NaNs
数据框中删除means
并绘制结果数据框吗?
在下面的示例中,我尝试接近您的结构,我有一个means
DataFrame,其中有一些NaN
。我认为stds
DataFrame在相同的位置可能有NaN
,但在这种情况下它并不重要,我将NaN
从means
中删除temp_means
并使用temp_means
中留下的索引从stds
中提取标准值。
图表显示放弃NaN
之前(上)和之后(下)的结果
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()