私は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
sがいくつかあり、fill_between
がそれを受け入れないことです。エラーが出る
TypeError:ufunc 'isfinite'は入力タイプではサポートされておらず、キャストルール '' safe ''に従って、サポートされているタイプに入力を安全に強制変換できませんでした
私が望むものをどのようにして達成できるかについてのアイデアはありますか?ソリューションは、複数のシリーズの不確実性を伴う一連のポイントをプロットできる限り、matplotlibを使用する必要はありません。
OK。したがって、問題の1つは、私のデータの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')
NaNs
DataFrameからmeans
をドロップして、代わりにその結果のデータフレームをプロットできますか?
以下の例では、構造に近づこうとしましたが、means
DataFrameにNaN
がいくつか散らばっています。 stds
DataFrameはおそらく同じ場所にNaN
を持っていると思いますが、この場合は問題ではなく、NaN
をmeans
からドロップしますtemp_means
を取得するには、temp_means
に残っているインデックスを使用して、stds
からstd値を抽出します。
プロットは、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()