如何解决堆积条形图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 夜。
示例 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()
,
设置 category_orders = {"Day-Shift":df['Day-Shift'].unique()}
会起作用,但只有在您的数据集具有正确的开始顺序时才可靠。另一个条件是您只有一个唯一年份的数据。无论原始顺序如何,为了保证正确的顺序,并使 december 2020
与 january 2021
组合的数据成为可能,我建议您:
- 将
"Day-Shift"
拆分为两个单独的列;time of day == tod
和day of month = date
, - 将
year
附加到您的日期,例如dfs['date2'] = dfs['date'] + '-2021'
, - 使用
'date2'
将dfs['date2'] = pd.to_datetime(dfs['date2'])
转换为日期时间, - 按时间顺序对您的值进行排序,并且
- 使用
"Day-Shift"
按现在正确的顺序检索new_order = list(df['Day-Shift'].unique())
,然后 - 通过
category_orders = {'Day-Shift': new_order}
应用按时间顺序正确的顺序
情节
完整代码:
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()
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。