Python时间序列绘图异常:添加X轴日期后数据显示不全
问题描述
使用Python的Plotly库绘制时间序列图表时,未指定X轴日期时图表显示正常;但将datetime类型的sasdate设为X轴后,图表无法展示全部观测值,且该问题在Matplotlib中同样出现。以下是数据样例、绘图代码及前后对比图,寻求解决建议。
数据样例
{'sasdate': {4: Timestamp('1959-01-09 00:00:00'), 5: Timestamp('1959-01-12 00:00:00'), 6: Timestamp('1960-01-03 00:00:00'), 7: Timestamp('1960-01-06 00:00:00'), 8: Timestamp('1960-01-09 00:00:00'), 9: Timestamp('1960-01-12 00:00:00'), 10: Timestamp('1961-01-03 00:00:00'), 11: Timestamp('1961-01-06 00:00:00'), 12: Timestamp('1961-01-09 00:00:00'), 13: Timestamp('1961-01-12 00:00:00')}, 'CDT': {4: 0.9633000000000003, 5: 0.35329999999999995, 6: 0.6134, 7: 1.2666999999999997, 8: 1.4733, 9: 1.5799999999999996, 10: 1.4367, 11: 1.4867, 12: 1.6766999999999999, 13: 1.5133}, 'crise': {4: 0, 5: 0, 6: 0, 7: 1, 8: 1, 9: 1, 10: 1, 11: 0, 12: 0, 13: 0}, 'prev': {4: 0.187232436694447, 5: 0.3105689948109355, 6: 0.2539228791308063, 7: 0.13916924600664243, 8: 0.11171277377207611, 9: 0.09915690331613247, 10: 0.11627115062260285, 11: 0.1100762567460945, 12: 0.08869839928964451, 13: 0.10687875779138178}}
绘图代码
import plotly.express as px fig = px.line(test,x='sasdate', y="prev", labels = 'ligne') fig.update_layout(legend=dict( yanchor="top", y=0.99, xanchor="left", x=0.01 )) fig.update_layout(showlegend =True) fig.show()
图表对比
- 未添加日期的图表:

- 添加日期后的图表:

解决建议
这个问题的核心是日期轴的自动缩放/采样逻辑:你的日期数据存在跨年度的大间隔(比如1959年1月到1960年1月之间有近一年空白),绘图库会自动调整X轴显示粒度,把同年度内的相邻日期点视为密集数据并简化显示,导致部分点被隐藏。
以下是几种可行的解决方法:
1. 强制显示所有日期刻度
修改X轴设置,关闭自动采样,强制展示每个sasdate值:
fig.update_xaxes( tickmode='array', tickvals=test['sasdate'], ticktext=test['sasdate'].dt.strftime('%Y-%m-%d'), tickangle=45 # 旋转刻度避免重叠 )
2. 处理数据间隔,优化显示
如果希望保留大间隔的空白但确保所有数据点可见,可使用rangebreaks隐藏无数据的间隔区域:
import pandas as pd fig.update_xaxes( rangebreaks=[ dict(values=[d for d in pd.date_range(test['sasdate'].min(), test['sasdate'].max()) if d not in test['sasdate'].tolist()]) ] )
该方法会压缩无数据的空白区间,让有效数据点的显示更紧凑,同时不会丢失任何观测值。
3. 明确指定X轴范围
避免绘图库自动缩放X轴,强制覆盖数据的完整日期范围:
fig.update_xaxes(range=[test['sasdate'].min(), test['sasdate'].max()])
4. Matplotlib中的对应解决方法
在Matplotlib中,同样可以通过强制设置X轴刻度来展示所有日期:
import matplotlib.pyplot as plt import matplotlib.dates as mdates plt.plot(test['sasdate'], test['prev']) plt.xticks(test['sasdate'], test['sasdate'].dt.strftime('%Y-%m-%d'), rotation=45) plt.show()
内容的提问来源于stack exchange,提问作者Axel
相关产品推荐
相关产品推荐

