1. matplotlib 两种接口
matplotlib 有两种接口:基于 MATLAB 的和基于面向对象的。基于 MATLAB 的是 pyplot 提供的,比较简单,但容易混乱;基于面向对象的方法结构清晰,是matplotlib 的精髓。
-
基于 MATLAB 的:自动创建和管理图和坐标系,用 pyplot 函数作图
-
基于面向对象的:显示创建图和坐标系,再调用对象的方法来作图
Python中,万物皆对象,为了高效作图,我们首先需要做的就是学习使用面向对象的接口:
-
容器类:画布(figure)、坐标系(axes)、坐标轴(axis)
-
基础类:线(line)、文本(text)、图例(legend)
-
可设置的样式:刻度(ticker)、点(marker)、网格(grid)、标题(title)
简单来说,figure 是画布,axes 是画布上一个个区域,所有线、点、文字等基础类元素都是寄生在容器类元素上的。
官网也贴心地给出了这些对象的关系,一目了然:
使用面向对象接口时,正确的作图流程应该是:
- 创建
Figure
实例 - 在
Figure
上创建Axes
- 在
Axes
上添加基础类对象
或者简化为:
- 创建
Figure
对象和Axes
对象; - 为每个容器类元素添加基础类元素。
再浓缩成指导思想就是:
- 先找对象
- 再解决问题
打个比方,画图时你需要拿出一张素描纸,这就是创建画布,然后在这张纸上你想画碧海、蓝天、凉亭,你肯定事先会设计在哪个地方画这些内容,你决定的每个元素的放置位置就是在划分子图,而你决定好在哪画之后其实等价于在该子图位置创建了坐标系。后面就容易理解了,你的绘图等价于在子图的坐标系上绘图、添加图例、添加标题等。最后,对于坐标轴的样式(是否显示、刻度范围、刻度标签等),可以通过坐标系对象的方法,得到坐标轴对象,通过坐标轴对象的方法设置。
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) | mappable :cm.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) | 在画布的指定位置添加文本,x ,y 在
0
−
1
0-1
0−1 之间分别表示 width 和 height 的百分比长度,相对于原点 |
fig.add_gridspec(nrows, ncols) | 返回一个基于 fig 划分的 nrows 行 ncols 列的 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)
xmin
、xmax
都是百分比长度 -
axes.axvline(x, ymin, ymax)
画一条垂直线, ( x , y m i n ) (x,ymin) (x,ymin) 到 ( x , y m a x ) (x,ymax) (x,ymax)
ymin
、ymax
都是百分比长度 -
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
任意给一个即可xy1
和xy2
都是tuple
,第一个元素是横坐标,第二个元素是纵坐标
-
-
Contours
axes.contourf()
:该方法根据给定数据画出等高线并填充
-
Array
axes.imshow()
:可视化图片,单通道、三通道、四通道
-
Text and Annotations
-
axes.annotate(text, xy)
用
text
注释点xy
,xy
是元组,详细用法需要时查官网手册 -
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')
b
:bool
类型,表示是否显示网格线which
:major
、minor
、both
,显示哪些刻度的网格线axis
:x
、y
、both
,显示哪些轴的网格线 -
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 相关属性
-
linestyle
或ls
线型
-
linewidth
或lw
设置线宽,浮点数值
5.2 marker 相关属性
-
marker
标记样式
特别地,标记有 mathtext 模式,可以通过 latex 公式输入指定的图案
-
markersize
或ms
marker 的大小
-
fillstyle
marker 填充样式
-
markeredgecolor
或mec
marker 的边缘颜色
-
markeredgewidth
或mew
marker 的边缘宽度
-
markerfacecolor
或mfc
marker 的填充颜色
5.3 color 相关属性
-
color
或c
b
或blue
:蓝色g
或green
:绿色r
或red
:红色c
或cyan
:蓝绿色m
或magenta
:洋红y
或yellow
:黄色k
或black
:黑色w
或white
:白色
也可以用十六进制 RGB 表示,如
"#AE2323"
-
alpha
透明度,0-1 之间
5.4 text 相关属性
-
fontfamily
或family
设置文本字体名称,如
‘serif’
、‘sans-serif’
、‘Microsoft YaHei’
-
fontsize
或size
字体大小
-
fontstyle
或style
设置字体样式
normal
:正常显示italic
:斜体oblique
:倾斜
-
fontweight
或weight
设置字体粗细,如
‘normal’
、‘bold’
等 -
horizontalalignment
或ha
水平方向对齐方式:
'center'
、'right'
、'left'
-
color
文本颜色
-
backgroundcolor
文本区域的背景色
-
position
(x,y)
的元组 -
rotation
文本的旋转,传一个在数学上为正的方向(逆时针)的旋转角度(以度为单位)。“水平”等于0,“垂直”等于90。
6 正确显示中文和负号
plt.rcParams[‘font.sans-serif’] = [‘SimHei’] # 用来正常显示中文标签
plt.rcParams[‘axes.unicode_minus’] = False # 用来正常显示负号