ColumnDataSource
を使用するボケプロットを作成したいと思います。データのソースであるpandas
DataFrame
には、1つの列とdatetime
インデックスがあります。
X値をインデックスにするように指定するにはどうすればよいですか。それがデフォルトになることを期待して、私はそれを省略しようとしましたが、うまくいきませんでした:
インデックスをデータフレームの列としてコピーするだけの醜い解決策がありますが、もっと洗練された解決策があることを願っています。
問題は、どの列を「x」列にするかを指定する必要があることです。 「x」値を指定しない場合、bokeh.plottingのデフォルトの動作は、ColumnDataSource(存在しない)で「x」という列を見つけようとすることです。
ここで注意が必要なのは、パンダで名前付きインデックス( 'timeseries')を使用していることです。その名前は、ColumnDataSourceを作成するときに引き継がれるため、ソースはおそらく次のようになります。
ds = ColumnDataSource(df)
print(ds.data)
# the ts_n values would be the actual timestamps from the df
> {'timestamp': [ts_1, ts_2, ts_3, ts_4, ts_5], 'avg': [0.9, 0.8, 0.7, 0.8, 0.9]}
次を使用すると機能します。
p.line(source=ds, x='timestamps', y='avg')
私は通常、インデックスをリセットします。これにより、インデックスが列になります。あなたの醜い解決策に似ています。次に、指定した列をプロットします。
df.reset_index(inplace = True)
あるいは、列だけを参照することもできます。matplotlibでは、通常、デフォルトで必要な方法でインデックスを使用します。それがあなたのために働くかどうかはわかりませんが、試してみる価値があります。
df["avg"].plot()
あるいは、時系列プロットアプローチを試すことができますか?以下に詳細を示します。
通常の構文でインデックスを呼び出して、DFから次のようにインデックスを取得できます。p.line(x = df.index.values, y = df['values_for_y'])