如何用单个滑块实现多图共享可滚动X轴(不同采样频率)
实现多采样频率时序图的同步滑块滚动X轴
我完全懂你想要的效果——几个不同采样频率的时序图表共用一个时间轴,通过单个滑块就能同步左右滚动X轴,查看固定时长的时间窗口内容。咱们直接上代码和思路,一步步实现:
第一步:准备模拟数据
首先得生成符合你需求的测试数据:y1每秒采样、y2每10秒、y3每100秒,总时间窗口设为1000秒(你可以根据实际需求调整):
import numpy as np import matplotlib.pyplot as plt from ipywidgets import interact # 生成时间轴数据 total_time = 1000 # 总时长1000秒 x1 = np.arange(0, total_time, 1) # 每秒采样的时间点 x2 = np.arange(0, total_time, 10) # 每10秒采样的时间点 x3 = np.arange(0, total_time, 100)# 每100秒采样的时间点 # 生成对应的y值(模拟随机数据,你可以替换成自己的真实数据) y1 = np.random.randn(len(x1)).cumsum() # 累积随机数模拟时序数据 y2 = np.random.randn(len(x2)).cumsum() y3 = np.random.randn(len(x3)).cumsum()
第二步:创建同步滚动的交互图表
核心思路是:创建3个子图共享X轴,然后用滑块控制X轴的显示起始时间,固定显示窗口的长度(比如100秒,你也可以改成其他值),每次滑块变动时更新所有子图的X轴范围:
%matplotlib inline # 创建3个子图,共享X轴 fig, (ax1, ax2, ax3) = plt.subplots(3, 1, figsize=(10, 8), sharex=True) # 初始绘制所有数据 line1, = ax1.plot(x1, y1, label='y1 (1s采样)') line2, = ax2.plot(x2, y2, label='y2 (10s采样)', color='orange') line3, = ax3.plot(x3, y3, label='y3 (100s采样)', color='green') # 设置每个子图的标签和标题 ax1.set_title('多采样频率时序图同步滚动') ax1.set_ylabel('y1数值') ax2.set_ylabel('y2数值') ax3.set_ylabel('y3数值') ax3.set_xlabel('时间(秒)') for ax in [ax1, ax2, ax3]: ax.legend() # 定义滑块控制的更新函数 def update_x_window(start_time): window_duration = 100 # 固定显示100秒的窗口 # 设置所有子图的X轴范围 ax1.set_xlim(start_time, start_time + window_duration) ax2.set_xlim(start_time, start_time + window_duration) ax3.set_xlim(start_time, start_time + window_duration) # 自动调整Y轴范围以适配当前窗口内的数据 ax1.relim() ax1.autoscale_view(scalex=False, scaley=True) ax2.relim() ax2.autoscale_view(scalex=False, scaley=True) ax3.relim() ax3.autoscale_view(scalex=False, scaley=True) # 创建滑块:起始时间范围从0到总时长-窗口时长,步长1秒 interact(update_x_window, start_time=(0, total_time - 100, 1))
关键细节说明
- 共享X轴:用
sharex=True创建子图,确保所有图表的X轴始终对齐,滚动时不会错位。 - 自适应Y轴:每次滚动时调用
relim()和autoscale_view(),让每个子图的Y轴自动适配当前窗口内的数据,避免出现数据被截断的情况。 - 滑块范围:滑块的最大值设为
total_time - window_duration,这样滚动到最右端时刚好显示最后一个完整的时间窗口。 - 不同采样频率处理:因为所有数据的X轴都是统一的时间刻度,只要设置好X轴范围,matplotlib会自动筛选并显示对应时间窗口内的采样点,不用额外处理不同频率的数据对齐问题。
你可以把模拟数据替换成自己的真实数据,调整total_time和window_duration来匹配你的需求,滑块的步长也可以根据需要修改(比如改成10秒,让滚动更平缓)。
内容的提问来源于stack exchange,提问作者Sundar N
相关产品推荐
相关产品推荐

