ToB企服应用市场:ToB评测及商务社交产业平台

标题: 【matplotlib基础】--子图 [打印本页]

作者: 花瓣小跑    时间: 2023-9-3 07:49
标题: 【matplotlib基础】--子图
使用Matplotlib对分析结果可视化时,比较各类分析结果是常见的场景。
在这类场景之下,将多个分析结果绘制在一张图上,可以帮助用户方便地组合和分析多个数据集,提高数据可视化的效率和准确性。
本篇介绍Matplotlib绘制子图的常用方式和技巧。
1. 添加子图的方式

添加子图主要有两种方式,
一种是函数式风格:(也就是上一篇画布中介绍的方式)
  1. import numpy as np
  2. import matplotlib
  3. import matplotlib.pyplot as plt
  4. %matplotlib inline
  5. x = np.array(range(0, 8))
  6. fig = plt.figure(figsize=[6,4])
  7. fig.add_subplot(211) # 2行1列的第一个
  8. y = np.random.randint(1, 100, 8)
  9. plt.plot(x, y)
  10. fig.add_subplot(212) # 2行1列的第二个
  11. y = np.random.randint(1, 100, 8)
  12. plt.plot(x, y)
复制代码

另一种是面向对象风格:(使用 Axes 对象)
  1. x = np.array(range(0, 8))
  2. fig, ax = plt.subplots(1, 2)  # 设置子图1行2列
  3. y = np.random.randint(1, 100, 8)
  4. ax[0].plot(x, y)
  5. y = np.random.randint(1, 100, 8)
  6. ax[1].plot(x, y)
复制代码

上面设置好子图的布局之后,添加子图的顺序是从上到下,从左到右。
2. 子图的布局

子图的布局是按照行列设置的,设置之后,相应的位置可以添加子图。
  1. x = np.array(range(0, 8))
  2. rows, cols = 2, 2  # 2行2列,4个子图
  3. fig, ax = plt.subplots(rows, cols)
  4. for i in range(rows):
  5.     for j in range(cols):
  6.         y = np.random.randint(1, 100, 8)
  7.         ax[i, j].plot(x, y) # i,j定位子图的位置
复制代码

子图按照网格布局时,我们看到上面4个子图的Y轴刻度不一样,这样不利于比较。
  1. x = np.array(range(0, 8))
  2. rows, cols = 2, 2  # 2行2列,4个子图
  3. fig, ax = plt.subplots(rows, cols, sharey='all')
  4. for i in range(rows):
  5.     for j in range(cols):
  6.         y = np.random.randint(1, 100, 8)
  7.         ax[i, j].plot(x, y) # i,j定位子图的位置
复制代码

设置 sharey='all'之后,Y轴刻度保持一致,这样比较曲线才有意义。
上面的示例中 X轴刻度是一致的,如果不一致,可以用 sharex 属性来设置。
3. 复杂的布局

3.1. 不规则的网格

除了规则的网格布局,还可以通过 GridSpec 设置不规则的网格。
比如:
  1. rows, cols = 3, 3
  2. grid = plt.GridSpec(rows, cols)
  3. plt.subplot(grid[0, :2])
  4. plt.subplot(grid[0, 2])
  5. plt.subplot(grid[1, 0])
  6. plt.subplot(grid[1, 1:])
  7. plt.subplot(grid[2, :])
复制代码

上例中设置了3行3列的网格,但是不是每个图形占用几个网格是可以调整的。
3.2. 嵌套图形

除了网格,还可以通过相对定位的方式来绘制多个子图。
  1. fig = plt.figure()
  2. fig.add_axes([0.1, 0.1, 1, 1])
  3. fig.add_axes([0.3, 0.3, 0.3, 0.3])
  4. fig.add_axes([0.7, 0.6, 0.3, 0.2])
复制代码

上面按相对位置添加子图的函数 add_axes的参数是一个4元列表
这个列表4个元素的含义:
注意,这里的4个值都是比例
4. 总结回顾

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

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4