在 Plotly 图中重新排序轴

Re-order axis in Plotly graph

我有大约 3 年的按月和年组织的数据。我想按月和年将此数据绘制为条形图,以月为 x 轴,以年为轨迹。问题是数据从 2018 年 9 月开始,所以要绘制的第一个月份是 9 月,但我希望它是 1 月。我曾尝试这样做,但随后年份按递减顺序排列,我也不希望这样。 这是一个代码示例。

import datetime
import pandas as pd
import plotly.graph_objects as go
import random

df = pd.DataFrame({})
numdays = 1000
base = datetime.datetime.today()
date_list = [base - datetime.timedelta(days=x) for x in range(numdays)]
price = [random.randint(1,10) for i in range(numdays)]
df['price'] = price
df.index = date_list
df = df.resample('MS').sum()
df['month'] = df.index.month_name()
df['month number'] = df.index.month
df['year'] = df.index.year
year_list = df['year'].unique().tolist()
fig = go.Figure()

for year in year_list:
    df_aux = df[df.year==year]
    df_aux = df_aux.sort_values(by=['month number'])
    fig.add_trace(go.Bar(x=df_aux.month, y=df_aux['price'], \
                          name=year))

fig.show()

这是我得到的,但它是从 9 月开始的,我希望它是 1 月:

使用 categorical axes from plotly 的参考,我能够使用 categoryorder 并设置 catergoryarray,它允许您设置要使用的订单列表为你的轴。

来自documentation/reference:

Whether using Plotly Express or not, categories can be sorted alphabetically or by value using the categoryorder attribute:

还有:

This example shows how to control category order when using plotly.graph_objects by defining categoryorder to "array" to derive the ordering from the attribute categoryarray.

我添加的代码行是:

fig.update_xaxes(categoryorder='array', categoryarray= ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'])

这给出了如下所示的输出:

完整代码:

import datetime
import pandas as pd
import plotly.graph_objects as go
import random

df = pd.DataFrame({})
numdays = 1000
base = datetime.datetime.today()
date_list = [base - datetime.timedelta(days=x) for x in range(numdays)]
price = [random.randint(1,10) for i in range(numdays)]
df['price'] = price
df.index = date_list
df = df.resample('MS').sum()
df['month'] = df.index.month_name()
df['month number'] = df.index.month
df['year'] = df.index.year
year_list = df['year'].unique().tolist()

fig = go.Figure()

for year in year_list:
    df_aux = df[df.year==year]
    df_aux = df_aux.sort_values(by=['month number'])
    fig.add_trace(go.Bar(x=df_aux.month, y=df_aux['price'], \
                          name=year))

fig.update_xaxes(categoryorder='array', categoryarray= ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'])

fig.show()