一、Matplotlib axes类使用详解
Matplotlib首先需要通过调用pyplot模块中提供的figure()函数创建图形对象,然后通过对对象添加一个或多个axes绘图区域,具体的axes类的函数有以下3种:
2D 绘图区域(axes)包含两个轴(axis)对象;如果是 3D 绘图区域,则包含三个。
1.add_axes()函数
调用 add_axes() 方法是以figure()函数创建的画布为对象,生成一个 axes 绘图区域,其位置由4个浮点数元素组成的列表确定,形如 add_axes([left, bottom, width, height]) ,表示添加到画布中的矩形区域的左下角坐标(x, y),以及宽度和高度,4个参数的取值范围均在0-1之间。
每个元素的值是在将整个画布的长,宽看作单位1的前提下取值,比如,[ 0.1, 0.1, 0.8, 0.8],left=0.1是相对于长的1/10,bottom=0.1是相对于宽的1/10从而定位绘图区域的原点位置
直观展示如下:
import matplotlib.pyplot as plt
import numpy as np
fig = plt.figure()
ax = fig.add_axes([0.1,0.1,0.8,0.8])
plt.show()
绘制的图形区域为如下所示:
2.legend()绘制图例
专业术语是图例,简单理解就是对绘图区域中包含所有线型的标注说明
axes类中的legend()函数是以创建的绘图区域为对象绘制画布中的图例,形如ax.legend(handles, labels, loc) ,它的三个参数说明:
- handles 参数,它也是一个列表,它包含了所有线型的实例,若没有说明则按之前代码绘制的线型为默认顺序对其进行名称标注,即对应标注的线型对象
- labels 是一个字符串列表,用来指定标签的名称,即命名相应对象的名称
- loc 是指定图例位置的参数,其参数值可以用字符串或整数来表示,即说明标注的位置
下面是 loc 参数的表示方法,分为字符串和整数两种:
位置 | 自适应、右(左)上方、 左(右)下、 右侧、居中靠左(右)、底部(上部)居中、中部 |
---|
字符串表示 | Best、upper right(left)、lower left(right)、right、center left(right)、lower(upper) center、center | 整数数字表示 | 0、1(2)、3(4)、5、6(7)、8(9)、10 |
3.plot()绘制线型
这是 axes 类的基本方法也是以创建的绘图区域为对象绘制画布中的线型,它将一个数组的值比如x,与另一个数组的值比如y ,绘制成线或标记plot() 方法具有可选格式的字符串参数,该参数用来指定线型、标记颜色、样式以及大小,形如ax.plot(x,y,'go-- ')
- 颜色代码如下:
蓝色 | 绿色 | 红色 | 青色 | 品红色 | 黄色 | 黑色 | 白色 |
---|
‘b’ | 'g’ | ‘r’ | ‘c’ | ‘m’ | ‘y’ | ‘k’ | ‘w’ |
- 标记符号如下:
点标记 | 圆圈标记 | 'X’标记 | 砖石标记 | 六角标记 | 正方形标记 | 加号标记 |
---|
‘.’ | ‘o’ | ‘x’ | ‘D’ | ‘H’ | ‘s’ | ‘+’ |
- 线型表示字符如下:
实线 | 虚线 | 点划线 | 虚线 | 六角标记 |
---|
’-’ | ‘–’ | ‘-.’ | ‘H’ | |
4.实例演示
下面的例子,以直线图的形式展示了电视、智能手机广告费与其所带来产品销量的关系图。其中描述电视的是带有黄色和方形标记的实线,而代表智能手机的则是绿色和圆形标记的虚线。
import matplotlib.pyplot as plt
y = [1, 4, 9, 16, 25,36,49, 64]
x1 = [1, 16, 30, 42,55, 68, 77,88]
x2 = [1,6,12,18,28, 40, 52, 65]
fig = plt.figure()
ax = fig.add_axes([0,0,1,1])
l1 = ax.plot(x1,y,'ys-')
l2 = ax.plot(x2,y,'go--')
ax.legend(labels=(['tv', 'Smartphone']),loc = 'lower right')
ax.set_title("Advertisement effect on sales")
ax.set_xlabel('medium')
ax.set_ylabel('sales')
plt.show()
显示的效果如下:
二、subplot()函数用法详解
Matplotlib首先要调用pyplot模型中提供的subplot()函数,该函数可以将一个(图形对象)画布上均等的划分若干个子绘制区域进行操作,函数格式为plt.subplot(nrows, ncols, index) ,nrows 与 ncols 表示要划分几行几列的子区域(nrows*nclos表示子图数量),index 的初始值为1,用来选定具体的某个子区域,具体排列顺序是按从左向右,你上到下原则创建的。
例如:如subplot(233)表示在当前画布的右上角创建一个两行三列的绘图区域(如下图所示),同时选择在第 3 个位置绘制子图,
使用的三个原则和方法如下:
- 若使用
subplot() 函数在指定区域创造的新建子图与现有的子图重叠,那么重叠部分的子图将会被自动删除,因为它们不可以共享绘图区域
import matplotlib.pyplot as plt
plt.plot([1,2,3])
plt.subplot(211)
plt.plot(range(12))
plt.subplot(212, facecolor='y')
plt.plot(range(12))
plt.show()
上述代码运行结果,如下图所示:
- 如果不想覆盖之前的图,需要使用
add_subplot() 函数,代码如下:
import matplotlib.pyplot as plt
fig = plt.figure()
plt.plot([1,2,3])
ax2 = fig.add_subplot(221,facecolor='y')
ax2.plot(range(12))
plt.show()
执行上述代码,输出结果如下:
- 通过给画布添加 axes 对象可以实现在同一画布中插入另外的图像
import matplotlib.pyplot as plt
fig = plt.figure()
ax1 = fig.add_axes([0.1,0.1,0.8,0.8])
ax1.plot([1,2,3],'b')
ax2 = fig.add_axes([0.6,0.2,0.3,0.3])
ax2.plot([1,2,3],'r')
ax2.set_xlabel('x')
ax2.set_ylabel('y')
asx2.set_title('linear')
plt.show()
输出结果如下:
三、subplots()函数详解
matplotlib中调用的pyplot还提供了subplots()函数,使用方法和 subplot() 函数类似。其不同之处在于,subplots() 既创建了一个包含子图区域axes,又创建了一个 figure 图形对象,而 subplot() 只是创建一个包含子图区域的figure图形对象。其函数格式为fig , a = plt.subplots(nrows, ncols) ,函数的返回值是一个元组,包括一个图形对象和所有的 axes 对象。其中 axes 对象的数量等于 nrows * ncols,且每个 axes 对象均可通过索引值访问(从0开始)
import matplotlib.pyplot as plt
fig,a = plt.subplots(2,2)
import numpy as np
x = np.arange(1,5)
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('square root')
a[1][0].plot(x,np.exp(x))
a[1][0].set_title('exp')
a[1][1].plot(x,np.log10(x))
a[1][1].set_title('log')
plt.show()
输出结果为:
四、subplot2grid()函数详解
matplotlib.pyplot 模块提供了 subplot2grid() ,与 subplot() 和 subplots() 函数不同,subplot2gird() 函数以非等分的形式对画布进行切分,并按照绘图区域的大小来展示最终绘图结果。其函数格式为plt.subplot2grid(shape, location, rowspan, colspan) ,具体用函数参数意义为:
- shape:把该参数值规定的网格区域作为绘图区域;
- location:在给定的位置绘制图形,初始位置 (0,0) 表示第1行第1列;
- rowsapan/colspan:这两个参数用来设置让子区跨越几行几列。
import matplotlib.pyplot as plt
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),rowspan = 2, colspan = 2)
import numpy as np
x = np.arange(1,10)
a2.plot(x, x*x)
a2.set_title('square')
a1.plot(x, np.exp(x))
a1.set_title('exp')
a3.plot(x, np.log(x))
a3.set_title('log')
plt.tight_layout()
plt.show()
输出结果为:
|