简介
使用matplotlib绘图,一个非常基础的问题就是要搞清楚画布和坐标轴。只有真正了解这两个概念,才能获得对整个绘图过程的控制权。
画布(Figure)
想要绘图就需要一张画布,所有的内容都是放在画布上面的。通过Figure对象,我们能够创建一张画布。
>>>import matplotlib.pyplot as plt
>>>plt.figure()
>>>plt.show()
1
2
3
4
>>>importmatplotlib.pyplotasplt
>>>plt.figure()
>>>plt.show()
使用
plt.figure() 创建一个Figure对象,通过
plt.show() 显示出来:
坐标轴(axes)
有了画布,接下来就需要在这张画布上绘图,因此我们首先需要创建一个坐标轴,可以调用Figure实例的
add_axes 方法:
>>>fig = plt.figure()
>>>ax = fig.add_axes([0.1, 0.1, 0.8, 0.8]) # [距离左边,下边,坐标轴宽度,坐标轴高度] 范围(0, 1)
>>>plt.show()
1
2
3
>>>fig=plt.figure()
>>>ax=fig.add_axes([0.1,0.1,0.8,0.8])# [距离左边,下边,坐标轴宽度,坐标轴高度] 范围(0, 1)
>>>plt.show()
[0.1,0.1,0.8,0.8] 表示的是在画布中,坐标轴距离画布左边0.1倍的位置,距离下边0.1倍的位置,确定了这两个位置后,坐标轴的整体宽度和高度占0.8倍的大小,换句话说,距离右边和上边0.9(0.1+0.8)倍。得到如下结果:
如果你之前就接触过一些绘图的命令,你会发现:
>>>plt.plot([0, 1, 2])
>>>plt.show()
1
2
>>>plt.plot([0,1,2])
>>>plt.show()
直接使用这两个命令就能绘图呀,不需要定义画布和坐标轴,得到如下图:
这是因为matplotlib会在最近用过的坐标轴上进行绘图,如果没有的话,默认会创建一个画布和坐标轴。但是显示创建画布和坐标轴的好处是让我们对绘图过程有了完全的控制权(比如可以指定在什么地方绘图),而且绘图的逻辑更强。接下来我们绘制一张图中图来理解这个过程:
>>>import numpy as np
>>>x = np.linspace(0, 10, 10)
>>>y = np.sin(x)
# 创建画布
>>>fig = plt.figure()
# 创建坐标轴
>>>ax1 = fig.add_axes([0.1, 0.1, 0.8, 0.8]) # 第一个坐标轴的范围
>>>ax2 = fig.add_axes([0.2, 0.5, 0.4, 0.3]) # 第二个坐标轴的范围
>>>ax1.plot(x, y, 'r')
>>>ax2.plot(x, y, 'g')
>>>plt.show()
1
2
3
4
5
6
7
8
9
10
11
12
13
>>>importnumpyasnp
>>>x=np.linspace(0,10,10)
>>>y=np.sin(x)
# 创建画布
>>>fig=plt.figure()
# 创建坐标轴
>>>ax1=fig.add_axes([0.1,0.1,0.8,0.8])# 第一个坐标轴的范围
>>>ax2=fig.add_axes([0.2,0.5,0.4,0.3])# 第二个坐标轴的范围
>>>ax1.plot(x,y,'r')
>>>ax2.plot(x,y,'g')
>>>plt.show()
得到如下图形:
在这里我们创建了两个坐标轴
ax1 和
ax2 ,分别对两个坐标轴指定范围并作图。
图片尺寸大小
在创建 Figure 对象的时候,我们可以使用
figsize 和
dpi 控制图片尺寸。比如:
>>>fig = plt.figure(figsize=(16,8), dpi=100)
1
>>>fig=plt.figure(figsize=(16,8),dpi=100)
figsize 表示画布长宽大小,单位为英寸;
dpi 表示每英寸的像素值。因此上面的命令就创建了一张1600*800像素的画布。
保存图片
从上面输出的结果来看,
plt.show() 并不是输出一张图片,而是一个交互式的绘图界面。如果要保存图片,还需要通过
savefig() 保存。没有显式指定画布和坐标轴,直接使用
plt.savefig() 保存也可以,显式指明了画布可以用Figure实例的方法
fig.savefig() 。matplotlib 可以生成多种格式的高质量图像,包括PNG,JPG,EPS,SVG,PGF 和 PDF。只要写好后缀名:
>>>fig.savefig("result.png")
1
>>>fig.savefig("result.png")
总结
建议按照显式的方法去绘图:先创建画布,再创建坐标轴,最后在坐标轴上绘图。这种代码方式会让绘图逻辑更加清晰,能够随心所欲的修改图片的每个地方。