在机器学习的结果分析,准确率和损失、数据分析上经常要用到图标显示,这里学习了一下python中经常使用的图表库,做一下记录。
官网:https://matplotlib.org/ 各个模型缩略图:https://matplotlib.org/gallery.html
matplotlib
是python
最著名的绘图库,它提供了一整套和matlab相似的命令API,十分适合交互式地进行制图。而且也可以方便地将它作为绘图控件,嵌入GUI应用程序中。
它的文档相当完备,并且 Gallery页面 中有上百幅缩略图,打开之后都有源程序。因此如果你需要绘制某种类型的图,只需要在这个页面中浏览/复制/粘贴一下,基本上都能搞定。
本章节作为matplotlib
的入门介绍,将较为深入地挖掘几个例子,从中理解和学习matplotlib
绘图的一些基本概念。
matplotlib的pyplot子库提供了和matlab类似的绘图API,方便用户快速绘制2D图表。让我们先来看一个简单的例子:
import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(0, 10, 1000)
y = np.sin(x)
z = np.cos(x**2)
plt.figure(figsize=(8,4))
plt.plot(x,y,label="$sin(x)$",color="red",linewidth=2)
plt.plot(x,z,"b--",label="$cos(x^2)$")
plt.xlabel("Time(s)")
plt.ylabel("Volt")
plt.title("PyPlot First Example")
plt.ylim(-1.2,1.2)
plt.legend()
plt.show()
输出:
详细介绍:
matplotlib中的快速绘图的函数库可以通过如下语句载入:
import matplotlib.pyplot as plt
接下来调用figure
创建一个绘图对象,并且使它成为当前的绘图对象。
plt.figure(figsize=(8,4))
也可以不创建绘图对象直接调用接下来的plot
函数直接绘图,matplotlib
会为我们自动创建一个绘图对象。如果需要同时绘制多幅图表的话,可以是给figure
传递一个整数参数指定图标的序号,如果所指定序号的绘图对象已经存在的话,将不创建新的对象,而只是让它成为当前绘图对象。
通过figsize
参数可以指定绘图对象的宽度和高度,单位为英寸;dpi
参数指定绘图对象的分辨率,即每英寸多少个像素,缺省值为80。因此本例中所创建的图表窗口的宽度为8*80 = 640像素。
但是用工具栏中的保存按钮保存下来的png图像的大小是800*400像素。这是因为保存图表用的函数savefig使用不同的DPI配置,savefig
函数也有一个dpi参数,如果不设置的话,将使用matplotlib
配置文件中的配置。
下面的两行程序通过调用plot函数在当前的绘图对象中进行绘图:
lt.plot(x,y,label="$sin(x)$",color="red",linewidth=2)
plt.plot(x,z,"b--",label="$cos(x^2)$")
plot
函数的调用方式很灵活,第一句将x,y数组传递给plot
之后,用关键字参数指定各种属性:
- label : 给所绘制的曲线一个名字,此名字在图示(legend)中显示。只要在字符串前后添加"$"符号,matplotlib就会使用其内嵌的latex引擎绘制的数学公式。
- color : 指定曲线的颜色
- linewidth : 指定曲线的宽度
第二句直接通过第三个参数"b--"
指定曲线的颜色和线型,这个参数称为格式化参数,它能够通过一些易记的符号快速指定曲线的样式。其中b表示蓝色,"–"表示线型为虚线。在IPython中输入 “plt.plot?” 可以查看格式化字符串的详细配置。
接下来通过一系列函数设置绘图对象的各个属性:
plt.xlabel("Time(s)")
plt.ylabel("Volt")
plt.title("PyPlot First Example")
plt.ylim(-1.2,1.2)
plt.legend()
- xlabel : 设置X轴的文字
- ylabel : 设置Y轴的文字
- title : 设置图表的标题
- ylim : 设置Y轴的范围
- legend : 显示图示(即图中左下角的长方形区域)
属性设置
matplotlib
所绘制的图的每个组成部分都对应有一个对象,我们可以通过调用这些对象的属性设置方法set_*
或者pyplot
的属性设置函数setp
设置其属性值。例如plot函数返回一个matplotlib.lines.Line2D
对象的列表,下面的例子显示如何设置Line2D对象的属性:
import numpy as np
import matplotlib.pyplot as plt
x = np.arange(-5, 5, 0.1)
line, = plt.plot(x, x*x) # plot返回一个列表,通过line,获取其第一个元素
line.set_antialiased(False) # 调用Line2D对象的set_*方法设置属性值
plt.show()
这段例子中,通过调用Line2D对象line的set_antialiased方法,关闭对象的反锯齿效果。或者通过调用plt.setp函数配置多个Line2D对象的颜色和线宽属性。如果没有关闭反锯齿,效果图应该是如下:
同样我们可以通过调用Line2D对象的get_*方法,或者plt.getp函数获取对象的属性值:
>>> line.get_linewidth()
1.0
>>> plt.getp(lines[0], "color") # 返回color属性
'r'
>>> plt.getp(lines[1]) # 输出全部属性
alpha = 1.0
animated = False
antialiased or aa = True
axes = Axes(0.125,0.1;0.775x0.8)
... ...
注意getp函数只能对一个对象进行操作,它有两种用法:
- 指定属性名:返回对象的指定属性的值
- 不指定属性名:打印出对象的所有属性和其值
matplotlib的整个图表为一个Figure对象,此对象在调用plt.figure函数时返回,我们也可以通过plt.gcf函数获取当前的绘图对象:
>>> f = plt.gcf()
>>> plt.getp(f)
alpha = 1.0
animated = False
...
绘制多轴图
一个绘图对象(figure)可以包含多个轴(axis),在Matplotlib中用轴表示一个绘图区域,可以将其理解为子图。上面的第一个例子中,绘图对象只包括一个轴,因此只显示了一个轴(子图)。我们可以使用subplot函数快速绘制有多个轴的图表。subplot函数的调用形式如下:
subplot(numRows, numCols, plotNum)
subplot
将整个绘图区域等分为numRows行 * numCols列
个子区域,然后按照从左到右,从上到下的顺序对每个子区域进行编号,左上的子区域的编号为1。如果numRows,numCols和plotNum这三个数都小于10的话,可以把它们缩写为一个整数,例如subplot(323)和subplot(3,2,3)是相同的。subplot在plotNum
指定的区域中创建一个轴对象。如果新创建的轴和之前创建的轴重叠的话,之前的轴将被删除。
下面的程序创建3行2列共6个轴,通过axisbg参数给每个轴设置不同的背景颜色。
for idx, color in enumerate("rgbyck"):
plt.subplot(320+idx+1, axisbg=color)
plt.show()
输出:
如果希望某个轴占据整个行或者列的话,可以如下调用subplot:
plt.subplot(321) # 第一行的左图
plt.subplot(322) # 第一行的右图
plt.subplot(323) # 第二行的左图
plt.subplot(313) # 第三行整行
plt.show()
输出: