Python笔记 #3 Matplotlib
本文最后更新于:2022年11月22日 下午
学习 Machine Learning 的时候发现需要用许多矩阵运算和画图的库,本文将以 实用主义 的方式记录每次遇到的新用法。
2021 年贵系的暑培新增了「科学计算」内容,本文部分内容参考了清华 LZJ 同学的教程。本文将持续更新。
Matplotlib 基础
绘图时最常用的模块是 Matplotlib 中的
pyplot
模块。绘图时先调用相关绘图函数,设置图像各种细节,最后调用
plt.show()
打开新窗口显示图片,此时程序会暂停。如果使用
%matplotlib inline
方法,可以使图片在 Cell 中显示而不开新窗口(适用于 Notebook)。
这时会出现一个基于 Qt 实现的交互窗口,程序执行到
plt.show()
时阻塞。在交互窗口中可以
进一步调整图片
格式细节或
保存图片
,关闭窗口后程序继续运行。下面以一个例子说明:
1 |
|
格式字符串
与 Matlab 相似,Matplotlib 使用事先约定好的字符串代表
绘图格式
,将其写入
plt.plot()
即可,如
plt.plot(x, y, 'bo')
即蓝色圆圈标记。
-
color
:绘制点的颜色,支持以下常用缩写(还有更多未列出的颜色全名),还可以用十六进制代码c='#000'
指定。
字符 | 颜色 | 字符 | 颜色 | 字符 | 颜色 | 字符 | 颜色 |
---|---|---|---|---|---|---|---|
b
|
蓝色 |
r
|
红色 |
m
|
洋红色 |
k
|
黑色 |
g
|
绿色 |
c
|
青色 |
y
|
黄色 |
w
|
白色 |
-
color#xkcd
:xkdc 调色盘总结了数百种最常用的颜色,比标准色更美观,使用c='xkcd:pink'
格式即可使用。
全称 | 颜色 | 全称 | 颜色 | 全称 | 颜色 | 全称 | 颜色 |
---|---|---|---|---|---|---|---|
pink
|
粉色 |
sky blue
|
天蓝色 |
orange
|
橘色 |
light green
|
嫩绿色 |
light purple
|
嫩紫色 |
lavender
|
粉紫色 |
tan
|
褐色 |
aqua
|
海绿色 |
-
marker
:绘制点的形状。
字符 | 标记 | 字符 | 标记 | 字符 | 标记 | 字符 | 标记 |
---|---|---|---|---|---|---|---|
.
|
点标记 |
>
|
右三角标记 |
p
|
五边形标记 |
D
|
菱形标记 |
,
|
像素标记 |
1
|
三叉戟标记 |
*
|
星形标记 |
d
|
菱形标记 |
o
|
圆圈标记 |
2
|
三叉戟标记 |
h
|
六角形标记 |
丨
|
竖线标记 |
v
|
倒三角标记 |
3
|
三叉戟标记 |
H
|
六角形标记 |
_
|
横线标记 |
^
|
正三角标记 |
4
|
三叉戟标记 |
+
|
+标记 | ||
<
|
左三角标记 |
s
|
正方形标记 |
x
|
x标记 |
-
line
:绘制线的形状。
字符 | 格式 | 字符 | 格式 | 字符 | 格式 | 字符 | 格式 |
---|---|---|---|---|---|---|---|
-
|
实线 |
--
|
虚线 |
-.
|
点划线 |
:
|
点线 |
特定类型图
下面是一些常用的绘图函数。更多官网案例:https://matplotlib.org/stable/gallery/index.html。
折线图
plot()
plt.plot()
用于绘制
折线图
,需要一系列点作为因变量和自变量,函数接口如下:
1 |
|
观察接口,可以发现有以下的用法:
- 传入 两个等长 数组或列表,前者是自变量,后者是因变量。
- 只传入 一个 数组或列表,自变量默认从 0 开始整数递增。
- 传入两个列表, 各包含两个值 ,可以绘制一条直线。
散点图
scatter()
plt.scatter()
用于绘制
散点图
,需要
两个等长
数组或列表,函数接口如下:
1 |
|
其中只有
x
和
y
为必填项,
s
代表每个点的大小,可以是常数也可以是列表。
轮廓图
contour()
plt.contour()
用于绘制
等高线图
,也可绘制闭合的
轮廓图
,函数接口如下:
1 |
|
其中
x
和
y
是一维的数组,代表绘制的网格点的横纵坐标;
Z
是形状为
(len(X), len(Y))
的二维数组,代表绘制点的高度。参数
levels
是一个列表,如果空缺则默认绘制
一组等距的等高线
,也可以传入
[0, 0.5, 1]
这样的列表,则只会
显示对应高度
的轮廓线。
网格的横纵坐标通常由 Numpy 中的
merhgrid
生成,完整代码如下:
1 |
|
热力图
imshow()
plt.imshow()
本身是用于绘制
二维数字图像
,但图像有更好的工具,因此主要用于绘制
热力图
(heatmap),配套使用的还有
色值柱
,函数接口如下:
1 |
|
其中
X
是二维数组,数组元素的值就是热力值,
cmap
为
色彩风格
,可选的值有:
plt.cm.hot
、
cool
、
gray
、
bone
、
white
、
spring
、
summer
、
autumn
、
winter
。
非必要的参数如,
interpolation
设置为
’nearest’
可以将相邻的
相同的颜色连成片
。最后调用
plt.colorbar()
可以把色值柱附在图像旁边。
直方图
hist()
plt.hist()
用于绘制直方图(Histogram),一种特殊的柱状图。,函数接口如下:
1 |
|
其中
x
为一维数组,可以是浮点数,
bins
为直方图的组数,会
自动量化原始数据
。非必要的参数
range
可输入一个范围元组,默认为
(x.min(), x.max())
,如果设置了则会依据
range
来划分直方图的组宽。
子图布局
Matplotlib 有一个概念 subplot:包含在 Figure 对象中的小型 Axes 对象。这允许我们在一幅图中创建很多个子图,方便对比数据。在前面绘制单张图时,可以不声明 Figure 对象作为 所有内容的容器 ,但 绘制子图时则必须声明 。总共有三种方法。
任意位置
add_axes()
先调用
plt.figure()
创建 Figure 对象,接着调用
fig.add_axes()
在图表的任意位置添加子图,函数接口如下:
1 |
|
其中只有
rect
是必要的,这是一个四个浮点数的列表
[left, bottom, width, height]
,分别代表子图
左下角
的坐标,子图的宽度和高度。这四个数字的取值范围都是 0 到 1,代表
相对位置和大小
。
最后在每个子图里用各自的类型图进行绘制即可:
1 |
|
对齐网格
subplot()
plt.subplot()
用于在一张图里绘制
多个子图
,最常用,函数接口如下:
1 |
|
其中只有
nrow
和
ncols
表示总共有多少子图,
index
代表其中第几个。如:
plt.subplot(2,2,1)
,也可以缩写为
plt.subplot(221)
。紧跟在
plt.subplot()
语句后面的语句绘制的就是
index
所指向的图,绘制完再次使用
plt.subplot()
语句切换到下一张子图。
1 |
|
但是,上述方法不适用于
大量子图
的绘制,如 100 张子图拼接等,因此有另一个相似的方法
plt.subplots()
:
1 |
|
同时返回一个固定的 Figure 对象(设置的参数一起写即可)和一个 Axes 对象 二维列表 ,通过循环可以遍历:
1 |
|
自由网格
GridSpec
如果想创建
不规则的子图
,部分子图更大,展示核心信息,有的子图较小,展现辅助信息,
plt.GridSpec()
可实现这一点,工作原理是先创建一个网格状的蓝图,然后
合并部分子图
。函数接口如下:
1 |
|
使用时调用
plt.GridSpec
创建网格状的
二维数组
grid
,通过
切片和索引
按需求合并子图,最后调用
ax.plot()
将数据映射到图表:
1 |
|
装饰输出
除了上述常用的绘图函数,Matplotlib 还带有各种绘图组件,用于装饰输出。
全局配置
rcParams
Matplotlib 使用 MRC(Matplotlib
Resource Configurations
)配置文件来自定义各种属性,我们称之为 rc 配置或者 rc 参数。使用
rcParams
可以控制几乎所有的默认属性:视图窗口、线条、颜色、样式、坐标轴、网格、文本、字体等属性。
通常在 Notebook 中使用,使用方法如下:
1 |
|
画板
figure()
图例
legend()
注意 label 不要拼错了
坐标轴
去掉坐标轴的
轴线
、刻度、标签:
plt.axis('off')
去掉坐标轴的刻度、标签:
plt.xticks([])
和
plt.yticks([])
去掉坐标轴的刻度,但保留标签:
plt.tick_params(left=False, bottom=False)
去掉坐标轴的标签,但保留刻度(适用于画 Attention 热力图):
1 |
|
文字说明
-
plt.xlabel('X Label')
: -
plt.ylabel('Y Label')
: -
plt.title('TITLE')
: