PyLab
PyLab 是一个面向 Matplotlib 的绘图库接口,其语法和 MATLAB 十分相近。它和 Pyplot 模快都够实现 Matplotlib 的绘图功能。PyLab 是一个单独的模块,随 Matplotlib 软件包一起安装,该模块的导包方式和 Pyplot 不同,如下所示:
- \#Pyplot导包方式
- from matplotlib import pyplot as plt
- \#PyLab导包有两种方式
- import pylab
- from pylab import *
PyLab 是一个很便捷的模块,下面对它的使用方法做相应的介绍。
基本绘图
绘制曲线图
提供一对相同长度的数组(或序列),然后使用plot()绘制曲线,示例如下:
from numpy import *
from pylab import *
x=linspace(-5,5,30)
y=x**4
plot(x,y)
输出结果:
红点曲线图
如果您要绘制特殊类型的线条,并想添加一些颜色,PyLab 提供了如下方法:
符号 | '-','--','-.',':','.',',',,o,^,v,\<,\>,s,+,x,D,d,1,2,3,4,h,H,p,\ | ,\_ |
---|
颜色 | b(蓝色),g(绿色),r(红色),c(青色),m(品红),y(黄色),k(黑色),w(白色) |
使用示例如下:
from numpy import *
from pylab import *
x=linspace(-5,5,30)
y=x**4
plot(x,y,'g.')
输出结果:
绘制多条不同曲线
如果您想在同一绘图区域内绘制多个图形,只需要使用多个绘图命令。示例如下:
from pylab import *
import numpy as np
import math
x=np.arange(0,math.pi*2,0.01)
plot(x,sin(x))
plot(x,cos(x),'g-.')
plot(x,-cos(x),'r--')
输出结果:
figure
Matplotlib 提供了matplotlib.figure图形类模块,它包含了创建图形对象的方法。通过调用 pyplot 模块中 figure() 函数来实例化 figure 对象。如下所示:
- from matplotlib import pyplot as plt
- \#创建图形对象
- fig = plt.figure()
该函数的参数值,如下所示:
参数 | 说明 |
---|
figsize | 指定画布的大小,(宽度,高度),单位为英寸。 |
dpi | 指定绘图对象的分辨率,即每英寸多少个像素,默认值为80。 |
facecolor | 背景颜色。 |
dgecolor | 边框颜色。 |
frameon | 是否显示边框。 |
figure图形绘制
figure() 创建一个空白画布:
fig = plt.figure()
我们使用 add_axes() 将 axes 轴域添加到画布中。如下所示:
ax=fig.add_axes([0,0,1,1])
add_axes() 的参数值是一个序列,序列中的 4 个数字分别对应图形的左侧,底部,宽度,和高度,且每个数字必须介于 0 到 1 之间。
设置 x 和 y 轴的标签以及标题,如下所示:
- ax.set_title("sine wave")
- ax.set_xlabel('angle')
- ax.set_ylabel('sine')
调用 axes 对象的 plot() 方法,对 x 、 y 数组进行绘图操作:
ax.plot(x,y)
完整的代码如下所示:
import numpy as np
from matplotlib import pyplot as plt
import math
x=np.arange(-math.pi*4,math.pi*4,0.01)
y=sin(x)
fig=plt.figure()
ax=fig.add_axes([0,0,1,1])
ax.plot(x,y,'r-.')
ax.set_title("sin")
ax.set_xlabel('x')
ax.set_ylabel('y')
plt.show()
输出结果如下:
legend()绘制图例
axes 类的 legend() 方法负责绘制画布中的图例,它需要三个参数,如下所示:
ax.legend(handles, labels, loc)
- labels 是一个字符串序列,用来指定标签的名称;
- loc 是指定图例位置的参数,其参数值可以用字符串或整数来表示;
- handles 参数,它也是一个序列,它包含了所有线型的实例;
下面是 loc 参数的表示方法,分为字符串和整数两种,如下所示:
位置 | 字符串表示 | 整数数字表示 |
---|
自适应 | Best | 0 |
右上方 | upper right | 1 |
左上方 | upper left | 2 |
左下 | lower left | 3 |
右下 | lower right | 4 |
右侧 | right | 5 |
居中靠左 | center left | 6 |
居中靠右 | center right | 7 |
底部居中 | lower center | 8 |
上部居中 | upper center | 9 |
中部 | center | 10 |
axes.plot()
这是 axes 类的基本方法,它将一个数组的值与另一个数组的值绘制成线或标记,plot() 方法具有可选格式的字符串参数,用来指定线型、标记颜色、样式以及大小。
颜色代码如下表:
'b' | 蓝色 |
---|
'g' | 绿色 |
'r' | 红色 |
'c' | 青色 |
'm' | 品红色 |
'y' | 黄色 |
'k' | 黑色 |
'w' | 白色 |
标记符号如下表:
标记符号 | 描述 |
---|
'.' | 点标记 |
'o' | 圆圈标记 |
'x' | 'X'标记 |
'D' | 钻石标记 |
'H' | 六角标记 |
's' | 正方形标记 |
'+' | 加号标记 |
线型表示字符,如下表:
字符 | 描述 |
---|
'-' | 实线 |
'--' | 虚线 |
'-.' | 点划线 |
':' | 虚线 |
'H' | 六角标记 |
下面的例子,以直线图的形式展示了电视、智能手机广告费与其所带来产品销量的关系图。其中描述电视的是带有黄色和方形标记的实线,而代表智能手机的则是绿色和圆形标记的虚线。
from matplotlib import pyplot as plt
import numpy as np
import math
x=np.arange(-math.pi*2,math.pi*2,0.001)
y=cos(x)
y1=sin(x)
fig=plt.figure()
ax=fig.add_axes([0.1,0.1,1.2,1.2])
ax.plot(x,y,'r-.')
ax.plot(x,y1,'g-.')
ax.legend(labels=('cos','sin'),loc='lower right')
ax.set_title("sin and cos")
ax.set_xlabel('x')
ax.set_ylabel('y')
plt.show()
输出结果如下:
subplot
matplotlib.pyplot模块提供了一个 subplot() 函数,它可以均等地划分画布,该函数的参数格式如下:
plt.subplot(nrows, ncols, index)
nrows 与 ncols 表示要划分几行几列的子区域(nrows*nclos表示子图数量),index 的初始值为1,用来选定具体的某个子区域。
例如: subplot(233)表示在当前画布的右上角创建一个两行三列的绘图区域(如下图所示),同时,选择在第 3 个位置绘制子图。
图1:示意图
如果新建的子图与现有的子图重叠,那么重叠部分的子图将会被自动删除,因为它们不可以共享绘图区域。
from matplotlib import pyplot as plt
plt.subplot(311)
plt.plot(facecolor='g')
plt.plot(range(20))
plt.subplot(312,facecolor='y')
plt.plot(range(10))
plt.subplot(313,facecolor='c')
plt.plot(range(15))
上述代码运行结果,如下图所示:
图2:subplot绘制结果
如果不想覆盖之前的图,需要使用 add_subplot() 函数,代码如下:
import matplotlib.pyplot as plt
fig = plt.figure()
ax1 = fig.add_subplot(111,facecolor='w')
ax1.plot([1,2,3])
ax2 = fig.add_subplot(221, facecolor='y')
ax2.plot([1,2,3])
执行上述代码,输出结果如下:
图3:add_subplot()绘图结果
通过给画布添加 axes 对象可以实现在同一画布中插入另外的图像。
from matplotlib import pyplot as plt
import numpy as np
import math
x=np.arange(-math.pi*2,math.pi*2,0.01)
y1=np.sin(x)
y2=np.cos(x)
fig=plt.figure()
ax1=fig.add_axes([0,0,1,1])
ax2=fig.add_axes([0.8,0.8,0.9,0.9])
ax1.set_xlabel('x')
ax2.set_xlabel('x')
ax1.set_ylabel('sin(x)')
ax2.set_ylabel('cos(x)')
ax1.set_title("sin(x)")
ax2.set_title("cos(x)")
ax1.plot(x,y1,'r-.')
ax2.plot(x,y2,'g-.')
plt.show()
输出结果如下:
图4:输出结果图
subplots
matplotlib.pyplot模块提供了一个 subplots() 函数,它的使用方法和 subplot() 函数类似。其不同之处在于,subplots() 既创建了一个包含子图区域的画布,又创建了一个 figure 图形对象,而 subplot() 只是创建一个包含子图区域的画布。
subplots 的函数格式如下:
fig , ax = plt.subplots(nrows, ncols)
nrows 与 ncols 表示两个整数参数,它们指定子图所占的行数、列数。
函数的返回值是一个元组,包括一个图形对象和所有的 axes 对象。其中 axes 对象的数量等于 nrows * ncols,且每个 axes 对象均可通过索引值访问(从1开始)。
下面我们创建了一个 2 行 2 列的子图,并在每个子图中显示 4 个不同的图像。
from matplotlib import pyplot as plt
import numpy as np
fig,a=plt.subplots(2,2)
x=np.arange(-10,10,0.01)
a[0][0].plot(x,x*x)
a[0][0].set_title('square')
a[0][1].plot(x,np.sqrt(x))
a[0][1].set_title('sqrt')
a[1][0].plot(x,exp(x))
a[1][0].set_title('exp(x)')
a[1][1].plot(x,log2(x))
a[1][1].set_title('log2(x)')
plt.show()
上述代码的输出结果如下:
subplot2grid()
matplotlib.pyplot 模块提供了 subplot2grid() ,该函数能够在画布的特定位置创建 axes 对象(即绘图区域)。不仅如此,它还可以使用不同数量的行、列来创建跨度不同的绘图区域。与 subplot() 和 subplots() 函数不同,subplot2gird() 函数以非等分的形式对画布进行切分,并按照绘图区域的大小来展示最终绘图结果。
函数语法格式如下:
plt.subplot2grid(shape, location, rowspan, colspan)
参数含义如下:
- shape:把该参数值规定的网格区域作为绘图区域;
- location:在给定的位置绘制图形,初始位置 (0,0) 表示第1行第1列;
- rowsapan/colspan:这两个参数用来设置让子区跨越几行几列。
下面,在画布(figure)中添加了行、列跨度均不相同的绘图子区域,然后在每个绘图区上,绘制不同的图形。示例代码如下:
from matplotlib import pyplot as plt
import numpy as np
import math
a1=plt.subplot2grid((3,3),(0,0),colspan=2)
a2=plt.subplot2grid((3,3),(0,2),rowspan=3)
a3=plt.subplot2grid((3,3),(1,0),colspan=2,rowspan=2)
x=np.arange(-math.pi*2,math.pi*2,0.1)
a1.plot(x,np.sin(x),'r-.')
a2.plot(x,np.exp(x),'c-')
a3.plot(x,np.cos(x),'g-.')
plt.show()
输出结果如下:
图1:subplot2grid()输出结果
grid()
grid() 的函数使用格式如下:
grid(color='b', ls = '-.', lw = 0.25)
参数含义如下:
- color:表示网格线的颜色;
- ls:表示网格线的样式;
- lw:表示网格线的宽度;
网格在默认状态下是关闭的,通过调用上述函数,网格会被自动开启,如果您只是想开启不带任何样式的网格,可以通过 grid(True) 来实现。
from matplotlib import pyplot as plt
import numpy as np
import math
fig,a=plt.subplots(1,3,figsize=(12,6))
x=np.arange(0,20,1)
a[0].plot(x,x**3,'g-.',lw=2)
a[0].grid(True)
a[0].set_xlabel('x')
a[0].set_ylabel('y')
a[0].set_title("y=x**3")
a[1].plot(x,np.exp(x),'r--',lw=2)
a[1].grid(True)
a[1].set_xlabel('x')
a[1].set_ylabel('y')
a[1].set_title("y=exp(x)")
a[2].plot(x,np.log2(x),'c-',lw=2)
a[2].grid(True)
a[2].set_xlabel('x')
a[2].set_ylabel('y')
a[2].set_title("y=.log2(x)")
fig.tight_layout()
fig.show()
上述代码执行后,输出结果
:
图1:输出结果
在一个函数图像中,有时自变量 x 与因变量 y 是指数对应关系,这时需要将坐标轴刻度设置为对数刻度。Matplotlib 通过 axes 对象的xscale或yscale属性来实现对坐标轴的格式设置。
示例:右侧的子图显示对数刻度,左侧子图则显示标量刻度。
- import matplotlib.pyplot as plt
- import numpy as np
- fig, axes = plt.subplots(1, 2, figsize=(10,4))
- x = np.arange(1,5)
- axes[0].plot( x, np.exp(x))
- axes[0].plot(x,x**2)
- axes[0].set_title("Normal scale")
- axes[1].plot (x, np.exp(x))
- axes[1].plot(x, x**2)
- \#设置y轴
- axes[1].set_yscale("log")
- axes[1].set_title("Logarithmic scale (y)")
- axes[0].set_xlabel("x axis")
- axes[0].set_ylabel("y axis")
- axes[0].xaxis.labelpad = 10
- \#设置x、y轴标签
- axes[1].set_xlabel("x axis")
- axes[1].set_ylabel("y axis")
- plt.show()
图1:对数关系图
轴的设置
轴是连接刻度的线,也就是绘图区域的边界,在绘图区域(axes 对象)的顶部、底部、左侧和右侧都有一个边界线(轴)。通过指定轴的颜色和宽度,从而对进行显示格式设置,比如将所有轴的颜色设置为 None,那么它们都会成为隐藏状态,或者也可以给轴添加相应的颜色。以下示例为左侧轴、底部轴分别设置了红色、蓝色,如下所示:
- import matplotlib.pyplot as plt
- fig = plt.figure()
- ax = fig.add_axes([0,0,1,1])
- \#为左侧轴,底部轴添加颜色
- ax.spines['bottom'].set_color('blue')
- ax.spines['left'].set_color('red')
- ax.spines['left'].set_linewidth(2)
- \#将侧轴、顶部轴设置为None
- ax.spines['right'].set_color(None)
- ax.spines['top'].set_color(None)
- ax.plot([1,2,3,4,5])
- plt.show()
输出结果如下:
设置x,y轴
Matplotlib 可以根据自变量与因变量的取值范围,自动设置 x 轴与 y 轴的数值大小。当然,您也可以用自定义的方式,通过 set_xlim() 和 set_ylim() 对 x、y 轴的数值范围进行设置。
当对 3D 图像进行设置的时,会增加一个 z 轴,此时使用 set_zlim() 可以对 z 轴进行设置。
下面示例分别对自动设置和自定义设置做了演示:第一种 Matplotlib 自动设置
- import matplotlib.pyplot as plt
- import numpy as np
- fig = plt.figure()
- \#添加绘图区域
- a1 = fig.add_axes([0,0,1,1])
- \#准备数据
- x = np.arange(1,10)
- \#绘制函数图像
- a1.plot(x, np.exp(x))
- \#添加题目
- a1.set_title('exp')
- plt.show()
代码执行后,输出结果如下:
图1:输出结果
第二种:自定义设置,set_xlim() 将 x 轴的数值范围设置为(0到10); set_ylim() 将 y 轴的范围设置为(0到10000)。
from matplotlib import pyplot as plt
import numpy as np
import math
x=np.arange(0,10)
y=np.exp(x)
plg=plt.figure()
a1=plg.add_axes([0,0,1,1])
a1.plot(x,y)
a1.set_xlim(0,15)
a1.set_ylim(0,10000)
输出结果如下:
设置刻度
刻度指的是轴上数据点的标记,Matplotlib 能够自动的在 x 、y 轴上绘制出刻度。这一功能的实现得益于 Matplotlib 内置的刻度定位器和格式化器(两个内建类)。在大多数情况下,这两个内建类完全能够满足我们的绘图需求,但是在某些情况下,刻度标签或刻度也需要满足特定的要求,比如将刻度设置为“英文数字形式”或者“大写阿拉伯数字”,此时就需要对它们重新设置。
xticks() 和 yticks() 函数接受一个列表对象作为参数,列表中的元素表示对应数轴上要显示的刻度。如下所示:
ax.set_xticks([2,4,6,8,10])
x 轴上的刻度标记,依次为 2,4,6,8,10。您也可以分别通过 set_xticklabels() 和 set_yticklabels() 函数设置与刻度线相对应的刻度标签。
下面示例对刻度和标签的使用方法做了说明。
from matplotlib import pyplot as plt
import numpy as np
import math
x=np.arange(0,10)
y=np.exp(x)
plg=plt.figure()
a1=plg.add_axes([0,0,1,1])
a1.plot(x,y)
a1.set_xticklabels([i for i in range(11)])
a1.set_yticklabels([math.e**i for i in range(10)])
输出结果如下:
图1:绘制坐标轴刻度与标签