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

多时间序列图的垂直对齐实现方法

实现多物理量时间序列的垂直对齐子图

嗨,这个需求在时序数据可视化里太常见了!核心思路就是让所有子图共享同一个x轴,这样不管哪个子图,同一时间t对应的水平坐标都会完全对齐,而且每个物理量都能在独立的矮个子图里展示。我用Python的Matplotlib给你演示最直接的实现方法:

基础实现步骤

1. 准备数据(模拟示例)

先生成一组共享时间轴的不同物理量数据,方便演示:

import matplotlib.pyplot as plt
import numpy as np

# 共享的时间序列:0到10秒,100个采样点
time = np.linspace(0, 10, 100)

# 模拟三个物理量数据
temperature = np.sin(time) + 20  # 温度(20±1℃)
humidity = 60 + 10 * np.cos(time)  # 湿度(50-70%)
wind_speed = 2 + np.random.randn(100)*0.5  # 风速(带随机噪声)

2. 创建共享x轴的垂直子图

关键就是在subplots里设置sharex=True,让所有子图共用同一个x轴刻度和范围:

# 创建3个垂直排列的子图,共享x轴,设置画布大小
fig, axes = plt.subplots(nrows=3, ncols=1, figsize=(10, 8), sharex=True)

# 给每个子图绘制对应物理量
axes[0].plot(time, temperature, color='#ff5733')
axes[0].set_ylabel('温度 (℃)')
axes[0].grid(alpha=0.3)  # 加浅网格提升可读性

axes[1].plot(time, humidity, color='#337dff')
axes[1].set_ylabel('湿度 (%)')
axes[1].grid(alpha=0.3)

axes[2].plot(time, wind_speed, color='#33ff57')
axes[2].set_ylabel('风速 (m/s)')
axes[2].set_xlabel('时间 (s)')  # 只在最下方子图显示x轴标签
axes[2].grid(alpha=0.3)

# 自动调整子图间距,避免标签重叠
plt.tight_layout()

plt.show()

关键细节说明

  • sharex=True:这是实现对齐的核心!它会让所有子图的x轴范围、刻度完全同步,同一时间点的水平坐标自然完全重合。而且默认会隐藏上方子图的x刻度,让布局更简洁。
  • 如果你的时间是日期时间类型(比如datetime或pandas的Timestamp),完全不用改逻辑——Matplotlib会自动识别并适配x轴格式,对齐效果一样。
  • 要是想自定义子图高度比例(比如某个物理量需要更突出),可以用GridSpec来精细控制:
from matplotlib.gridspec import GridSpec

fig = plt.figure(figsize=(10, 8))
# 设置3行1列的网格,第三个子图高度是前两个的1.5倍
gs = GridSpec(3, 1, figure=fig, height_ratios=[1, 1, 1.5])

ax_temp = fig.add_subplot(gs[0])
ax_temp.plot(time, temperature, color='#ff5733')
ax_temp.set_ylabel('温度 (℃)')
ax_temp.grid(alpha=0.3)
ax_temp.set_xticklabels([])  # 手动隐藏上层子图x刻度

ax_humid = fig.add_subplot(gs[1], sharex=ax_temp)
ax_humid.plot(time, humidity, color='#337dff')
ax_humid.set_ylabel('湿度 (%)')
ax_humid.grid(alpha=0.3)
ax_humid.set_xticklabels([])

ax_wind = fig.add_subplot(gs[2], sharex=ax_temp)
ax_wind.plot(time, wind_speed, color='#33ff57')
ax_wind.set_ylabel('风速 (m/s)')
ax_wind.set_xlabel('时间 (s)')
ax_wind.grid(alpha=0.3)

plt.tight_layout()
plt.show()

这样出来的图就完全符合你的需求了:每个物理量独立展示,同一时间点的水平位置严格对齐,视觉上清晰直观。如果用Seaborn等高层库,也可以用类似的共享轴思路,但Matplotlib的基础方法更灵活可控。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:22:54