Plotly Dash可视化:如何基于日度数据实现历年客运量趋势对比
原有月度趋势可视化效果:
原dayofyear方案效果:
解决方案
方案1:使用标准化基准日期(推荐)
该方案可以完美解决平年闰年日期错位、X轴可读性差的问题,逻辑和你已实现的月度趋势分组逻辑一致,仅需调整日期处理规则:
- 把所有日期的年份统一替换为同一个包含2月29日的基准闰年(比如2020年),得到不带年份差异的标准化日期
- 保留原日期的年份字段作为折线的分组维度,不同年份的客运量作为独立折线
- 绘图时设置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
相关产品推荐
相关产品推荐



