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

Python Matplotlib绘制按告警频次映射颜色的时间事件图

10分钟粒度告警次数可视化实现方案

matplotlib.eventplot接口原生不支持同一条事件序列下根据数值动态映射颜色深浅,针对需求直接使用二维栅格绘图逻辑实现即可,不需要逐点循环绘制事件标记,实现效率和效果都更稳定。

核心逻辑

  • 先对原始数据做时间重采样:以10分钟为固定间隔补全全量时间区间,无告警记录的区间告警次数填充为0,保证x轴时间刻度连续
  • 以时间为x轴、告警类型为y轴构建二维网格,每个网格的颜色直接对应该区间该类型告警的触发次数,使用单色渐变colormap实现「数值越高、颜色越深」的映射规则
  • 调整坐标轴时间格式、标签可读性,添加颜色条标注数值含义

完整实现代码

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
from matplotlib.colors import Normalize
from matplotlib.cm import ScalarMappable

# ---------------------- 1. 加载样例数据 ----------------------
d1 = {'Date Timestamp': [pd.Timestamp('2019-12-01 00:00:00'), pd.Timestamp('2019-12-01 00:10:00'),
                         pd.Timestamp('2019-12-01 00:20:00'), pd.Timestamp('2019-12-01 00:30:00'),
                         pd.Timestamp('2019-12-01 01:00:00'), pd.Timestamp('2019-12-31 17:40:00'),
                         pd.Timestamp('2019-12-31 20:00:00'), pd.Timestamp('2019-12-31 21:00:00'),
                         pd.Timestamp('2019-12-31 21:30:00'), pd.Timestamp('2019-12-31 22:40:00')],
      'PDAH-3190': [12, 0, 0, 0, 3, 0, 0, 0, 0, 0],
      'LAL-3801B': [0, 0, 0, 6, 0, 0, 0, 9, 0, 0],
      'FALL-3452A': [0, 0, 0, 0, 7, 0, 0, 0, 0, 0],
      'FAL-3452A': [0, 0, 0, 0, 0, 0, 0, 0, 0, 4],
      'AAHH-3032': [1, 1, 2, 1, 1, 0, 0, 0, 0, 0],
      'LAL-3507': [0, 0, 0, 0, 0, 1, 1, 1, 1, 1],
      'LAL-3385': [0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
      'AAH-3042': [0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
      'LAL-3801C': [0, 0, 2, 0, 0, 0, 3, 0, 0, 0],
      'TAL-3730A': [0, 0, 0, 0, 7, 0, 0, 0, 0, 9]}
data = pd.DataFrame(d1)

# ---------------------- 2. 数据预处理:10分钟重采样 ----------------------
# 将时间列设为索引,按10分钟间隔补全所有时间槽,缺失值填0
data = data.set_index('Date Timestamp')
data_resampled = data.resample('10T').sum().fillna(0)
# 转置数据:行为告警类型(y轴),列为时间(x轴)
plot_data = data_resampled.T
alert_types = plot_data.index.tolist()
time_points = mdates.date2num(data_resampled.index.to_pydatetime())

# ---------------------- 3. 绘图配置 ----------------------
fig, ax = plt.subplots(figsize=(16, 7), dpi=100)
# 颜色映射配置:使用蓝色系渐变,0值为浅白色,数值越大颜色越深
norm = Normalize(vmin=0, vmax=plot_data.max().max())
cmap = plt.get_cmap('Blues')

# 绘制二维栅格
im = ax.pcolormesh(time_points, np.arange(len(alert_types)+1), plot_data.values, 
                   cmap=cmap, norm=norm, edgecolor='white', linewidth=0.5)

# ---------------------- 4. 坐标轴调整 ----------------------
# x轴时间格式配置
ax.xaxis.set_major_locator(mdates.AutoDateLocator())
ax.xaxis.set_major_formatter(mdates.DateFormatter('%Y-%m-%d %H:%M'))
plt.xticks(rotation=45, ha='right')
# y轴配置:刻度对应告警类型
ax.set_yticks(np.arange(len(alert_types)) + 0.5)
ax.set_yticklabels(alert_types)
ax.set_ylim(0, len(alert_types))

# 添加颜色条
cbar = fig.colorbar(ScalarMappable(norm=norm, cmap=cmap), ax=ax)
cbar.set_label('10分钟区间内告警触发次数', fontsize=10)

# 布局调整
plt.tight_layout()
plt.show()

自定义调整说明

  • 若需要修改配色,可替换cmap = plt.get_cmap('Blues')中的色卡名称,比如'YlOrRd'为黄橙红渐变、'Greens'为绿色系渐变,均满足数值越高颜色越深的规则
  • 若需要调整颜色对比度,可修改Normalize中的vmax参数:设置更小的vmax会让低次数告警的颜色更深,设置更大的vmax会让高次数告警的颜色区分度更高
  • 若需要调整x轴刻度密度,可将mdates.AutoDateLocator()替换为固定间隔的定位器,比如mdates.HourLocator(interval=24)即按天显示刻度

内容的提问来源于stack exchange,提问作者Ashu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 05:54:14