多时间序列图的垂直对齐实现方法
实现多物理量时间序列的垂直对齐子图
嗨,这个需求在时序数据可视化里太常见了!核心思路就是让所有子图共享同一个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
相关产品推荐
相关产品推荐

