Matplotlib共享子图x轴优化:减少刻度并消除两端空白
解决Matplotlib共享x轴子图的整点刻度与轴范围问题
核心思路
要实现仅显示00:00-23:00整点刻度且刻度铺满x轴消除两端空白,关键要做到两点:
- 精准定位整点刻度,过滤掉30分钟的中间刻度
- 强制x轴范围严格对齐第一个和最后一个整点,截断多余的30分钟数据对应的轴空间
完整代码实现
import matplotlib.pyplot as plt import pandas as pd import numpy as np import matplotlib.dates as mdates # 1. 生成模拟的30分钟分辨率全天数据 time_series = pd.date_range(start='2024-01-01 00:00', end='2024-01-01 23:30', freq='30T') data = np.random.randn(6, len(time_series)) # 6个子图对应的数据 # 2. 创建共享x轴的6个子图 fig, axes = plt.subplots(nrows=6, ncols=1, figsize=(10, 12), sharex=True) # 3. 绘制每个子图 for idx, ax in enumerate(axes): ax.plot(time_series, data[idx]) ax.set_ylabel(f'Subplot {idx+1}') # 4. 配置底部子图的x轴(共享轴只需设置一次) bottom_ax = axes[-1] # 设置整点刻度定位器:只显示每小时的整点 bottom_ax.xaxis.set_major_locator(mdates.HourLocator(interval=1)) # 设置刻度标签格式为HH:MM bottom_ax.xaxis.set_major_formatter(mdates.DateFormatter('%H:%M')) # 关键:强制x轴范围严格对齐00:00到23:00,消除两端空白 start_hour = pd.Timestamp('2024-01-01 00:00') end_hour = pd.Timestamp('2024-01-01 23:00') bottom_ax.set_xlim(start_hour, end_hour) # 旋转刻度标签避免重叠 plt.xticks(rotation=45) plt.tight_layout() plt.show()
关键步骤解释
sharex=True:确保所有子图共享同一个x轴,只需配置底部子图的x轴即可同步到所有子图HourLocator(interval=1):精准定位每小时的整点,自动过滤30分钟的中间刻度set_xlim(start_hour, end_hour):强制x轴的起始和结束点严格对齐第一个和最后一个整点,直接截断了原数据中23:30对应的轴空间,彻底消除两端空白tight_layout():自动调整子图间距,避免标签重叠
常见问题排查
如果之前的代码没生效,大概率是这两个原因:
- 没有设置
set_xlim,导致x轴范围默认包含了所有数据(包括23:30),从而出现右端空白 - 手动设置刻度时没有精准匹配整点时间,或者刻度数量与轴范围不匹配
内容的提问来源于stack exchange,提问作者PeterBe
相关产品推荐
相关产品推荐

