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

基于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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 07:27:30