matplotlib绘图库之Artist对象详解


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()

运行之后,我们可以得到两张空图:

matplotlib绘图库之Artist对象详解

在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()

matplotlib绘图库之Artist对象详解

一般情况下,我们不会在Figure中绘制这样的图像,这样一张图只能绘制一组图像,所以就用到了Axes对象来添加子图。
Axes对象
Axes,称之为子图,可以这样理解,在绘制漫画的时候,一张画布上有很多格子,不同的格子内容可以独立绘制,这里的格子就是Axes对象。
在某张Figure中添加子图的时候有两种常用方式:

figure.add_axes()
figure.add_subplot()

简单例子:

ax1 = fig1.add_subplot(221)
ax2 = fig1.add_subplot(224)


效果如下:

matplotlib绘图库之Artist对象详解

ax3 = fig2.add_axes([0.2, 0.2, 0.6, 0.4])
ax4 = fig2.add_axes([0.2, 0.7, 0.6, 0.2])

效果如下:

matplotlib绘图库之Artist对象详解

这里的函数传入四个参数,分别指定了左边距,下边距,宽度和高度,都是小于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()

效果如下:

matplotlib绘图库之Artist对象详解

有了每个格子,那么最后一步就是每一个格子中的内容了。
曲线等简单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子图中绘制

matplotlib绘图库之Artist对象详解

同样,每条曲线,或者每个坐标轴都是一个对象,例如,获取曲线对象,如对它的属性进行设置,同样设置的方式有两种,分别是集中设置或者分散设置:

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)

效果:

matplotlib绘图库之Artist对象详解

上面演示的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()

基本就这样。

linuxboy的RSS地址:https://www.linuxboy.net/rssFeed.aspx

本文永久更新链接地址:https://www.linuxboy.net/Linux/2019-03/157626.htm

相关内容