Matplotlib的三层结构
其中第一层是Matplotlib的绘图区,也就是Canvas。其中的API为:matplotlib.backend_bases.FigureCanvas。所有的图像都是在绘图区中完成的。然后就是渲染器,可以理解为画笔。个人认为,我们通过定义一些图像或者曲线后,这些仍然只是数据,只有在最后一步渲染的时候,才将其画在屏幕上。渲染器的API为matplotlib.backend_bases.Renderer。matplotlib.artist.Artist则是具体的图标组件API,低层的逻辑就是调用渲染器在绘图区中作画。
Artist详解
Artist有两部分组成。首先就是容器,从下图可以得知,container用来装基本要素的地方,包括图形figure、坐标系Axes和坐标轴Axis。 然后就是基本要素primitive,它包含一些我们要在绘图区作图用到的标准图形对象,如曲线Line2D,文字text,矩形Rectangle,图像image等。
画图的流程
- 创建一个Figure实例
- 使用Figure实例创建一个或者多个Axes或Subplot实例
- 使用Axes实例的辅助方法来创建primitive
下面一个例子,是50题精通Matplotlib的第二个例子,画出0-10的sin图像。
import matplotlib.pyplot as plt
import numpy as np
fig = plt.figure()
ax = fig.add_subplot(2, 1, 1)
t = np.arange(0, 10, 0.01)
s = np.sin(t)
print(t, s)
line, = ax.plot(t, s)
plt.show()
primitive的内容介绍
primitive中的几个基本类型,曲线-Line2D,矩形-Rectangle,图像-image等等。其中,line2d是用来画正常的曲线图,矩形是用来画直方图或者柱状图,image可以用来显示图像。 线型图和柱状图都十分简单。下面可以看一下,image的使用方法。
import matplotlib.pyplot as plt
import numpy as np
methods = [None, 'none', 'nearest', 'bilinear', 'bicubic', 'spline16',
'spline36', 'hanning', 'hamming', 'hermite', 'kaiser', 'quadric',
'catrom', 'gaussian', 'bessel', 'mitchell', 'sinc', 'lanczos']
grid = np.random.rand(4, 4)
fig, axs = plt.subplots(nrows=3, ncols=6, figsize=(9, 6),
subplot_kw={'xticks': [], 'yticks': []})
for ax, interp_method in zip(axs.flat, methods):
ax.imshow(grid, interpolation=interp_method, cmap='viridis')
ax.set_title(str(interp_method))
plt.tight_layout()
plt.show()
container介绍
Figure
首先是Figure,它有一个axes的列表。当我们使用Figure.add_subplot()或者Figure.add_axes()添加子图的时候,都会被添加到axes列表中.我们可以通过Figure.axes来获取这一列表的内容。 由于Figure维持了current axes,因此你不应该手动的从Figure.axes列表中添加删除元素,而是要通过Figure.add_subplot()、Figure.add_axes()来添加元素,通过Figure.delaxes()来删除元素。但是你可以迭代或者访问Figure.axes中的Axes,然后修改这个Axes的属性。 常见属性: Figure.patch属性:Figure的背景矩形 Figure.axes属性:一个Axes实例的列表(包括Subplot) Figure.images属性:一个FigureImages patch列表 Figure.lines属性:一个Line2D实例的列表(很少使用) Figure.legends属性:一个Figure Legend实例列表(不同于Axes.legends) Figure.texts属性:一个Figure Text实例列表
Axes
Axes是Matplotlib的核心。它有许多内置的方法,可以添加内容进入Axes。 Axes有许多方法用于绘图,如.plot()、.text()、.hist()、.imshow()等方法用于创建大多数常见的primitive(如Line2D,Rectangle,Text,Image等等)。 Subplot就是一个特殊的Axes,其实例是位于网格中某个区域的Subplot实例。其实你也可以在任意区域创建Axes,通过Figure.add_axes([left,bottom,width,height])来创建一个任意区域的Axes,其中left,bottom,width,height都是[0—1]之间的浮点数,他们代表了相对于Figure的坐标。 我们也可以使用Axes的辅助方法.add_line()和.add_patch()方法来直接添加。 常见属性: artists: Artist实例列表 patch: Axes所在的矩形实例 collections: Collection实例 images: Axes图像 legends: Legend 实例 lines: Line2D 实例 patches: Patch 实例 texts: Text 实例 xaxis: matplotlib.axis.XAxis 实例 yaxis: matplotlib.axis.YAxis 实例
Axis
Axis也存储了用于自适应,平移以及缩放的data_interval和view_interval。它还有Locator实例和Formatter实例用于控制刻度线的位置以及刻度label。 每个Axis都有一个label属性,也有主刻度列表和次刻度列表。这些ticks是axis.XTick和axis.YTick实例,它们包含着line primitive以及text primitive用来渲染刻度线以及刻度文本。 刻度是动态创建的,只有在需要创建的时候才创建(比如缩放的时候)。Axis也提供了一些辅助方法来获取刻度文本、刻度线位置等等: 常见的如下:
# 不用print,直接显示结果
from IPython.core.interactiveshell import InteractiveShell
InteractiveShell.ast_node_interactivity = "all"
fig, ax = plt.subplots()
x = range(0,5)
y = [2,5,7,8,10]
plt.plot(x, y, '-')
axis = ax.xaxis # axis为X轴对象
axis.get_ticklocs() # 获取刻度线位置
axis.get_ticklabels() # 获取刻度label列表(一个Text实例的列表)。 可以通过minor=True|False关键字参数控制输出minor还是major的tick label。
axis.get_ticklines() # 获取刻度线列表(一个Line2D实例的列表)。 可以通过minor=True|False关键字参数控制输出minor还是major的tick line。
axis.get_data_interval()# 获取轴刻度间隔
axis.get_view_interval()# 获取轴视角(位置)的间隔
|