Python中Plotly分面图(Facet plots)X轴顺序错误问题
解决按天分面折线图的X轴时间排序问题
我需要绘制每15分钟一个数据点的按天分面折线图,每天对应一个子图。当前遇到问题:第一天(周一)起始时间为06:15:00,第二天(周二)起始时间为06:00:00,导致周二子图中06:00:00的数据被放在X轴末尾,希望将其置于X轴开头。
测试代码
import pandas as pd import plotly.express as px df = pd.DataFrame({'Date Time':['2022-11-28 06:15:00', '2022-11-28 06:30:00', '2022-11-28 06:45:00','2022-11-28 07:00:00', '2022-11-29 06:00:00', '2022-11-29 06:15:00', '2022-11-29 06:30:00', '2022-11-29 06:45:00', '2022-11-29 07:00:00' ], 'Time':['06:15:00', '06:30:00', '06:45:00','07:00:00', '06:00:00', '06:15:00', '06:30:00', '06:45:00', '07:00:00'], 'Day of Week':['Monday','Monday','Monday','Monday','Tuesday','Tuesday','Tuesday','Tuesday','Tuesday'], 'Value':[0,0.2,0.8,1,0,0.1,0.3,0.8,1]}) fig = px.line(df, x='Time', y='Value', facet_col = 'Day of Week', category_orders={'Time': df['Time']}, title='Example Graph')
已尝试但未解决的方法
- 使用
Date Time列作为X轴,导致X轴变为连续型,图表可读性差; - 通过
dt.strftime将日期时间格式化为仅含hh:mm:ss的格式,但生成的是object类型列,问题依旧; - 参考相关问题使用
category_orders参数调整顺序,但未用对排序逻辑。
解决方案
问题出在category_orders的顺序设置上,之前直接用df['Time']会保留原始数据的顺序(周一的时间在前,周二的06:00排在最后),正确的做法是按时间本身的先后顺序生成分类列表:
修改后的完整代码
import pandas as pd import plotly.express as px df = pd.DataFrame({'Date Time':['2022-11-28 06:15:00', '2022-11-28 06:30:00', '2022-11-28 06:45:00','2022-11-28 07:00:00', '2022-11-29 06:00:00', '2022-11-29 06:15:00', '2022-11-29 06:30:00', '2022-11-29 06:45:00', '2022-11-29 07:00:00' ], 'Time':['06:15:00', '06:30:00', '06:45:00','07:00:00', '06:00:00', '06:15:00', '06:30:00', '06:45:00', '07:00:00'], 'Day of Week':['Monday','Monday','Monday','Monday','Tuesday','Tuesday','Tuesday','Tuesday','Tuesday'], 'Value':[0,0.2,0.8,1,0,0.1,0.3,0.8,1]}) # 生成按时间先后排序的唯一时间列表 time_order = sorted(df['Time'].unique(), key=lambda x: pd.to_datetime(x)) fig = px.line(df, x='Time', y='Value', facet_col = 'Day of Week', category_orders={'Time': time_order}, title='Example Graph') fig.show()
原理说明
- 通过
sorted函数结合pd.to_datetime(x)作为排序键,将所有唯一的时间字符串按实际时间顺序排列,得到['06:00:00', '06:15:00', '06:30:00', '06:45:00', '07:00:00']; - 将这个排序后的列表传入
category_orders,Plotly会按照这个顺序渲染X轴,确保周二子图的06:00:00出现在X轴开头; - 这种方法也适用于更复杂的时间区间,只要时间格式统一,就能自动按正确顺序排列。
内容的提问来源于stack exchange,提问作者Frank
相关产品推荐
相关产品推荐

