机器学习基础5--python画图库matplotlib(上)

图像是我们最直观的数据表达方式,python的matplotlib库可以用来画图。下面来简单总结下matplotlib的使用方法。

上篇讲matplot画图中用到的基础对象,包括图像Figure平面曲线Line2D坐标轴Axes图例Legend, 注解Annotation, 注释Text

理解这些对象,有利于我们更好的用matplot画图。

matplotlib 导入

1
import matplotlib.pyplot as plt

简单demo

1
2
3
4
5
6
7
8
x = np.linspace(-1, 1, 50)
y = 2 * x + 1
# 创建图像
plt.figure()
# plot(x,y)画(x,y)曲线
plt.plot(x, y)
# 显示图像
plt.show()

基础属性

图像Figure

matplot中,图像对应的定义类是matplotlib.figure.Figure

1
2
# num 标识编号,figsize 8英寸*5英寸,dpi图像的dp密度,facecolor背景色白色,edgecolor背景色白色
plt.figure(num=1, figsize=(8,5), dpi=100, facecolor='w', edgecolor='w')

plt.figure()创建了图像,并返回matplotlib.figure.Figure对象,这里我们选择隐式处理返回的对象。

平面曲线Line2D

通过plot()方法创建matplotlib.line.Line2D对象

1
2
3
4
# 指定曲线的颜色,线的宽度,线的样式。
plt.plot(x, y1, color='red', linewidth=1.0, linestyle='--')
# 添加多条曲线
plt.plot(x, y2)

具体的参数可以在matplotlib.pyplot.Line2D的初始化函数里找到:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
def __init__(self, xdata, ydata,
linewidth=None, # all Nones default to rc
linestyle=None,
color=None,
marker=None,
markersize=None,
markeredgewidth=None,
markeredgecolor=None,
markerfacecolor=None,
markerfacecoloralt='none',
fillstyle=None,
antialiased=None,
dash_capstyle=None,
solid_capstyle=None,
dash_joinstyle=None,
solid_joinstyle=None,
pickradius=5,
drawstyle=None,
markevery=None,
**kwargs
):

坐标轴Axes

坐标轴的定义类是matplotlib.Axes

1
2
3
4
5
6
7
8
9
10
11
# xlim()和ylim()设置坐标轴范围
plt.xlim((-1, 2))
plt.ylim((-2, 3))
# xlabel()和ylabel()设置坐标轴名称
plt.xlabel('X')
plt.ylabel('Y')
# 借助numpy的linspace()方法,设置更复杂的坐标,-1到2,总共5个坐标点
new_ticks = np.linspace(-1, 2, 5)
plt.xticks(new_ticks)
# 也可以指定具体的点和标签值
plt.yticks(ticket=[-2, -1.8, -1, 1.22, 3],labels=[r'$really\ bad$', r'$bad$', r'$normal$', r'$good$', r'$really\ good$'])

我们可以看到,这里二维图像默认的坐标轴有四条(上下左右)

更复杂的坐标轴设置:

1
2
3
4
5
# 获取坐标轴实例
ax = plt.gca()
# 隐藏右边和上面的坐标轴
ax.spines['right'].set_color('none')
ax.spines['top'].set_color('none')

调整坐标轴上刻度的位置

1
2
# 值可以选择top,bottom,both,default,none
ax.xaxis.set_ticks_position('bottom')

默认的坐标轴之间的连接处类似于矩形,我们可以调整坐标轴之间连接处具体的位置

1
2
3
# spines指定修改的是哪一条坐标轴,set_position()有好几个重载方法,这里用到的是set_position(self, position),,其中position参数是一个二维tuple。
# 第一个值是type,可选的type有"outward","axes","data".
ax.spines['bottom'].set_position(('outward', 10))

『outward』数组的第二个值是个数值,0的话,x轴与y轴的焦点正好在y轴最底部,如果n>0,相当于向y轴负方向移动距离n。
『axes』 数组的第二个值取值范围0.0-1.0,表示将端点放在坐标轴的指定比例的位置
『data』 数组的第二个值就是坐标轴上具体的位置

图例Legend

图例对应着的是 matplot.legend类

1
2
3
4
5
6
# 图例的话,需要先通过plot()方法创建Line2D对象
l1, = plt.plot(x, y1, label='linear line')
l2, = plt.plot(x, y2, color='red', linewidth=1.0, linestyle='--', label='square line')

# loc指定位置,如图例放在右上角就是loc='upper right', 'best'表示自动分配最佳位置,label表示图例的名称
plt.legend(handles=[l1, l2], labels=['up', 'down'], loc='best')

注解Annotation

注解对应着的是 matplot.text.Annotation

1
2
3
4
5
6
7
8
9
plt.annotate(r'$2x+1=%s$' % y0,
xy=(x0, y0), # 对(1,3)这个点的描述
xycoords='data', # 基于数据的值来选位置
xytext=(+30, -30), # xytext=(+30, -30)表示xy偏差值,
textcoords='offset points',# 对标注位置的描述
fontsize=16,
arrowprops=dict( # 对箭头类型的设置
arrowstyle='->',
connectionstyle="arc3,rad=.2")

注释Text

注释对应的定义类是 matplot.text.Text

1
2
3
4
5
6
7
8
plt.text(x=-3.7,
y=3,
s=r'$This\ is\ the\ some\ text. \mu\ \sigma_i\ \alpha_t$',
fontdict={
'size': 16,
'color': 'r'
}
)

通过上面的注释和注解,我们再补充一条线段,一个点

1
2
3
4
5
# 画虚线
plt.plot([x0, x0, ], [0, y0, ], 'k--', linewidth=2.5)
# 画点
plt.scatter([x0, ], [y0, ], s=50, color='b')
plt.show()