不同日期数据集子图:共享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
相关产品推荐
相关产品推荐

