堆积条形图X轴给出错误的顺序python plotly 情节完整代码:

问题描述

Hi 创建了一个使用 python plotly 的堆栈条形图。但是给出了错误的 X 轴顺序。

DF:

Day-Shift   State          seconds
Day 01-05   A              7439
Day 01-05   STOPPED        0
Day 01-05   B              10
Day 01-05   C              35751
Night 01-05 C              43200
Day 01-06   STOPPED        7198
Day 01-06   F              18
Day 01-06   A              14
Day 01-06   A              29301
Day 01-06   STOPPED        6
Day 01-06   A              6663
Night 01-06 A              43200

在 df 中,Day-Shift 代表班次和日期,它是第 01-05 天、第 01-05 晚、第 01-06 天、第 01-06 晚,依此类推。 但是在图中,在 X 轴上给出了错误的顺序。例如:01-05 日之后的图表显示的是 01-08 夜而不是 01-05 夜。

enter image description here

示例 df 和我的代码如下:

import plotly.express as px
fig = px.bar(df,x="Day-Shift",y="seconds",color="State")
fig.show()

DF ad Dict:

import pandas as pd
import plotly.express as px


df = pd.DataFrame({'Day-Shift': {0: 'Day 01-05',1: 'Day 01-05',2: 'Day 01-05',3: 'Day 01-05',4: 'Night 01-05',5: 'Day 01-06',6: 'Day 01-06',7: 'Day 01-06',8: 'Day 01-06',9: 'Day 01-06',10: 'Day 01-06',11: 'Night 01-06',12: 'Day 01-07',13: 'Night 01-07',14: 'Night 01-07',15: 'Night 01-07',16: 'Night 01-07',17: 'Night 01-07',18: 'Night 01-08',19: 'Night 01-08',20: 'Night 01-08',21: 'Night 01-08',22: 'Day 01-08',23: 'Day 01-08',24: 'Day 01-08',25: 'Night 01-09',26: 'Night 01-09',27: 'Night 01-09',28: 'Day 01-09',29: 'Day 01-09',30: 'Day 01-09',31: 'Day 01-09',32: 'Day 01-10',33: 'Night 01-10',34: 'Day 01-11',35: 'Day 01-11',36: 'Day 01-11',37: 'Day 01-11',38: 'Day 01-11',39: 'Night 01-11',40: 'Day 01-12',41: 'Night 01-12',42: 'Day 01-13',43: 'Day 01-13',44: 'Day 01-13',45: 'Day 01-13',46: 'Day 01-13',47: 'Day 01-13',48: 'Day 01-13',49: 'Night 01-13',50: 'Day 01-14',51: 'Day 01-14',52: 'Day 01-14',53: 'Day 01-14',54: 'Day 01-14',55: 'Day 01-14',56: 'Day 01-14',57: 'Day 01-14',58: 'Day 01-14',59: 'Night 01-14'},'State': {0: 'D',1: 'STOPPED',2: 'B',3: 'A',4: 'A',5: 'A',6: 'A1',7: 'A2',8: 'A3',9: 'A4',10: 'B1',11: 'B1',12: 'B1',13: 'B1',14: 'B2',15: 'STOPPED',16: 'RUNNING',17: 'B',18: 'STOPPED',19: 'B',20: 'RUNNING',21: 'D',22: 'STOPPED',23: 'B',24: 'RUNNING',25: 'STOPPED',26: 'RUNNING',27: 'B',28: 'RUNNING',29: 'STOPPED',30: 'B',31: 'D',32: 'B',33: 'B',34: 'B',35: 'RUNNING',36: 'STOPPED',37: 'D',38: 'A',39: 'A',40: 'A',41: 'A',42: 'A',43: 'A1',44: 'A2',45: 'A3',46: 'A4',47: 'B1',48: 'B2',49: 'B2',50: 'B2',51: 'B',52: 'STOPPED',53: 'A',54: 'A1',55: 'A2',56: 'A3',57: 'A4',58: 'B1',59: 'B1'},'seconds': {0: 7439,1: 0,2: 10,3: 35751,4: 43200,5: 7198,6: 18,7: 14,8: 29301,9: 6,10: 6663,11: 43200,12: 43200,13: 5339,14: 8217,15: 0,16: 4147,17: 1040,18: 24787,19: 1500,20: 14966,21: 1410,22: 2499,23: 1310,24: 39391,25: 3570,26: 17234,27: 47390,28: 36068,29: 270,30: 6842,31: 20,32: 43200,33: 43200,34: 2486,35: 8420,36: 870,37: 30,38: 31394,39: 43200,40: 43200,41: 43200,42: 36733,43: 23,44: 6,45: 4,46: 4,47: 3,48: 6427,49: 43200,50: 620,51: 0,52: 4,53: 41336,54: 4,55: 4,56: 4,57: 23,58: 1205,59: 43200}})

非常感谢您的支持!!!

解决方法

您可以使用 category_orders 来设置值的顺序:

import pandas as pd 
import plotly.express as px 
df = pd.DataFrame({'Day-Shift': {0: 'Day 01-05',1: 'Day 01-05',2: 'Day 01-05',3: 'Day 01-05',4: 'Night 01-05',5: 'Day 01-06',6: 'Day 01-06',7: 'Day 01-06',8: 'Day 01-06',9: 'Day 01-06',10: 'Day 01-06',11: 'Night 01-06',12: 'Day 01-07',13: 'Night 01-07',14: 'Night 01-07',15: 'Night 01-07',16: 'Night 01-07',17: 'Night 01-07',18: 'Night 01-08',19: 'Night 01-08',20: 'Night 01-08',21: 'Night 01-08',22: 'Day 01-08',23: 'Day 01-08',24: 'Day 01-08',25: 'Night 01-09',26: 'Night 01-09',27: 'Night 01-09',28: 'Day 01-09',29: 'Day 01-09',30: 'Day 01-09',31: 'Day 01-09',32: 'Day 01-10',33: 'Night 01-10',34: 'Day 01-11',35: 'Day 01-11',36: 'Day 01-11',37: 'Day 01-11',38: 'Day 01-11',39: 'Night 01-11',40: 'Day 01-12',41: 'Night 01-12',42: 'Day 01-13',43: 'Day 01-13',44: 'Day 01-13',45: 'Day 01-13',46: 'Day 01-13',47: 'Day 01-13',48: 'Day 01-13',49: 'Night 01-13',50: 'Day 01-14',51: 'Day 01-14',52: 'Day 01-14',53: 'Day 01-14',54: 'Day 01-14',55: 'Day 01-14',56: 'Day 01-14',57: 'Day 01-14',58: 'Day 01-14',59: 'Night 01-14'},'State': {0: 'D',1: 'STOPPED',2: 'B',3: 'A',4: 'A',5: 'A',6: 'A1',7: 'A2',8: 'A3',9: 'A4',10: 'B1',11: 'B1',12: 'B1',13: 'B1',14: 'B2',15: 'STOPPED',16: 'RUNNING',17: 'B',18: 'STOPPED',19: 'B',20: 'RUNNING',21: 'D',22: 'STOPPED',23: 'B',24: 'RUNNING',25: 'STOPPED',26: 'RUNNING',27: 'B',28: 'RUNNING',29: 'STOPPED',30: 'B',31: 'D',32: 'B',33: 'B',34: 'B',35: 'RUNNING',36: 'STOPPED',37: 'D',38: 'A',39: 'A',40: 'A',41: 'A',42: 'A',43: 'A1',44: 'A2',45: 'A3',46: 'A4',47: 'B1',48: 'B2',49: 'B2',50: 'B2',51: 'B',52: 'STOPPED',53: 'A',54: 'A1',55: 'A2',56: 'A3',57: 'A4',58: 'B1',59: 'B1'},'seconds': {0: 7439,1: 0,2: 10,3: 35751,4: 43200,5: 7198,6: 18,7: 14,8: 29301,9: 6,10: 6663,11: 43200,12: 43200,13: 5339,14: 8217,15: 0,16: 4147,17: 1040,18: 24787,19: 1500,20: 14966,21: 1410,22: 2499,23: 1310,24: 39391,25: 3570,26: 17234,27: 47390,28: 36068,29: 270,30: 6842,31: 20,32: 43200,33: 43200,34: 2486,35: 8420,36: 870,37: 30,38: 31394,39: 43200,40: 43200,41: 43200,42: 36733,43: 23,44: 6,45: 4,46: 4,47: 3,48: 6427,49: 43200,50: 620,51: 0,52: 4,53: 41336,54: 4,55: 4,56: 4,57: 23,58: 1205,59: 43200}})

fig = px.bar(df,x="Day-Shift",y="seconds",category_orders={'Day-Shift': df['Day-Shift'].to_list()},color="State")
fig.show()

输出: enter image description here

,

设置 category_orders = {"Day-Shift":df['Day-Shift'].unique()} 会起作用,但只有在您的数据集具有正确的开始顺序时才可靠。另一个条件是您只有一个唯一年份的数据。无论原始顺序如何,为了保证正确的顺序,并使 december 2020january 2021 组合的数据成为可能,我建议您:

  1. "Day-Shift" 拆分为两个单独的列; time of day == todday of month = date
  2. year 附加到您的日期,例如 dfs['date2'] = dfs['date'] + '-2021'
  3. 使用 'date2'dfs['date2'] = pd.to_datetime(dfs['date2']) 转换为日期时间,
  4. 按时间顺序对您的值进行排序,并且
  5. 使用 "Day-Shift" 按现在正确的顺序检索 new_order = list(df['Day-Shift'].unique()),然后
  6. 通过 category_orders = {'Day-Shift': new_order} 应用按时间顺序正确的顺序

情节

enter image description here

完整代码:

import pandas as pd
import plotly.express as px

df = pd.DataFrame({'Day-Shift': {0: 'Day 01-05',59: 43200}})

dfs = df['Day-Shift'].str.extract('([a-zA-Z]+)([^a-zA-Z]+)',expand=True)
dfs.columns = ['tod','date']
dfs['date2'] = dfs['date'] + '-2021'
dfs['date2'] = pd.to_datetime(dfs['date2'])

df = pd.concat([df,dfs],axis = 1)
df = df.sort_values(['date2','tod'],ascending = [True,True])

new_order = list(df['Day-Shift'].unique())
# df['Day-Shift'] = pd.Categorical(df['Day-Shift'],categories=new_order,ordered=True)

fig = px.bar(df,color="State",category_orders = {'Day-Shift': new_order})
fig.update_xaxes(type='category')
fig.show()

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...