Plotly:Plotly Expressアニメーションでカテゴリカルx軸要素を指定するにはどうすればよいですか?

Aug 22 2020

以下のデータがあります。

スライダーを使用しているので、さまざまな日付をスライドできます(スライダーがどのような場合かについては、下の図を参照してください)。

日付によってカテゴリが変わる可能性があるため、日付に関係なく、x軸の範囲をA、B、C、E、Fで初期化します。そのため、カテゴリにデータポイントがない場合もありますが、これは私には関係ありません。

では、x軸の範囲を初期化し、データポイントを初期化されたx軸に適合させるにはどうすればよいでしょうか。

私はpython3を使用しており、plotlyexpressを使用しています。

これは今のところ私のコードです:

data.columns = ['price', 'category', 'date']
    data = data.sort_values(by=['date', 'price'])
    fig = px.scatter(data, x = "category", y = "price", animation_frame="date")
    fig.update_layout(
        yaxis_title="Price (€)",
    )
    fig['layout']['updatemenus'][0]['pad']['t'] = 180
    fig['layout']['sliders'][0]['pad']['t'] = 200
    fig.write_html("/home/**/Desktop/1.html", auto_play=True)

私は十分に明確だったと思います。追加情報が必要な場合はお知らせください。どんなアイデアやヒントも大歓迎です:)

回答

vestland Aug 23 2020 at 22:56

答え:

すべてのカテゴリがすべてのアニメーションフレームのx軸に表示されていることを確認する唯一の方法は、それらが最初のに表示されていることを確認することDate = Xです。したがって、図自体のx軸範囲を実際に修正することはできません。データソースの表現を通じてそれを行う必要があります。

詳細:

そのため、カテゴリにデータポイントがない場合もありますが、これは私には関係ありません。

そうではないかもしれませんが、plotly.express重要になります。特に「データがない」とは、データセット内のすべての日付のすべてのカテゴリのレコードがないことを意味します。ご覧のとおり、plotlyは、x軸の値を、がである最初の一意の値で見つかったカテゴリに設定しているようDate = XですA, B ,C。しかし、心配しないでください。私たちもそれを処理します。データスクリーンショットの少し変更されたバージョンを使用しましょう(次回はこれを実行します)。X, Y特定のデータがアニメーションを少し台無しにするので、代わりに実際の日付を追加し、数値の範囲を少し減らしました。

このようなアニメーションアプローチを使用する場合:

fig = px.scatter(df1, x="Category", y="Price", animation_frame="Date",
                  color="Category", range_y=[0,20])

... 2つのアニメーションフレームを取得します。

プロット1、フレーム1

プロット1、フレーム2

さて、パンダの投稿にあるように、すべてのカテゴリがすべての日付で表されるようにするアプローチを使用しましょう:長い形式のデータフレームで値が欠落しているにもかかわらず、すべての行のすべての列を含めるにはどうすればよいですか?

今、あなたは得るでしょう:

プロット2、フレーム1

プロット2、フレーム2

これがあなたが探していたものであることを願っています。そうでない場合は、遠慮なくお知らせください。df1.fillna(0)パーツをドロップすると、わずかに異なる結果が得られます。しかし、私はあなたに任せて、で利用可能なすべてのオプションをいじりまわします

完全なコード:

import pandas as pd
import plotly.express as px

df = pd.DataFrame({'Date': {0: '24.08.2020',
                              1: '24.08.2020',
                              2: '24.08.2020',
                              3: '25.08.2020',
                              4: '25.08.2020',
                              5: '25.08.2020'},
                             'Category': {0: 'A', 1: 'B', 2: 'C', 3: 'C', 4: 'E', 5: 'F'},
                             'Price': {0: 1, 1: 2, 2: 3, 3: 3, 4: 10, 5: 13}})

# make sure that all category variables are represented for
# all dates even though not all variables have values.
df['key']=df.groupby(['Date','Category']).cumcount()
df1 = pd.pivot_table(df,index='Date',columns=['key','Category'],values='Price')
df1 = df1.stack(level=[0,1],dropna=False).to_frame('Price').reset_index()
df1 = df1[df1.key.eq(0) | df1['Price'].notna()]
df1=df1.fillna(0)

# ploty express animation
fig = px.scatter(df1, x="Category", y="Price", animation_frame="Date",
                  color="Category", range_y=[0,20])

# some extra settings.
fig.update_layout(transition = {'duration': 20000})


fig.show()