0x00 简介
Matplotlib是Python的一个2D图形库,能够生成各种格式的图形(诸如折线图,散点图,直方图等等),界面可交互(可以利用鼠标对生成图形进行点击操作),同时该2D图形库跨平台,即既可以在Python脚本中编码操作,也可以在Jupyter Notebook中使用,以及其他平台都可以很方便的使用Matplotlib图形库,而且生成图形质量较高,甚至可以达到出版级别。
0x01 折线图绘制
1)plt.plot(x,y,format_string,**kwargs)
x轴数据,y轴数据,format_string控制曲线的格式字串
颜色字符 | 说明 | 标记字符 | 说明 | 标记字符 | 说明 | 标记字符 | 说明 | 风格字符 | 说明 |
b | 蓝色 | . | 点标记 | 1 | 下花三角标记 | h | 竖六边形标记 | ━ | 实线 |
g | 绿色 | , | 像素标记 | 2 | 上花三角标记 | H | 横六边形标记 | ━ ━ | 破折线 |
r | 红色 | o | 实心圈标记 | 3 | 左花三角标记 | + | 十字标记 | ━ . | 点划线 |
c | 青绿色 | v | 倒三角标记 | 4 | 右花三角标记 | x | x标记 | : | 虚线 |
m | 洋红色 | ^ | 上三角标记 | s | 实心方形标记 | D | 菱形标记 | ” | 无线条 |
y | 黄色 | > | 右三角标记 | p | 实心五角标记 | d | 瘦菱形标记 | ||
k | 黑色 | < | 左三角标记 | * | 星型标记 | | | 垂直线标记 | ||
w | 白色 |
#引入pyplt,修改名称为plt import matplotlib.pyplot as plt #对应坐标编写折线图 plt.plot([1,2,3,6],[4,5,8,1],'g-s') #类似print,将图形显示输出 plt.show()

2)在matplotlib中,整个图表为一个figure对象 每一个弹出的小窗口就是一个Figure对象 plt.figure(num,figsize,dpi,**kwargs)其中num为对应窗口数,figsize为窗口大小,dpi为清晰度,值越大越清晰
#引入pyplt,修改名称为plt import matplotlib.pyplot as plt #设置figsize对应宽高 plt.figure(num=3,figsize=(10,10),dpi=10) #对应坐标编写折线图 plt.plot([1,2,3,6],[4,5,8,1],'g-s') #类似print,将图形显示输出 plt.show()
3)保存图片plt.savefig(‘路径’)
例:plt.savefig(‘./1.png’),在plt.show前添加,运行后会在当前路径下生成1.png保存刚刚绘制的图形。
4)设置刻度
#引入pyplt,修改名称为plt import matplotlib.pyplot as plt #设置figsize对应宽高 plt.figure(figsize=(18,10),dpi=80) #对应坐标编写折线图 x = range(2,26,2) y = [15,13,14.5,17,20,25,26,26,27,22,18,15] plt.plot(x,y,'g-s') #设置x轴刻度 plt.xticks(x) #设置x轴中带有0.5刻度 # x1 = [i/2 for i in range(4,51)] # plt.xticks(x1) #设置y轴刻度 plt.yticks(range(min(y),max(y)+1)) #类似print,将图形显示输出 plt.show()

0x02 CTF中应用
[INSHack2019]Drone Motion
一道坐标题,通过正则匹配提取坐标,画图即可。要注意的是,因为是画图,所以每个坐标每一位要加上前面的所有坐标
在sensors.log中看到以下内容

给出了坐标点,那么绘图脚本如下,引用root师傅的脚本:
import re import matplotlib.pyplot as plt x = [] y = [] z = [] a = [] x2,y2,z2=0,0,0 lines = open("sensors.log").readlines() for line in lines: a.append("".join(re.findall("\[drone\]\(DEBUG\)> dir: \(x=(.*?),y=",line))) for i in a: if i != '': x2+=float(i) x.append(float(x2)) a.clear() for line in lines: a.append("".join(re.findall("\[drone\]\(DEBUG\)> dir: \(x=.*?,y=(.*?),z=",line))) for i in a: if i != '': y2+=float(i) y.append(float(y2)) a.clear() for line in lines: a.append("".join(re.findall("\[drone\]\(DEBUG\)> dir: \(x=.*?,y=.*?,z=(.*?)\)",line))) for i in a: if i != '': z2+=float(i) z.append(float(z2)) ax = plt.plot(x, y,'-') plt.axis('equal')# 把单位长度都变的一样 plt.show() plt.savefig("test.png", dpi=1000)

0x03 总结学习
更多 matplotlib 模块的学习可参看:https://zhuanlan.zhihu.com/p/33270402
https://blog.csdn.net/qiurisiyu2016/article/details/80187177