Matplotlib是一个面向对象的绘图库,在最终图像上所呈现出来的所有元素,都是一个可以控制的对象,那么如何理解绘图的过程呢?可以简单地类比在画布上画图的过程,
首先大致的绘制流程:
创建Figure对象(相当于在画架上添加画布)
为灭一个Figure对象添加一个或者多个Axes对象(在某张画布上划分不同的画图区域)
调用Axes对象的方法来创建各种简单类型的Artist对象(在某一个画图区域添加各种具体的元素)
简单来说,最大的Figure中可以包含多个Axes,在每个Axes中,又可以绘制各种基本的图像。
具体来看三种层次的主要对象:
Figure对象
Figure对象,或者说是容器,是最大一层次的对象,就相当于一张画布,包含图像的所有元素,一个Figure对象最后的表现就是一张图像,例如:
import matplotlib.pyplot as plt
import numpy as np
from matplotlib.lines import Line2D
fig1 = plt.figure(1)
fig2 = plt.figure(2)
plt.show()
运行之后,我们可以得到两张空图:
在Figure中也可以添加简单的Artist对象,比如文字,线条等,例如添加两条线:
import matplotlib.pyplot as plt
import numpy as np
from matplotlib.lines import Line2D
fig1 = plt.figure()
line1 = Line2D([1, 0], [1, 0], transform=fig1.transFigure, figure=fig1, color='r')
line2 = Line2D([1, 0], [0, 1], transform=fig1.transFigure, figure=fig1, color='g')
fig1.lines.extend([line1, line2])
plt.show()
一般情况下,我们不会在Figure中绘制这样的图像,这样一张图只能绘制一组图像,所以就用到了Axes对象来添加子图。
Axes对象
Axes,称之为子图,可以这样理解,在绘制漫画的时候,一张画布上有很多格子,不同的格子内容可以独立绘制,这里的格子就是Axes对象。
在某张Figure中添加子图的时候有两种常用方式:
figure.add_axes()
figure.add_subplot()
简单例子:
ax1 = fig1.add_subplot(221)
ax2 = fig1.add_subplot(224)
效果如下:
ax3 = fig2.add_axes([0.2, 0.2, 0.6, 0.4])
ax4 = fig2.add_axes([0.2, 0.7, 0.6, 0.2])
效果如下:
这里的函数传入四个参数,分别指定了左边距,下边距,宽度和高度,都是小于1 的数字,其实就相当于等比例划分,大致估计一下宽度和高度就可以看出来。
其实这两个方法创建的对象还是有点区别的,add_subplot() 函数创建的对象是SubplotAxes, 另一个则是Axes对象,SubplotAxes是Axes的派生类。
下面这个例子中说明一些dui子图对象属性的设置方法,对于所有的对象都可以使用这两种方式:
import matplotlib.pyplot as plt
import numpy as np
fig1 = plt.figure()
# 可以设置多个属性的值
ax1 = fig1.add_subplot(221)
ax1.set(facecolor='lightgreen', title='Axes 1')
# 分别设置每种属性
ax2 = fig1.add_subplot(224)
ax2.set_facecolor('lightblue')
ax2.set_title('Axes 2')
plt.show()
效果如下:
有了每个格子,那么最后一步就是每一个格子中的内容了。
曲线等简单Artist对象
绘制好了格子,那么添加的曲线,刻度等都是最后一层的内容了,例如,在不同Axes中绘制图像,在上面的代码中添加:
x = np.linspace(-np.pi, np.pi, 100)
y1 = np.sin(x)
y2 = np.cos(x)
ax1.plot(x, y1) # 在ax1子图中绘制
ax2.plot(x, y2) # 在 ax2子图中绘制
同样,每条曲线,或者每个坐标轴都是一个对象,例如,获取曲线对象,如对它的属性进行设置,同样设置的方式有两种,分别是集中设置或者分散设置:
line1 = ax1.plot(x, y1)[0] # 注意 获取曲线对象的方式返回的是一个list,所以注明是第一个元素
line1.set_color('red')
line1.set_linewidth(5)
line2 = ax2.plot(x, y2)[0]
line2.set(color='blue', linewidth=2)
效果:
上面演示的Line对象,还有像Axis对象,控制的是坐标轴,包括对刻度等等进行设置,原理是一样的。
import matplotlib.pyplot as plt
import numpy as np
fig1 = plt.figure()
# 可以设置多个属性的值
ax1 = fig1.add_subplot(221)
ax1.set(facecolor='lightgreen', title='Axes 1')
# 分别设置每种属性
ax2 = fig1.add_subplot(224)
ax2.set_facecolor('lightblue')
ax2.set_title('Axes 2')
x = np.linspace(-np.pi, np.pi, 100)
y1 = np.sin(x)
y2 = np.cos(x)
ax1.plot(x, y1) # 在ax1子图中绘制
ax2.plot(x, y2) # 在 ax2子图中绘制
line1 = ax1.plot(x, y1)[0] # 注意 获取曲线对象的方式返回的是一个list,所以注明是第一个元素
line1.set_color('red')
line1.set_linewidth(5)
line2 = ax2.plot(x, y2)[0]
line2.set(color='blue', linewidth=2)
plt.show()
基本就这样。
Linux公社的RSS地址:https://www.linuxidc.com/rssFeed.aspx