web-dev-qa-db-ja.com

ボケ味のx座標のデータフレームインデックスを使用して、a pandasデータフレームをプロットします。

ColumnDataSourceを使用するボケプロットを作成したいと思います。データのソースであるpandasDataFrameには、1つの列とdatetimeインデックスがあります。

enter image description here

X値をインデックスにするように指定するにはどうすればよいですか。それがデフォルトになることを期待して、私はそれを省略しようとしましたが、うまくいきませんでした:

enter image description here

インデックスをデータフレームの列としてコピーするだけの醜い解決策がありますが、もっと洗練された解決策があることを願っています。

enter image description hereenter image description here

9
Krastanov

問題は、どの列を「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')
10
Luke Canavan

私は通常、インデックスをリセットします。これにより、インデックスが列になります。あなたの醜い解決策に似ています。次に、指定した列をプロットします。

df.reset_index(inplace = True)

あるいは、列だけを参照することもできます。matplotlibでは、通常、デフォルトで必要な方法でインデックスを使用します。それがあなたのために働くかどうかはわかりませんが、試してみる価値があります。

df["avg"].plot()

あるいは、時系列プロットアプローチを試すことができますか?以下に詳細を示します。

インデックス付きのデータフレームを使用したBokehのTimeSeries

5
bamdan

通常の構文でインデックスを呼び出して、DFから次のようにインデックスを取得できます。
p.line(x = df.index.values, y = df['values_for_y'])

1
fmcmac