花瓣小跑 发表于 2023-9-3 07:49:22

【matplotlib基础】--子图

使用Matplotlib对分析结果可视化时,比较各类分析结果是常见的场景。
在这类场景之下,将多个分析结果绘制在一张图上,可以帮助用户方便地组合和分析多个数据集,提高数据可视化的效率和准确性。
本篇介绍Matplotlib绘制子图的常用方式和技巧。
1. 添加子图的方式

添加子图主要有两种方式,
一种是函数式风格:(也就是上一篇画布中介绍的方式)
import numpy as np

import matplotlib
import matplotlib.pyplot as plt

%matplotlib inline

x = np.array(range(0, 8))

fig = plt.figure(figsize=)
fig.add_subplot(211) # 2行1列的第一个
y = np.random.randint(1, 100, 8)
plt.plot(x, y)

fig.add_subplot(212) # 2行1列的第二个
y = np.random.randint(1, 100, 8)
plt.plot(x, y)https://cdn.nlark.com/yuque/0/2023/png/2235414/1686588747658-618e74ca-11fb-4d2c-a2a9-4136ec368a43.png#averageHue=%23f9f9f9&clientId=u8ca7a0ff-4d12-4&from=paste&height=354&id=ucd6525a4&originHeight=354&originWidth=512&originalType=binary&ratio=1&rotation=0&showTitle=false&size=23701&status=done&style=stroke&taskId=u83e2eb48-43a3-4818-a606-833c916c645&title=&width=512
另一种是面向对象风格:(使用 Axes 对象)
x = np.array(range(0, 8))

fig, ax = plt.subplots(1, 2)# 设置子图1行2列
y = np.random.randint(1, 100, 8)
ax.plot(x, y)

y = np.random.randint(1, 100, 8)
ax.plot(x, y)https://cdn.nlark.com/yuque/0/2023/png/2235414/1686619384633-c176f0ed-96f1-4c02-ac5c-92a45966152f.png#averageHue=%23fafafa&clientId=ue8351135-f171-4&from=paste&height=413&id=ub8c44897&originHeight=413&originWidth=543&originalType=binary&ratio=1&rotation=0&showTitle=false&size=23133&status=done&style=stroke&taskId=uc351bbac-7f90-4ffa-891c-729d9337426&title=&width=543
上面设置好子图的布局之后,添加子图的顺序是从上到下,从左到右。
2. 子图的布局

子图的布局是按照行列设置的,设置之后,相应的位置可以添加子图。
x = np.array(range(0, 8))
rows, cols = 2, 2# 2行2列,4个子图
fig, ax = plt.subplots(rows, cols)

for i in range(rows):
    for j in range(cols):
      y = np.random.randint(1, 100, 8)
      ax.plot(x, y) # i,j定位子图的位置https://cdn.nlark.com/yuque/0/2023/png/2235414/1686622383697-3d213cc2-7995-45d8-88b5-2bd597915fe3.png#averageHue=%23f9f9f9&clientId=ue8351135-f171-4&from=paste&height=414&id=ub9fad0da&originHeight=414&originWidth=540&originalType=binary&ratio=1&rotation=0&showTitle=false&size=31882&status=done&style=stroke&taskId=u6d81b915-aba8-4753-bf06-ad351dda1f9&title=&width=540
子图按照网格布局时,我们看到上面4个子图的Y轴刻度不一样,这样不利于比较。
x = np.array(range(0, 8))
rows, cols = 2, 2# 2行2列,4个子图
fig, ax = plt.subplots(rows, cols, sharey='all')

for i in range(rows):
    for j in range(cols):
      y = np.random.randint(1, 100, 8)
      ax.plot(x, y) # i,j定位子图的位置https://cdn.nlark.com/yuque/0/2023/png/2235414/1686622629978-bf5bd2ba-09ca-44fa-8699-8fe11be8fdc1.png#averageHue=%23f9f9f9&clientId=ue8351135-f171-4&from=paste&height=412&id=u81ed2b87&originHeight=412&originWidth=548&originalType=binary&ratio=1&rotation=0&showTitle=false&size=31299&status=done&style=stroke&taskId=u5e646670-ef0a-4560-b09a-26b7a2a928e&title=&width=548
设置 sharey='all'之后,Y轴刻度保持一致,这样比较曲线才有意义。
上面的示例中 X轴刻度是一致的,如果不一致,可以用 sharex 属性来设置。
3. 复杂的布局

3.1. 不规则的网格

除了规则的网格布局,还可以通过 GridSpec 设置不规则的网格。
比如:
rows, cols = 3, 3
grid = plt.GridSpec(rows, cols)

plt.subplot(grid)
plt.subplot(grid)

plt.subplot(grid)
plt.subplot(grid)

plt.subplot(grid)https://cdn.nlark.com/yuque/0/2023/png/2235414/1686625589995-99cf8c16-ca1b-4be5-b9e0-320b50597e7a.png#averageHue=%23f7f7f7&clientId=ue8351135-f171-4&from=paste&height=417&id=u2c4dc823&originHeight=417&originWidth=560&originalType=binary&ratio=1&rotation=0&showTitle=false&size=11375&status=done&style=stroke&taskId=ue62b68ca-054c-4a5e-90d2-73a48e27942&title=&width=560
上例中设置了3行3列的网格,但是不是每个图形占用几个网格是可以调整的。
3.2. 嵌套图形

除了网格,还可以通过相对定位的方式来绘制多个子图。
fig = plt.figure()

fig.add_axes()
fig.add_axes()
fig.add_axes()https://cdn.nlark.com/yuque/0/2023/png/2235414/1686626271220-c82e0383-a0c2-43d3-861b-8a3f876f83da.png#averageHue=%23fafafa&clientId=ue8351135-f171-4&from=paste&height=527&id=ud082eab5&originHeight=527&originWidth=704&originalType=binary&ratio=1&rotation=0&showTitle=false&size=13208&status=done&style=stroke&taskId=ua17e2aa6-7e7e-4ff0-87e1-96b057fd17d&title=&width=704
上面按相对位置添加子图的函数 add_axes的参数是一个4元列表。
这个列表4个元素的含义:

[*]第一个元素表示子图左下角距离画布左边的距离占画布总宽度的比例
[*]第二个元素表示子图左下角距离画布底边的距离占画布总高度的比例
[*]第三个元素表示子图宽度占画布总宽度的比例
[*]第三个元素表示子图高度占画布总高度的比例
注意,这里的4个值都是比例。
4. 总结回顾

Matplotlib 中的每个子图可以有自己的标签、大小、位置和样式,可以方便地组合成一个复杂的图形。
我们一般在下列场景中使用子图:

[*]数据可视化:将多个数据集在同一张图中显示,进行对比和分析。
[*]图表组合:将多个图表组合在一起,形成一个综合性的图形。
[*]数据分析:将多个数据集在同一张图中显示,进行筛选和筛选。
[*]可视化规范化:将多个来源不同的数据集在同一张图中显示,保证图形的一致性和准确性。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
页: [1]
查看完整版本: 【matplotlib基础】--子图