matplotlib 基础

Figure 和 Axes
Figure 就是图片,一个完整的图片,而 Axes 直译为坐标轴,这里我们不妨理解为子图,这样两者的关系就比较明确了:一个 Figure 是可以包含一个或多个 Axes 的。

import matplotlib.pyplot as plt # 导入库
from matplotlib import rcParams
rcParams.update({'figure.autolayout': True}) # 设为自动布局,避免标签被剪裁

通过 pyplt 模块的 figure 函数来创建一个 Figure 对象

matplotlib.pyplot.figure(figsize=None, dpi=None, facecolor=None, edgecolor=None, frameon=True)

# figsize: 传入一个“(float,float)”格式字符串,默认为 (6.4,4.8),分别为以英寸为单位的宽和高。
# dpi:float 格式,像素分辨率。
# facecolor:背景色。
# edgecolor:边框颜色。
# frameon:默认为 True,即允许绘制边框。

创建Axes方法

1 、 add_subplot 函数:快速创建

使用指定行列数的方式来创建子图,排列顺序从左到右、从上到下。

fig = plt.figure() # 创建figure对象
fig.add_subplot(231); # 这里用 231 或者 2,3,1 都可以。第一个数字指定要创建具有几行子图的规格,第二个数字指列数的规格,第三个数字指对全部子图的行列从左往右,从上往下的第几个子图

matplotlib 基础_第1张图片

fig = plt.figure()
ax1 = fig.add_subplot(231) # 创建2行3列排布的第1个子图

matplotlib 基础_第2张图片

fig = plt.figure()
ax1 = fig.add_subplot(231) # 创建2行3列排布的第1个子图
fig.add_subplot(232, frameon=False); # 创建2行3列排布的第2个子图,不添加边框

matplotlib 基础_第3张图片

fig = plt.figure()
ax1 = fig.add_subplot(231)  # 创建2行3列排布的第1个子图
fig.add_subplot(232, frameon=False)  # 创建2行3列排布的第2个子图,不添加边框
fig.add_subplot(233, projection='polar'); # 创建2行3列排布的第3个子图,使用极坐标系

matplotlib 基础_第4张图片

fig = plt.figure()
ax1 = fig.add_subplot(231)  # 创建2行3列排布的第1个子图
fig.add_subplot(232, frameon=False)  # 创建2行3列排布的第2个子图,不添加边框
fig.add_subplot(233, projection='polar')  # 创建2行3列排布的第3个子图,使用极坐标系
fig.add_subplot(234, facecolor="red");  # 创建2行3列排布的第4个子图,使用红色背景

matplotlib 基础_第5张图片

设置不等尺寸的子图
fig = plt.figure()
#创建2行2列排布的第一个图
fig.add_subplot(221)
plt.show() 

matplotlib 基础_第6张图片

fig = plt.figure()
# 创建2行2列排布的第一个图
fig.add_subplot(221)
# 新增:创建2行2列排布的第二个图
fig.add_subplot(222)
plt.show()

matplotlib 基础_第7张图片

fig = plt.figure()
# 创建2行2列排布的第一个图
ax1 = fig.add_subplot(221)
# 创建2行2列排布的第二个图
ax2 = fig.add_subplot(222)
# 新增:创建2行1列排布的第二个图
ax3 = fig.add_subplot(212)
plt.show()

matplotlib 基础_第8张图片

可以看到,我们这里并不一定使全部的子图要遵循相同的排列,但是子图的长宽比例是相对确定的

2、add_axes 函数:自由设置子图的位置、大小

left = 0.1 # 子图左下角的x坐标
below = 0.1 # 子图左下角的y坐标  左下角坐标可以设置为(0,0)
wide = 0.4 # 子图的宽度
high = 0.3 # 子图高度
rect = left, below, wide, high
fig = plt.figure()
fig.set_tight_layout(False)
fig.add_axes(rect);

matplotlib 基础_第9张图片

add_subplot 方式创建时较为便捷 ✅,但缺点是不容易灵活掌握每个子图的大小,尤其是在用于多子图(大小不统一)拼凑时不容易调整 ❌。
add_axes 创建子图则没有这一缺点,可以自由设置每个子图的位置和大小 ✅,缺点是需要反复调整子图尺寸位置参数 ❌。

3、指定子图空间:当子图大小成倍数时

import matplotlib.pyplot as plt
from matplotlib.gridspec import GridSpec
fig = plt.figure()
# 将figure划分为3×3的空间,所以相当于将空间变为了一个(3,3)的数组
gs = GridSpec(3, 3, figure=fig)
# 第一个子图占有第一行的全部空间
ax1 = fig.add_subplot(gs[0, :])
# 第二个子图占有第二行,从0到倒数第二列的空间
ax2 = fig.add_subplot(gs[1, :-1])

matplotlib 基础_第10张图片

import matplotlib.pyplot as plt
from matplotlib.gridspec import GridSpec
fig = plt.figure()
# 将figure划分为3×3的空间,所以相当于将空间变为了一个(3,3)的数组
gs = GridSpec(3, 3, figure=fig)
# 第一个子图占有第一行的全部空间
ax1 = fig.add_subplot(gs[0, :])
# 第二个子图占有第二行,从0到倒数第二列的空间
ax2 = fig.add_subplot(gs[1, :-1])
# 新增:第三个子图占有第三行和第三行最后一列的空间
ax3 = fig.add_subplot(gs[1:, -1])

matplotlib 基础_第11张图片

import matplotlib.pyplot as plt
from matplotlib.gridspec import GridSpec
fig = plt.figure()
# 将figure划分为3×3的空间,所以相当于将空间变为了一个(3,3)的数组
gs = GridSpec(3, 3, figure=fig)
# 第一个子图占有第一行的全部空间
ax1 = fig.add_subplot(gs[0, :])
# 第二个子图占有第二行,从0到倒数第二列的空间
ax2 = fig.add_subplot(gs[1, :-1])
# 第三个子图占有第三行和第三行最后一列的空间
ax3 = fig.add_subplot(gs[1:, -1])
# 新增:第四个子图占有最后一行第一列的空间
ax4 = fig.add_subplot(gs[-1, 0])

matplotlib 基础_第12张图片

import matplotlib.pyplot as plt
from matplotlib.gridspec import GridSpec
fig = plt.figure()
# 将figure划分为3×3的空间,所以相当于将空间变为了一个(3,3)的数组
gs = GridSpec(3, 3, figure=fig)
# 第一个子图占有第一行的全部空间
ax1 = fig.add_subplot(gs[0, :])
# 第二个子图占有第二行,从0到倒数第二列的空间
ax2 = fig.add_subplot(gs[1, :-1])
# 第三个子图占有第三行和第三行最后一列的空间
ax3 = fig.add_subplot(gs[1:, -1])
# 第四个子图占有最后一行第一列的空间
ax4 = fig.add_subplot(gs[-1, 0])
# 新增:第五个子图占有最后一行第二列的空间
ax5 = fig.add_subplot(gs[-1, -2])

matplotlib 基础_第13张图片

一张图理解matplotlib

matplotlib 基础_第14张图片

你可能感兴趣的:(Python,python,matplotlib)