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

Plotly Dash可视化:如何基于日度数据实现历年客运量趋势对比

原有月度趋势可视化效果:
月度趋势效果图
原dayofyear方案效果:
dayofyear方案效果图

解决方案

方案1:使用标准化基准日期(推荐)

该方案可以完美解决平年闰年日期错位、X轴可读性差的问题,逻辑和你已实现的月度趋势分组逻辑一致,仅需调整日期处理规则:

  1. 把所有日期的年份统一替换为同一个包含2月29日的基准闰年(比如2020年),得到不带年份差异的标准化日期
  2. 保留原日期的年份字段作为折线的分组维度,不同年份的客运量作为独立折线
  3. 绘图时设置X轴的刻度仅显示月日,即可实现历年日度数据的同轴对比

对应代码示例:

import pandas as pd
import plotly.express as px

# 日期格式转换
dfFinaltest['Date'] = pd.to_datetime(dfFinaltest['Date'])
# 生成标准化日期:所有日期统一替换为2020年(闰年,覆盖所有可能的月日组合)
dfFinaltest['norm_date'] = dfFinaltest['Date'].apply(lambda x: x.replace(year=2020))
# 提取原年份用于分组
dfFinaltest['year'] = dfFinaltest['Date'].dt.year.astype(str)

# 绘图
fig = px.line(dfFinaltest, 
              x='norm_date', 
              y='客运量', # 替换为你实际的客运量字段名
              color='year',
              labels={'norm_date': '日期', '客运量': '客运量', 'year': '年份'})

# 设置X轴仅显示月日,隐藏基准年信息
fig.update_layout(
    xaxis=dict(
        tickformat='%m-%d',
        ticklabelmode='period'
    )
)

方案2:使用月日字符串作为X轴

如果你不需要连续时间类型的X轴,可以直接提取月日格式的字符串作为X轴维度,也能实现需求:

# 提取月日字符串,格式为两位月-两位日,保证排序正确
dfFinaltest['month_day'] = dfFinaltest['Date'].dt.strftime('%m-%d')
dfFinaltest['year'] = dfFinaltest['Date'].dt.year.astype(str)

# 绘图
fig = px.line(dfFinaltest, 
              x='month_day', 
              y='客运量', # 替换为你实际的客运量字段名
              color='year')

原dayofyear方案的问题说明

你之前的方案效果差主要是两个原因:

  • 平年和闰年的dayofyear数值不匹配:平年的3月1日是第60天,闰年的3月1日是第61天,导致同一个公历日期的点在X轴上错位
  • X轴显示1-366的纯数字,无法直观对应到具体公历日期,可读性极差

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 13:36:03