Matplotlib进阶

Matplotlib的三层结构

其中第一层是Matplotlib的绘图区,也就是Canvas。其中的API为:matplotlib.backend_bases.FigureCanvas。所有的图像都是在绘图区中完成的。然后就是渲染器,可以理解为画笔。个人认为,我们通过定义一些图像或者曲线后,这些仍然只是数据,只有在最后一步渲染的时候,才将其画在屏幕上。渲染器的API为matplotlib.backend_bases.Renderer。matplotlib.artist.Artist则是具体的图标组件API,低层的逻辑就是调用渲染器在绘图区中作画。

Artist详解

Artist有两部分组成。首先就是容器,从下图可以得知,container用来装基本要素的地方,包括图形figure、坐标系Axes和坐标轴Axis。
Alt
然后就是基本要素primitive,它包含一些我们要在绘图区作图用到的标准图形对象,如曲线Line2D,文字text,矩形Rectangle,图像image等。

画图的流程

  1. 创建一个Figure实例
  2. 使用Figure实例创建一个或者多个Axes或Subplot实例
  3. 使用Axes实例的辅助方法来创建primitive

下面一个例子,是50题精通Matplotlib的第二个例子,画出0-10的sin图像。

# 画出X=(0,10)之间的sin图像
import matplotlib.pyplot as plt
import numpy as np

fig = plt.figure()

ax = fig.add_subplot(2, 1, 1) # 创建一个两行一列的子图,ax是第一个子图

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()# 获取轴视角(位置)的间隔
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值