基于Matplotlib可视化二进制传感器门窗状态数据
用Matplotlib可视化门窗开合状态数据
先理清楚数据逻辑
你拿到的是状态切换的时间点和对应状态,但初始状态是0(关闭),所以得先补第一个切换点之前的初始时间段,再算出每个状态持续的时长,这样才能用堆叠条形图展示不同状态的时间段。
直接能用的代码
import matplotlib.pyplot as plt import datetime # 从数据库取到的原始数据 timestamps, states = ([datetime.datetime(2023, 11, 30, 6, 59, 12, 935971, tzinfo=datetime.timezone.utc), datetime.datetime(2023, 11, 30, 7, 4, 47, 367527, tzinfo=datetime.timezone.utc), datetime.datetime(2023, 11, 30, 16, 51, 54, 169183, tzinfo=datetime.timezone.utc), datetime.datetime(2023, 11, 30, 16, 59, 5, 211397, tzinfo=datetime.timezone.utc)], [1.0, 0.0, 1.0, 0.0]) # 补初始状态的起始时间(这里取第一个切换点前1分钟,你可以按实际改) start_time = timestamps[0] - datetime.timedelta(minutes=1) full_timestamps = [start_time] + timestamps full_states = [0.0] + states # 算每个状态持续的时长(转成小时,方便看) durations = [] for i in range(1, len(full_timestamps)): delta = full_timestamps[i] - full_timestamps[i-1] durations.append(delta.total_seconds() / 3600) # 整理堆叠条形图需要的数据 closed_durations = [] opened_durations = [] for state, duration in zip(full_states[:-1], durations): if state == 0.0: closed_durations.append(duration) opened_durations.append(0) else: closed_durations.append(0) opened_durations.append(duration) # 画图 plt.figure(figsize=(10, 3)) # 画关闭状态的灰色条 plt.barh([0], closed_durations, color='gray', label='门窗关闭') # 画打开状态的橙色条,叠在灰色条上面 plt.barh([0], opened_durations, left=closed_durations, color='orange', label='门窗打开') # 把X轴的时长刻度换成实际时间点 total_hours = 0 tick_positions = [0] tick_labels = [start_time.strftime('%H:%M:%S')] for duration in durations: total_hours += duration tick_positions.append(total_hours) current_time = start_time + datetime.timedelta(hours=total_hours) tick_labels.append(current_time.strftime('%H:%M:%S')) plt.xticks(tick_positions, tick_labels, rotation=45) plt.yticks([]) # 不需要Y轴标签 plt.xlabel('时间') plt.title('门窗开合状态时序图') plt.legend() plt.tight_layout() # 自动调整布局,防止标签被截断 plt.show()
简单解释下代码
- 补初始时间:因为原始数据只记了状态切换的时刻,没说一开始什么时候处于关闭状态,这里随便取了第一个切换点前1分钟,你可以换成当天的起始时间或者其他合理值
- 算时长:把每个状态持续的秒数转成小时,这样图表的X轴刻度不会太乱
- 堆叠条形:把关闭和打开的时长分开整理,对应不同颜色的条形,叠在一起就能直观看到每个时间段的状态
- 时间刻度:把X轴的时长转换成具体时间点,比单纯的小时数好理解
内容的提问来源于stack exchange,提问作者JoeGlas
相关产品推荐
相关产品推荐

