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
相关产品推荐
相关产品推荐

