Plotly 多类别 X 轴排序

4

我正在尝试创建一个带有日期的多类别x轴,下面的代码和图表展示了我想要的外观,但是它的顺序错乱了。我尝试使用“原始x轴”列代替月份,但是格式不正确,我似乎无法更改它的格式。

import random
import numpy as np
import plotly.express as px

df = pd.DataFrame({"Year":np.repeat([2018,2019],[8,12]), 
              "Month": ["May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec", "Jan", "Feb", "Mar", "Apr","May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"],
             "Original x-axis": pd.date_range(start = "2018-05-01", end = "2019-12-01", freq = "MS"),
             "Customer Satisfaction Score": random.sample(range(30,100), 20)})


fig = go.Figure()

fig.add_trace(go.Scatter(
                        #x = cust["Original x-axis"], 
                        x = [df["Year"],df["Month"]],
                      y = df["Customer Satisfaction Score"], mode = "lines"))

fig.update_layout(plot_bgcolor = "white",
                 annotations = [dict(text = "Customer Satisfaction Score",
                                    yref = "paper",
                                    xref = "paper",
                                    x = 0,
                                    y = 1.1,
                                     font = dict(size = 16, color = "#909497"),
                                    showarrow = False)],
                 font = dict(size = 12, color = "#BDC3C7"))
                 #xaxis = dict(tickformat = "%b"))

fig.show()

enter image description here


那么您希望您的x轴是什么样子的?您能否详细说明您所需的x轴格式? - Karthik
基本上与图表中的格式相同,但只是按顺序排列,2019年从五月开始,一月到四月在2019年末。 - FluffySheep1990
1个回答

1
请检查代码片段。您需要根据年份月份对date_time列进行排序。
在这里,我创建了一个额外的列来实现这一点。其余部分都是相同的。
df['month'] = df['Original x-axis'].dt.strftime('%b-%Y')

PLOT

import random
import numpy as np
import plotly.express as px
import pandas as pd
import plotly.offline as py
import plotly.graph_objs as go
df = pd.DataFrame({"Year":np.repeat([2018,2019],[8,12]), 
              "Month": ["May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec", "Jan", "Feb", "Mar", "Apr","May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"],
             "Original x-axis": pd.date_range(start = "2018-05-01", end = "2019-12-01", freq = "MS"),
             "Customer Satisfaction Score": random.sample(range(30,100), 20)})

df['month'] = df['Original x-axis'].dt.strftime('%b-%Y')
fig = go.Figure()

fig.add_trace(go.Scatter(
                        #x = cust["Original x-axis"], 
                        x = [df["Year"],df["month"]],
                      y = df["Customer Satisfaction Score"], mode = "lines"))

fig.update_layout(plot_bgcolor = "white",
                 annotations = [dict(text = "Customer Satisfaction Score",
                                    yref = "paper",
                                    xref = "paper",
                                    x = 0,
                                    y = 1.1,
                                     font = dict(size = 16, color = "#909497"),
                                    showarrow = False)],
                 font = dict(size = 12, color = "#BDC3C7"))
                 #xaxis = dict(tickformat = "%b"))

fig.show()

1
谢谢您的回复,但我想要去除年份的不必要重复,因此我只希望在图表左侧的五月至十二月仅出现2018一次,在图表右侧的一月至十二月仅出现2019一次。 - FluffySheep1990
1
@FluffySheep1990 很抱歉,根据我的了解,这是不可能的,因为你的2018年列中没有1月到4月。你可以按年份对列进行排序,但在这种情况下,2019年将排在第一位,2018年将排在后面,你的图表会稍微改变,但格式将保持不变。或者你可以根据日期时间条件编程添加2018年1月到4月,并将你的“客户满意度评分”映射为“NaN”。这也可以起作用,你的格式将保持不变,只是由于NaN而在开头留有一些空白。 - Karthik

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接