折线图是我们平时数据分析过程中最常用的,通过本次参加国际 AIOPS 比赛,积累了不少画图的经验,再此整理出来与大家分享。
本文使用代码在 macOS Monterey 12.2.1 测试通过,Pyhon 版本 3.9.6
本文所使用的代码和数据集可以在我的 Github 上获取
首先介绍下我使用的数据结构,这是一份时序数据,时间戳是一个乱序的一天内的时间戳,配置项ID类似于主机名,有多个重复的配置项。指标名也有多个重复的指标,最后一列是具体的值。
| timestamp | cmdb_id | kpi_name | value | 
| 时间戳 | 配置项ID | 指标名 | 指标值 | 
| 1647792000 | node-1 | ping.can_connect | 1.0 | 
| 1647792000 | node-2 | system.load.5 | 3.96 | 
- 单折线图
- 多折线图
- 折线图标注数据点
- 折线图叠加矩形
单折线图
只画出一个配置项、一个指标的时间序列的折线图。
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 
 | def single_line():
 df = pd.read_csv('data.csv')
 
 df = df[ df['cmdb_id'].str.contains('node-1')]
 
 df = df[ df['kpi_name'].str.contains('system.load.5') ]
 df.sort_values('timestamp')
 
 
 
 
 fig = plt.figure(figsize=(14,8))
 plt.rcParams["figure.autolayout"] = True
 plt.rcParams['font.sans-serif'] = ['Songti SC']
 plt.rcParams['axes.unicode_minus'] = False
 
 plt.plot(df['timestamp'], df['value'], c = ‘lime’, label='node-1')
 plt.xlabel( 'Timestamp' )
 plt.ylabel( df['kpi_name'].iloc[1] )
 plt.legend( loc = 'best' )
 plt.show()
 
 | 
多折线图
数据文件 cmdb_id 中有两个不重复的配置项,画出这两个配置项 system.load.5 这个指标的折线图。
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 
 | def multi_line():
 df = pd.read_csv('data.csv')
 
 
 
 
 fig = plt.figure(figsize=(14,8))
 plt.rcParams["figure.autolayout"] = True
 plt.rcParams['font.sans-serif'] = ['Songti SC']
 plt.rcParams['axes.unicode_minus'] = False
 
 
 adf = df[ df['cmdb_id'].str.contains('node-1')]
 
 adf = adf[ df['kpi_name'].str.contains('system.load.5') ]
 adf.sort_values('timestamp')
 plt.plot(adf['timestamp'], adf['value'], c = 'teal', label='node-1')
 
 
 bdf = df[ df['cmdb_id'].str.contains('node-2')]
 
 bdf = bdf[ df['kpi_name'].str.contains('system.load.5') ]
 bdf.sort_values('timestamp')
 plt.plot( bdf['timestamp'], bdf['value'], c = 'red', label='node-2')
 
 plt.xlabel( 'Timestamp' )
 plt.ylabel( df['kpi_name'].iloc[1] )
 plt.legend( loc = 'best' )
 plt.show()
 
 | 
折线图标注数据点
将故障点标注在曲线的对应位置。
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 
 | def line_with_dot():
 df = pd.read_csv('data.csv')
 
 df = df[ df['cmdb_id'].str.contains('node-1')]
 
 df = df[ df['kpi_name'].str.contains('system.load.5') ]
 df.sort_values('timestamp')
 
 
 
 
 fig = plt.figure(figsize=(14,8))
 plt.rcParams["figure.autolayout"] = True
 plt.rcParams['font.sans-serif'] = ['Songti SC']
 plt.rcParams['axes.unicode_minus'] = False
 
 plt.plot(df['timestamp'], df['value'], c = 'red', label='node-1')
 
 
 plt.plot(1647823965, df['value'].max(), 'o')
 plt.text(1647823965, df['value'].max() + 0.4, 'node-1,node节点CPU故障' , ha = 'left', va = 'top', fontsize = 8)
 
 plt.xlabel( 'Timestamp' )
 plt.ylabel( df['kpi_name'].iloc[1] )
 plt.legend( loc = 'best' )
 plt.show()
 
 | 
折线图叠加矩形区域
在做异常检测的时候,会标注某个时间段的数据属于异常数据,这时会叠加一个矩形区域来表示。
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 
 | def line_with_rect():
 df = pd.read_csv('data.csv')
 
 df = df[ df['cmdb_id'].str.contains('node-1')]
 
 df = df[ df['kpi_name'].str.contains('system.load.5') ]
 df.sort_values('timestamp')
 
 
 
 
 fig, ax = plt.subplots()
 plt.rcParams["figure.autolayout"] = True
 plt.rcParams['font.sans-serif'] = ['Songti SC']
 plt.rcParams['axes.unicode_minus'] = False
 
 ax.plot(df['timestamp'], df['value'], c = 'blue', label='node-1')
 
 
 ax.plot(1647823965, df['value'].max(), 'o')
 ax.text(1647823965, df['value'].max() + 0.4, 'node-1,node节点CPU故障' , ha = 'left', va = 'top', fontsize = 8)
 
 
 ax.add_patch( patches.Rectangle( (1647823965, 0), 1200, df['value'].max() , facecolor = "red", alpha=0.5) )
 ax.annotate( '故障区域', xy=( 1647823965, df['value'].max()), xytext=(1647823965 + 1200, df['value'].max() - 2) )
 
 plt.xlabel( 'Timestamp' )
 plt.ylabel( df['kpi_name'].iloc[1] )
 plt.legend( loc = 'best' )
 plt.show()
 
 | 
这几个都是在本次参加 AIOPS 比赛过程中,为了方便查看指标情况积累的作图技巧,后续如果有折线图更多的内容,会继续在这里更新。