You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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()

原理说明

  1. 通过sorted函数结合pd.to_datetime(x)作为排序键,将所有唯一的时间字符串按实际时间顺序排列,得到['06:00:00', '06:15:00', '06:30:00', '06:45:00', '07:00:00'];
  2. 将这个排序后的列表传入category_orders,Plotly会按照这个顺序渲染X轴,确保周二子图的06:00:00出现在X轴开头;
  3. 这种方法也适用于更复杂的时间区间,只要时间格式统一,就能自动按正确顺序排列。

内容的提问来源于stack exchange,提问作者Frank

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 17:40:17