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

不同日期数据集子图:共享X轴刻度仅单图显示,需实现双图自定义刻度

解决Matplotlib子图共享X轴并显示自定义刻度标签的问题

我来帮你搞定这个问题——当用日期范围不同的数据集绘制共享X轴的Matplotlib子图时,默认只有底部子图会显示X轴刻度标签。我们可以通过几个简单的调整,让两个子图都显示自定义的日期刻度,同时保持X轴的缩放、平移同步。

完整实现代码

from pandas import DataFrame, date_range, Timedelta
import numpy as np
from matplotlib import pyplot as plt
import matplotlib.dates as mdates

# Dataset 1:月度数据
rng1 = date_range(start='01-01-2015', periods=5, freq='1M')
df1 = DataFrame({'y':np.random.normal(size=len(rng1))}, index=rng1)
y1 = df1['y']

# Dataset 2:双月度数据
rng2 = date_range(start='01-01-2015', periods=5, freq='2M')
df2 = DataFrame({'y':np.random.normal(size=len(rng2))}, index=rng2)
y2 = df2['y']

# 创建共享X轴的2行1列子图
fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(10, 6), sharex=True)

# 绘制第一个子图
ax1.plot(df1.index, y1, marker='o', label='Dataset 1 (月度)')
ax1.set_title('月度数据集')
ax1.legend()
# 关键:强制显示顶部子图的X轴刻度标签(默认共享X轴时会隐藏)
ax1.tick_params(axis='x', labelbottom=True)

# 绘制第二个子图
ax2.plot(df2.index, y2, marker='s', color='orange', label='Dataset 2 (双月度)')
ax2.set_title('双月度数据集')
ax2.legend()

# 设置自定义日期刻度格式(比如显示"年-月")
date_formatter = mdates.DateFormatter('%Y-%m')
# 给两个子图都应用这个日期格式
ax1.xaxis.set_major_formatter(date_formatter)
ax2.xaxis.set_major_formatter(date_formatter)

# 旋转刻度标签,避免重叠
plt.xticks(rotation=45)

# 自动调整布局,防止标签被截断
plt.tight_layout()
plt.show()

关键步骤解释

  • 共享X轴:创建子图时指定sharex=True,这样两个子图的X轴范围、缩放和平移操作会完全同步,保证数据对比的一致性。
  • 显示顶部子图刻度:默认共享X轴时,Matplotlib会隐藏顶部子图的X轴标签,通过ax1.tick_params(axis='x', labelbottom=True)强制开启显示。
  • 自定义日期格式:用mdates.DateFormatter定义你想要的日期显示样式,比如'%b %Y'会显示"Jan 2015"这种格式,按需修改即可。
  • 优化显示:plt.xticks(rotation=45)和plt.tight_layout()是为了避免日期标签重叠,保证图表的可读性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 06:41:30