导入包
from matplotlib import pyplot as plt
创建画布
plt.figure(num=None, figsize=None, dpi=None, facecolor=None, edgecolor=None, frameon=True)
参数 | 含义 |
---|---|
num | 图像编号或名称,数字为编号 ,字符串为名称 |
figsize | 指定figure的宽和高,单位为英寸 |
dpi | 参数指定绘图对象的分辨率,即每英寸多少个像素,缺省值为80 |
facecolor | 背景颜色 |
edgecolor | 边框颜色 |
frameon | 是否显示边框 |
fig = plt.figure()
创建子图
方法一:
plt.subplot(*args)
参数一共有三个,每个参数是 1 1 1 到 9 9 9 的整数。参数之间可以用逗号隔开写,也可合再一起写。三个参数依次为:子图有几行、子图有几列、选择哪个子图作为当前要绘制的图(从左到右从上到下对子图编号)。
from matplotlib import pyplot as plt
ax1 = plt.subplot(2, 2, 1) # 创建两行两列的子图,并选择 1 号图(左上图)作为当前要绘制的图
ax3 = plt.subplot(223) # 选择 3 号图(左下图)作为当前要绘制的图
plt.show()
方法二:
plt.axes(arg=None)
参数为一个四元素列表,每个元素是 0 0 0 到 1 1 1 的小数,用来表示百分数。四个元素依次为:子图左下角在整张画布中的横坐标(画布以左下角为原点)、子图左下角在整张画布中的纵坐标、子图的宽度在整张画布中的占比、子图的高度在整张画布中的占比。
from matplotlib import pyplot as plt
ax1 = plt.axes() # 创建默认子图,并将其作为当前要绘制的图
ax2 = plt.axes([0.2, 0.6, 0.2, 0.2]) # 按要求创建子图,并将其作为当前要绘制的图
plt.show()
绘制折线图
plt.plot([x], y, [fmt], data=None, **kwargs)
参数 | 含义 |
---|---|
x | 各点的横坐标,缺省时为range(len(y)) |
y | 各点的纵坐标 |
fmt | 折线的格式,详细见下文 |
data | |
**kwargs | 可选标签参数 |
fmt
总共由三类符号组成,分别为:标记点样式符号(marker)、折线样式符号(line)、颜色符号(color)。格式为 fmt='[marker][line][color]'
。fmt
缺省时程序默认不添加标记点、折线样式为实线、自动为不同的折线匹配不同的颜色。
- 标记点样式符号
符号 | 含义 |
---|---|
. | 点标记 |
, | 像素标记 |
o | 圆点标记 |
v | 下三角标记 |
^ | 三角标记 |
< | 左三角标记 |
> | 右三角标记 |
1 | 下三星标记 |
2 | 上三星标记 |
3 | 左三星标记 |
4 | 右三星标记 |
s | 方形标记 |
p | 五边形标记 |
* | 五角星标记 |
h | 六边形标记 |
H | 六角星2标记 |
+ | 加号标记 |
x | 叉号标记 |
D | 菱形标记 |
d | 长菱形标记 |
| | 竖杠标记 |
_ | 横杠标记器 |
- 折线样式符号
符号 | 含义 |
---|---|
- | 实线 |
-- | 线段式虚线 |
-. | 点划线 |
: | 点式虚线 |
- 颜色符号
符号 | 含义 |
---|---|
b | 蓝色 |
g | 绿色 |
r | 红色 |
c | 青色 |
m | 洋红 |
y | 黄的 |
k | 黑色 |
w | 白色 |
plt.plot(x, y) # 此为隐式调用最近一个子图进行绘制,但不推荐,因为有些方法不支持隐式调用
ax.plot(x, y) # 此为显式调用 ax 实例的绘图方法
三维绘图基础及绘制三维折线图
- 通过标签参数
projection='3d'
来为图像建立三维坐标系。 - 建立三维坐标系后,
plot
将允许输入三个坐标参数,并以这三个参数绘制折线。
from matplotlib import pyplot as plt
import numpy as np
r = np.linspace(0, 10*np.pi, 3600)
x = np.cos(r)
y = np.sin(r)
z = r
ax = plt.axes(projection='3d') # 建立三维坐标系
# ax = plt.gca(projection='3d') # 与上句等价,gca 即 get current axes
# ax = plt.subplot(111, projection='3d') # 与上句等价,通过 subplot 可以在一张画布上同时绘制二维和三维图像
ax.plot(x, y, z) # 输入点坐标进行绘制
plt.show()
绘制三维表面图
from matplotlib import pyplot as plt
import numpy as np
x, y = np.meshgrid(np.linspace(-5, 5, 100), np.linspace(-5, 5, 100))
z = x*x - y*y
ax = plt.axes(projection='3d') # 建立三维坐标系
ax.plot_surface(x, y, z) # 输入点坐标进行绘制
plt.show()
设置颜色映射
from matplotlib import pyplot as plt
import numpy as np
x, y = np.meshgrid(np.linspace(-5, 5, 100), np.linspace(-5, 5, 100))
z = x*x - y*y
ax = plt.axes(projection='3d') # 建立三维坐标系
ax.plot_surface(x, y, z, cmap='rainbow') # 输入点坐标进行绘制
plt.show()
官方提供的颜色映射表如下:
添加标签与标题
- 使用标签参数
label
可以为折线添加标签,而后使用方法legend()
来显示标签。 - 使用方法
set_xlabel()
、set_ylabel()
、set_zlabel()
或set()
可以分别为 x、y、z 轴添加标签。 - 使用方法
set_title()
可以为子图添加标题。
from matplotlib import pyplot as plt
import numpy as np
x = np.linspace(-2, 2, 100)
y1 = x*x
y2 = x*x*x
ax = plt.axes()
ax.set_title('title') # 设置标题
ax.set_xlabel('x') # 设置 x 轴标签
ax.set_ylabel('y') # 设置 y 轴标签
# ax.set(title='title', xlabel='x', ylabel='y') # 等价于以上三句
ax.plot(x, y1, label='y1') # 使用标签参数来指定曲线的标签
ax.plot(x, y2, label='y2') # 使用标签参数来指定曲线的标签
ax.legend() # 调用此方法来显示曲线的标签
plt.show()
设置图层优先级
使用标签参数zorder
指定图层优先级,数值越大优先级越高
from matplotlib import pyplot as plt
import numpy as np
x = np.linspace(-2, 2, 100)
y1 = x*x
y2 = x*x*x
ax = plt.axes()
ax.plot(x, y1, linewidth=50, zorder=2) # 使用 linewidth 调整线宽便于观察
ax.plot(x, y2, linewidth=50, zorder=1) # 使用 zorder 指定图层优先级,数值越大优先级越高
plt.show()
坐标轴、显示比例和刻度
统一进行设置
xmin, xmax, ymin, ymax = axis()
xmin, xmax, ymin, ymax = axis([xmin, xmax, ymin, ymax])
xmin, xmax, ymin, ymax = axis(option)
xmin, xmax, ymin, ymax = axis(**kwargs)
xmin, xmax, ymin, ymax
即坐标轴的范围。option
的取值见下表
符号 | 含义 |
---|---|
'on' 或True | 显示坐标轴 |
'off' 或False | 不显示坐标轴 |
'equal' | 各坐标轴等比列(使圆显示成圆形,而不是被拉伸成椭圆形),这种方式是在坐标轴框不变的情况下,通过调整xmin, xmax, ymin, ymax 的值实现的。下方有示例图。 |
'scaled' | 各坐标轴等比列(使圆显示成圆形,而不是被拉伸成椭圆形),这种方式是通过调整坐标轴框实现的。 |
'square' | 等价于'scaled' && xmax-xmin = ymax-ymin |
import matplotlib.pyplot as plt
import numpy as np
x = np.array(np.linspace(-2 * np.pi, 2 * np.pi))
y = np.sin(x) + 1
ax1 = plt.subplot(2, 1, 1)
ax1.plot(x, y)
ax1.axis('equal')
ax1.set_title('equal')
ax2 = plt.subplot(2, 1, 2)
ax2.plot(x, y)
ax2.axis('scaled')
ax2.set_title('scaled')
plt.show()
分别进行设置(请读者对下方内容自行举一反三)
- 使上侧的坐标轴不显示
ax.spines['top'].set(visible=False)
ax.spines['top'].set_visible(False)
- 使下侧的坐标轴位于
y=0
处
ax.spines['bottom'].set(position=('data', 0))
ax.spines['bottom'].set_position('data', 0)
- 使左侧的坐标轴位于
x=0
处
ax.spines['left'].set(position=('data', 0))
ax.spines['left'].set_position('data', 0)
- 使右侧的坐标轴为红色
ax.spines['right'].set(color='red')
ax.spines['right'].set_color('r')
设置刻度值
from matplotlib import pyplot as plt
import numpy as np
x = y = np.linspace(0, 2.5, 100)
ax1 = plt.subplot(131)
ax2 = plt.subplot(132)
ax3 = plt.subplot(133)
ax1.plot(x, y)
ax2.plot(x, y)
ax3.plot(x, y)
ax2.set_xticks((0, 2))
ax2.set_yticks((0, 2))
# ax2.set(xticks=(0, 2), yticks=(0, 2)) # 本句等价于以上两句
ax3.set_xticks(())
ax3.set_yticks(())
# ax3.set(xticks=(), yticks=()) # 本句等价于以上两句
plt.show()
绘制矩形框
matplotlib.patches.Rectangle(xy, width, height, *, angle=0.0, rotation_point='xy', **kwargs)
: +------------------+
: | |
: height |
: | |
: (xy)---- width -----+
参数 | 含义 |
---|---|
xy:(float, float) | 锚点坐标 |
width:float | 水平边长 |
hight:float | 垂直边长 |
angle:float=0.0 | 逆时针旋转角度 |
标签参数 | 含义 |
---|---|
fill=True | 内部是否填充 |
from matplotlib import pyplot as plt
rect = plt.Rectangle((0.1, 0.2), 0.2, 0.1, fill=False)
plt.gca().add_patch(rect)
plt.show()