『matplotlib』面向对象绘图

1. matplotlib 两种接口

matplotlib 有两种接口:基于 MATLAB 的和基于面向对象的。基于 MATLAB 的是 pyplot 提供的,比较简单,但容易混乱;基于面向对象的方法结构清晰,是matplotlib 的精髓。

  • 基于 MATLAB 的:自动创建和管理图和坐标系,用 pyplot 函数作图

  • 基于面向对象的:显示创建图和坐标系,再调用对象的方法来作图

Python中,万物皆对象,为了高效作图,我们首先需要做的就是学习使用面向对象的接口:

  • 容器类:画布(figure)、坐标系(axes)、坐标轴(axis)

  • 基础类:线(line)、文本(text)、图例(legend)

  • 可设置的样式:刻度(ticker)、点(marker)、网格(grid)、标题(title)

简单来说,figure 是画布,axes 是画布上一个个区域,所有线、点、文字等基础类元素都是寄生在容器类元素上的。

官网也贴心地给出了这些对象的关系,一目了然:

在这里插入图片描述

使用面向对象接口时,正确的作图流程应该是:

  1. 创建 Figure 实例
  2. Figure 上创建 Axes
  3. Axes 上添加基础类对象

或者简化为:

  1. 创建 Figure 对象和 Axes 对象;
  2. 为每个容器类元素添加基础类元素。

再浓缩成指导思想就是:

  1. 先找对象
  2. 再解决问题

打个比方,画图时你需要拿出一张素描纸,这就是创建画布,然后在这张纸上你想画碧海、蓝天、凉亭,你肯定事先会设计在哪个地方画这些内容,你决定的每个元素的放置位置就是在划分子图,而你决定好在哪画之后其实等价于在该子图位置创建了坐标系。后面就容易理解了,你的绘图等价于在子图的坐标系上绘图、添加图例、添加标题等。最后,对于坐标轴的样式(是否显示、刻度范围、刻度标签等),可以通过坐标系对象的方法,得到坐标轴对象,通过坐标轴对象的方法设置。

2. Figure 对象

这个函数是最基本的创建画布的函数,后面创建多子图的画布时,每个子图内部调用的也是这个函数

import matplotlib.pyplot as plt
fig = plt.figure(
    num=1,                 # 图形的唯一标识符,一般用不到
    figsize=(6, 6),        # 画布大小, (Width, height),单位:inches
    dpi=300,               # 图像分辨率
    facecolor='w',         # 背景色,是画布底下图层的颜色,默认白色
    linewidth=0,           # 画布边框的宽度,默认 0,无边框
    edgecolor='w',         # 边框颜色,要设置 linewidth 较大时才能看见,默认白色
    frameon=True,          # 默认值 True 为绘制边框,如果为 False 则不绘制边框
)

matplotlib 官方并没有很好地分离 pyplot 函数和面向对象的函数,创建画布还是要用 pyplot 的函数

Figure 对象 fig 的常用方法

方法功能
fig.get_axes()返回该画布中所有子图坐标系对象的列表
fig.gca()获取当前的坐标系,当有多个子图时,画图时切换到一个个子图画的,该函数就返回当时所在的坐标系对象
fig.colorbar(mappable, cax, ax)mappablecm.ScalarMappable(cmap='jet')
cax:colorbar 画在哪个坐标系中
ax:针对哪个坐标系匹配的 colorbar
该函数返回一个 matplotlib.colorbar.Colorbar 对象
fig.legend()给整个画布插入统一的图例,返回一个 matplotlib.legend.Legend 对象
fig.show()类似 plt.show(),将画布显示出来
fig.add_subplot(122)插入一张子图,位置在将画布划分为 1 行 2 列后的第 2 个位置,也可以指定 GridSpec 对象的切片位置
返回当前子图的 Axes 对象
fig.subplots(nrows=2,ncols=2)创建 2 行 2 列的子图,返回每个子图 Axes 对象的数组
fig.suptitle("视图名称")给整个画布添加统一的图名,居中显示
fig.text(x, y, s)在画布的指定位置添加文本,xy 0 − 1 0-1 01 之间分别表示 widthheight 的百分比长度,相对于原点
fig.add_gridspec(nrows, ncols)返回一个基于 fig 划分的 nrowsncols 列的 GridSpec 对象

3. Axes 对象

Axes 对象 axes 的常用属性和方法如下:

Plotting

  • Basic

    各种基本的画图函数,很简单,官网自取使用方式

  • Spans

    • xes.axhline(y, xmin, xmax)

      画一条水平线, ( x m i n , y ) (xmin,y) (xmin,y) ( x m a x , y ) (xmax,y) (xmax,y)

      xminxmax 都是百分比长度

    • axes.axvline(x, ymin, ymax)

      画一条垂直线, ( x , y m i n ) (x,ymin) (x,ymin) ( x , y m a x ) (x,ymax) (x,ymax)

      yminymax 都是百分比长度

    • axes.axhspan(ymin, ymax, xmin, xmax)

      画一个水平的矩形覆盖范围,y 是实际坐标,x 是百分比坐标

    • axes.axvspan(xmin, xmax, ymin, ymax)

      画一个垂直的矩形覆盖范围,x 是实际坐标,y 是百分比坐标

    • axes.axline(xy1, xy2, slope=1)

      或一条直线,第一个点 xy1 必须,第二个点坐标 xy2 或者斜率 slope 任意给一个即可

      xy1xy2 都是 tuple,第一个元素是横坐标,第二个元素是纵坐标

  • Contours

    • axes.contourf():该方法根据给定数据画出等高线并填充
  • Array

    • axes.imshow():可视化图片,单通道、三通道、四通道
  • Text and Annotations

    • axes.annotate(text, xy)

      text 注释点 xyxy 是元组,详细用法需要时查官网手册

    • axes.text(x, y, s)

      在该 axes 所在子图指定位置添加文本

    • axes.table()

      画表格的方法,目前没用过,可以查官网手册

    • axes.arrow(x, y, dx, dy)

      画起点 ( x , y ) (x, y) (x,y) 终点 ( x + d x , y + d y ) (x+dx, y+dy) (x+dx,y+dy) 的箭头

    • Axes.inset_axes()

      不确定要不得到,功能如图:

      在这里插入图片描述

  • Fields

    • axes.barbs()

      在这里插入图片描述

    • axes.quiver()

    在这里插入图片描述

Appearance

  • axes.axis()

    • axes.axis('off'):关闭坐标轴显示,其上刻度标签、刻度线这些都会隐藏,等价于 axes.set_axis_off()
    • axes.axis('on'):打开关闭内容,等价于 axes.set_axis_on()
  • axes.set_frame_on(True)

    设置坐标系的上下左右四个轴是否显示,如隐藏,标签刻度仍然会显示

  • axes.get_frame_on(True)

    返回四个轴是否显示

  • axes.grid(b, which='major', axis='both')

    bbool类型,表示是否显示网格线

    whichmajorminorboth,显示哪些刻度的网格线

    axisxyboth,显示哪些轴的网格线

  • axes.set_facecolor(color)

    设置坐标系四个轴围起来区域的背景色

  • axes.get_facecolor()

    返回坐标系的背景色,rgba 格式

Axis / limits

💥axes.get_xaxis():返回一个 XAxis 实例

💥axes.get_yaxis():返回一个 YAxis 实例

  • Axis limits and direction

    • axes.invert_xaxis()

      逆置 x 轴

    • axes.invert_yaxis()

      逆置 y 轴

    • axes.set_xlim(left, right)

      设置 x 轴显示范围

    • axes.set_ylim(left, right)

      设置 y 轴显示范围

  • Axis labels, title, and legend

    • axes.set_xlabel(label)

      给 x 轴设置名称

    • axes.set_ylabel(label)

      给 y 轴设置名称

    • axes.set_title(title)

      给当前坐标系的子图设置图名

    • axes.legend()

      给当前坐标系添加图例

  • Ticks and tick labels

    • axes.set_xticks(ticks_list)axes.set_yticks(ticks_list)

      设置要显示的主要刻度

    • axes.set_xticklabels(labels)axes.set_yticklabels(labels)

      替换显示的主刻度的标签,比如原来是 1~20,我替换成 20~40 显示

    • axes.minorticks_off()axes.minorticks_on()

      坐标系(不)显示 minor 刻度

    • axes.tick_params(args)

      更改刻度线,刻度线标签和网格线的外观

  • Twinning

    • axes.twinx()axes.twiny()

      创建一个新的坐标系,该坐标系的 x 轴不可见,而独立的 y 轴与原始轴相反(即在右侧)

      创建一个新的坐标系,该坐标系的 y 轴不可见,而独立的 x 轴与原始轴相反(即在上侧)

      此类方法返回新的 Axes 对象

4. Axis 对象

Axis 对象 axis 的常用属性和方法如下:

  • Formatters and Locators

    • axis.set_major_locator()
    • axis.set_major_formatter()
    • axis.set_minor_locator()
    • axis.set_minor_formatter()
    • axis.set_tick_params():设置刻度的位置等
    • axis.set_ticks_position():设置刻度线出现的位置(上下左右)

    设置主次刻度及其标签的格式的,需要时查这里的用法

  • Grid

    • axis.grid():只在该轴显示网格线

Axis 对象一般都是修改坐标轴的样式

5. 常用的公用属性

这些属性可以用在多个函数的参数中,含义是一样的,都是用来调整样式

5.1 line 相关属性

  • linestylels

    线型

    在这里插入图片描述

  • linewidthlw

    设置线宽,浮点数值

5.2 marker 相关属性

  • marker

    标记样式

    在这里插入图片描述

    特别地,标记有 mathtext 模式,可以通过 latex 公式输入指定的图案

    在这里插入图片描述

  • markersizems

    marker 的大小

  • fillstyle

    marker 填充样式

在这里插入图片描述

  • markeredgecolormec

    marker 的边缘颜色

  • markeredgewidthmew

    marker 的边缘宽度

  • markerfacecolormfc

    marker 的填充颜色

5.3 color 相关属性

  • colorc

    • bblue:蓝色
    • ggreen:绿色
    • rred:红色
    • ccyan:蓝绿色
    • mmagenta:洋红
    • yyellow:黄色
    • kblack:黑色
    • wwhite:白色

    也可以用十六进制 RGB 表示,如"#AE2323"

  • alpha

    透明度,0-1 之间

5.4 text 相关属性

  • fontfamilyfamily

    设置文本字体名称,如‘serif’‘sans-serif’‘Microsoft YaHei’

  • fontsizesize

    字体大小

  • fontstylestyle

    设置字体样式

    • normal:正常显示
    • italic:斜体
    • oblique:倾斜
  • fontweightweight

    设置字体粗细,如‘normal’‘bold’

  • horizontalalignmentha

    水平方向对齐方式:'center''right''left'

  • color

    文本颜色

  • backgroundcolor

    文本区域的背景色

  • position

    (x,y)的元组

  • rotation

    文本的旋转,传一个在数学上为正的方向(逆时针)的旋转角度(以度为单位)。“水平”等于0,“垂直”等于90。

6 正确显示中文和负号

plt.rcParams[‘font.sans-serif’] = [‘SimHei’]      # 用来正常显示中文标签
plt.rcParams[‘axes.unicode_minus’] = False        # 用来正常显示负号
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值