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

使用PyPlot绘制时序系统状态枚举值的分段条形图

实现状态变化的分段条形图(向前填充状态)

我刚好做过类似的需求,推荐你用matplotlib的broken_barh函数,这绝对是最简洁规范的方案,完美匹配你要的分段填充效果!不用再折腾Line Collections或者普通hbar了,这个函数就是专门为这种分段时间序列状态可视化设计的。

实现步骤:

  1. 把你的Series数据转换成「状态持续时间段」的格式
  2. 给每个枚举状态分配专属颜色
  3. 用broken_barh直接绘制分段条形图
  4. 调整轴标签和状态标注,让图表更清晰

完整代码示例(适配你的数据)

import matplotlib.pyplot as plt
import pandas as pd

# 替换成你自己的Series数据
state_series = pd.Series(
    ['A', 'B', 'A', 'C', 'D'],
    index=[0, 3, 4, 7, 9]  # 时间戳索引
)

# 1. 计算每个状态的持续时间段:[起始时间, 持续时长]
time_points = state_series.index.tolist()
# 最后一个状态的结束时间可以自定义,这里和你的示例一致设为10
time_points.append(10)
state_intervals = []
state_list = state_series.tolist()

for idx in range(len(state_list)):
    start_time = time_points[idx]
    end_time = time_points[idx+1]
    state_intervals.append( (start_time, end_time - start_time) )

# 2. 定义状态-颜色映射,重复状态自动用同色
color_mapping = {
    'A': '#1f77b4',  # 蓝色
    'B': '#ff7f0e',  # 橙色
    'C': '#2ca02c',  # 绿色
    'D': '#d62728'   # 红色
}
bar_colors = [color_mapping[state] for state in state_list]

# 3. 绘制分段条形图
fig, ax = plt.subplots(figsize=(12, 2))
# yrange=(0,1)表示在y轴0-1的位置绘制条形(只有一组状态,所以用单条)
ax.broken_barh(state_intervals, yrange=(0, 1), facecolors=bar_colors)

# 4. 美化图表:设置轴标签、刻度和状态标注
ax.set_xlabel('Time', fontsize=12)
ax.set_yticks([0.5])
ax.set_yticklabels(['System State'], fontsize=12)
ax.set_xlim(0, 10)
ax.grid(axis='x', linestyle='--', alpha=0.7)

# 在每个分段中间添加状态文字标注
for interval, state in zip(state_intervals, state_list):
    start, duration = interval
    ax.text(start + duration/2, 0.5, state, 
            ha='center', va='center', fontweight='bold', fontsize=14)

plt.tight_layout()
plt.show()

为什么这个方案适合你?

  • 简洁高效:broken_barh原生支持分段条形,不用手动计算坐标或者拼接图形
  • 自动填充:完美实现「每个状态向前填充到下一个时间戳」的需求
  • 颜色可控:通过颜色映射可以轻松给同一枚举值分配固定颜色
  • 扩展性强:如果你的数据有多组状态(比如多个系统),只需要调整yrange参数即可绘制多条分段条形

内容的提问来源于stack exchange,提问作者A.Wan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 10:06:17