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

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():自动调整子图间距,避免标签重叠

常见问题排查

如果之前的代码没生效,大概率是这两个原因:

  1. 没有设置set_xlim,导致x轴范围默认包含了所有数据(包括23:30),从而出现右端空白
  2. 手动设置刻度时没有精准匹配整点时间,或者刻度数量与轴范围不匹配

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 16:00:12