Matplotlib绘图基础之子图详解

 更新时间:2023年07月28日 15:47:48   作者:databook  
这篇文章主要为大家详细介绍了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=[6,4])
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)

另一种是面向对象风格:(使用 Axes 对象)

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

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

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[i, j].plot(x, y) # i,j定位子图的位置

子图按照网格布局时,我们看到上面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[i, j].plot(x, y) # i,j定位子图的位置

设置 sharey='all'之后,Y轴刻度保持一致,这样比较曲线才有意义。

上面的示例中 X轴刻度是一致的,如果不一致,可以用 sharex 属性来设置。

3. 复杂的布局

3.1. 不规则的网格

除了规则的网格布局,还可以通过 GridSpec 设置不规则的网格。

比如:

rows, cols = 3, 3
grid = plt.GridSpec(rows, cols)
plt.subplot(grid[0, :2])
plt.subplot(grid[0, 2])
plt.subplot(grid[1, 0])
plt.subplot(grid[1, 1:])
plt.subplot(grid[2, :])

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

3.2. 嵌套图形

除了网格,还可以通过相对定位的方式来绘制多个子图。

fig = plt.figure()
fig.add_axes([0.1, 0.1, 1, 1])
fig.add_axes([0.3, 0.3, 0.3, 0.3])
fig.add_axes([0.7, 0.6, 0.3, 0.2])

上面按相对位置添加子图的函数 add_axes的参数是一个4元列表

这个列表4个元素的含义:

  • 第一个元素表示子图左下角距离画布左边的距离占画布总宽度的比例
  • 第二个元素表示子图左下角距离画布底边的距离占画布总高度的比例
  • 第三个元素表示子图宽度占画布总宽度的比例
  • 第三个元素表示子图高度占画布总高度的比例

注意,这里的4个值都是比例

4. 总结回顾

Matplotlib 中的每个子图可以有自己的标签、大小、位置和样式,可以方便地组合成一个复杂的图形。

我们一般在下列场景中使用子图:

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

到此这篇关于Matplotlib绘图基础之子图详解的文章就介绍到这了,更多相关Matplotlib子图内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 轻量级的Web框架Flask 中模块化应用的实现

    轻量级的Web框架Flask 中模块化应用的实现

    说到flask的模块化,大家可能第一时间想到的都是蓝图,今天我们不讨论蓝图,先从0.2版本中的Module类的实现讲起
    2017-09-09
  • Tensorflow 训练自己的数据集将数据直接导入到内存

    Tensorflow 训练自己的数据集将数据直接导入到内存

    这篇文章主要介绍了Tensorflow 训练自己的数据集将数据直接导入到内存,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-06-06
  • 详解Python中通用工具类与异常处理

    详解Python中通用工具类与异常处理

    在Python开发中,编写可重用的工具类和通用的异常处理机制是提高代码质量和开发效率的关键,本文将介绍如何将特定的异常类改写为更通用的ValidationException,并创建一个通用的工具类Utils,需要的可以参考下
    2024-12-12
  • 用Python计算三角函数之acos()方法的使用

    用Python计算三角函数之acos()方法的使用

    这篇文章主要介绍了用Python计算三角函数之acos()方法的使用,是Python学习中的基础知识,需要的朋友可以参考下
    2015-05-05
  • Python+PyQt5实现网口功能测试详解

    Python+PyQt5实现网口功能测试详解

    这篇文章主要为大家详细介绍了Python+PyQt5实现网口功能测试的相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2024-02-02
  • Python django框架开发发布会签到系统(web开发)

    Python django框架开发发布会签到系统(web开发)

    这篇文章主要介绍了Python django框架开发发布会签到系统(web开发),本文通过实例代码效果展示截图的形式给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-02-02
  • Pandas设置DataFrame的index索引起始值为1的两种方法

    Pandas设置DataFrame的index索引起始值为1的两种方法

    DataFrame中的index索引列默认是从0开始的,那么我们如何设置index索引列起始值从1开始呢,本文主要介绍了Pandas设置DataFrame的index索引起始值为1的两种方法,感兴趣的可以了解一下
    2024-07-07
  • 浅谈Python中的字符串

    浅谈Python中的字符串

    这篇文章主要介绍了Python中的字符串相关知识,文中讲解的非常细致,代码帮助大家更好的理解,感兴趣的朋友可以参考下
    2020-06-06
  • 对Django中时区的解读

    对Django中时区的解读

    这篇文章主要介绍了对Django中时区的解读方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-05-05
  • python测试框架unittest和pytest区别

    python测试框架unittest和pytest区别

    这篇文章主要介绍了python测试框架unittest和pytest区别,帮助大家更好的理解和学习使用python进行自动化测试,感兴趣的朋友可以了解下
    2021-04-04

最新评论