对绘图中的轴重新排序

dc2*_*dc2 15 python datetime axis dataframe plotly

我有大约 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()
Run Code Online (Sandbox Code Playgroud)

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

这就是我得到的,但它从九月开始,我希望是一月

小智 37

使用来自plotly的分类轴的参考,我能够使用categoryorder并设置catergoryarray,它允许您设置要用于轴的顺序列表。

来自文档/参考:

无论是否使用 Plotly Express,类别都可以使用categoryorder 属性按字母顺序或按值排序:

并且:

此示例演示如何在使用plotly.graph_objects时通过将categoryorder定义为“array”来控制类别顺序,以从属性categoryarray派生排序。

我添加的代码行是:

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

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

在此输入图像描述

完整代码:

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()
Run Code Online (Sandbox Code Playgroud)