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

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

图表对比

  • 未添加日期的图表:无日期X轴图表
  • 添加日期后的图表:有日期X轴图表

解决建议

这个问题的核心是日期轴的自动缩放/采样逻辑:你的日期数据存在跨年度的大间隔(比如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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 03:32:12