使用 Matplotlib 除可以生成包含多条折线的复式折线图之外,它还允许在一张数据图上包含多个子图。

调用 subplot() 函数可以创建一个子图,然后程序就可以在子图上进行绘制。subplot(nrows, ncols, index, **kwargs) 函数的 nrows 参数指定将数据图区域分成多少行;ncols 参数指定将数据图区域分成多少列;index 参数指定获取第几个区域。

subplot() 函数也支持直接传入一个三位数的参数,其中第一位数将作为 nrows 参数;第二位数将作为 ncols 参数;第三位数将作为 index 参数。

下面程序示范了生成多个子图:

import matplotlib.pyplot as plt import numpy as np plt.figure() # 定义从-pi到pi之间的数据,平均取64个数据点 x_data = np.linspace(-np.pi, np.pi, 64, endpoint=True) # ① # 将整个figure分成两行两列,第三个参数表示该图形放在第1个网格 plt.subplot(2, 2, 1) # 绘制正弦曲线 plt.plot(x_data, np.sin(x_data)) plt.gca().spines['right'].set_color('none') plt.gca().spines['top'].set_color('none') plt.gca().spines['bottom'].set_position(('data', 0)) plt.gca().spines['left'].set_position(('data', 0)) plt.title('正弦曲线') # 将整个figure分成两行两列,并将该图形放在第2个网格 plt.subplot(222) # 绘制余弦曲线 plt.plot(x_data, np.cos(x_data)) plt.gca().spines['right'].set_color('none') plt.gca().spines['top'].set_color('none') plt.gca().spines['bottom'].set_position(('data', 0)) plt.gca().spines['left'].set_position(('data', 0)) plt.title('余弦曲线') # 将整个figure分成两行两列,并该图形放在第3个网格 plt.subplot(223) # 绘制正切曲线 plt.plot(x_data, np.tan(x_data)) plt.gca().spines['right'].set_color('none') plt.gca().spines['top'].set_color('none') plt.gca().spines['bottom'].set_position(('data', 0)) plt.gca().spines['left'].set_position(('data', 0)) plt.title('正切曲线') plt.show()

上面程序多次调用 subplot() 函数来生成子图,每次调用 subplot() 函数之后的代码表示在该子图区域绘图。上面程序将整个数据图区域分成 2×2 的网格,程序分别在第 1 个网格中绘制正弦曲线,在第 2 个网格中绘制余弦曲线,在第 3 个网格中绘制正切曲线。

可能有读者感到疑问,plot() 函数不是用于绘制折线图的吗?怎么此处还可用于绘制正弦曲线、余弦曲线呢?

其实此处绘制的依然是折线图。看程序中的 ① 号代码调用 numpy 的 linspace() 函数生成了一个包含多个数值的列表,该数值列表的范围是从 -pi 到 pi,平均分成 64 个数据点,程序中用到的 numpy.sin()、numpy.cos()、numpy.tan() 等函数也返回一个列表:传入这些函数的列表包含多少个值,这些函数返问的列表也包含多少个值。

这意味着上面程序所给制的折线图会包含 64 个转折点,由于这些转折点非常密集,看上去显得比较光滑,因此就变成了曲线。

如果读者将程序中x_data=np.linespace(-np.pi,np.pi,64,endpoint = True)代码的 64 改为4、6等较小的数,将会看到程序绘制的依然是折线图。

运行上面程序,可以看到如图 1 所示的效果。

图 1 生成多个子图

如图 1 所示的显示效果比较差,程序明明只要显示 3 个子图,但第 4 个位置被空出来了,能不能让某个子图占多个网格昵?答案是肯定的,程序做好控制即可。例如,将上面程序改为如下形式:

import matplotlib.pyplot as plt import numpy as np plt.figure() # 定义从-pi到pi之间的数据,平均取64个数据点 x_data = np.linspace(-np.pi, np.pi, 64, endpoint=True) # ① # 将整个figure分成两行一列,第三个参数表示该图形放在第1个网格 plt.subplot(2, 1, 1) # 省略绘制正弦曲线 ... # 将整个figure分成两行两列,并将该图形放在第4个网格 plt.subplot(223) # 省略绘制余弦曲线 ... # 将整个figure分成两行两列,并该图形放在第4个网格 plt.subplot(224) #省略绘制正切曲线 ... plt.show()

上面程序中第 8 行代码将整个区域分成两行一列,并指定子图占用第 1 个网格,也就是整个区域的第一行:第 13 行代码将整个区域分成两行两列,并指定子图占用第 3 个网格(注意不是第 2 个网络,因为第一个子图已经占用了第一行,对于两行两列的网格来说,第一个子图已经占用了两个网格,因此此处指定子图占用第 3 个网格,这意味着该子图在第二行第一格);第 18 行代码将整个区域分成两行两列,并指定子图占用第 4 个网格,这意味着该子图会在第二行第二格。

运行上面程序,可以看到如图 2 所示的效果。

图 2 控制多个子图的分布

如果读者不想这么费劲来计算行、列,将上面程序改为如下形式:

import matplotlib.pyplot as plt import numpy as np import matplotlib.gridspec as gridspec plt.figure() # 定义从-pi到pi之间的数据,平均取64个数据点 x_data = np.linspace(-np.pi, np.pi, 64, endpoint=True) # ① # 将绘图区域分成2行3列 gs = gridspec.GridSpec(2, 3) # 指定ax1占用第一行(0)整行 ax1 = plt.subplot(gs[0, :]) # 指定ax1占用第二行(1)的第一格(第二个参数0代表) ax2 = plt.subplot(gs[1, 0]) # 指定ax1占用第二行(1)的第二、三格(第二个参数0代表) ax3 = plt.subplot(gs[1, 1:3]) # 绘制正弦曲线 ax1.plot(x_data, np.sin(x_data)) ax1.spines['right'].set_color('none') ax1.spines['top'].set_color('none') ax1.spines['top'].set_color('none') ax1.spines['bottom'].set_position(('data', 0)) ax1.spines['left'].set_position(('data', 0)) ax1.set_title('正弦曲线') # 绘制余弦曲线 ax2.plot(x_data, np.cos(x_data)) ax2.spines['right'].set_color('none') ax2.spines['top'].set_color('none') ax2.spines['bottom'].set_position(('data', 0)) ax2.spines['left'].set_position(('data', 0)) ax2.set_title('余弦曲线') # 绘制正切曲线 ax3.plot(x_data, np.tan(x_data)) ax3.spines['right'].set_color('none') ax3.spines['top'].set_color('none') ax3.spines['bottom'].set_position(('data', 0)) ax3.spines['left'].set_position(('data', 0)) ax3.set_title('正切曲线') plt.show()

上面程序中的第 10 行代码将绘图区域分成两行三列;第 12 行代码调用 subplot(gs[0,:]),指定 ax1子图区域占用第一行整行,其中第一个参数 0 代表行号,没有指定列范围,因此该子图在整个第一行;第 14 行代码调用 subplot(gs[1, 0]),指定 ax2 子图区域占用第二行的第一格,其中第一个参数 1 代表第二行,第二个参数 0 代表第一格,因此该子图在第二行的第一格;第 16 行代码调用 subplot(gs [1 , 1 : 3]),指定 ax3 子图区域占用第二行的第二格到第三格,其中第一个参数 1 代表第二行,第二个参数 1:3 代表第二格到第三格,因此该子图在第二行的第二格到第三格。

定义完 ax1、ax2、ax3 这 3 个子图所占用的区域之后,接下来程序就可以通过 ax1、ax2、ax3 的方法在各自的子图区域绘图了。运行上面程序,可以看到如图 3 所示的效果。

图 3 使用 GridSpec 管理子图的分布

python plt.subplot_Python Matplotlib subplot函数详解:创建子图相关推荐

  1. Matplotlib subplot2grid()函数详解

    Matplotlib subplot2grid()函数详解 matplotlib.pyplot 模块提供了 subplot2grid() ,该函数能够在画布的特定位置创建 axes 对象(即绘图区域) ...

  2. python平方数迭代器_对python中的高效迭代器函数详解

    python中内置的库中有个itertools,可以满足我们在编程中绝大多数需要迭代的场合,当然也可以自己造轮子,但是有现成的好用的轮子不妨也学习一下,看哪个用的顺手~ 首先还是要先import一下: ...

  3. python getattr_Python中的getattr()函数详解:

    标签:Python中的getattr()函数详解: getattr(object, name[, default]) -> value Get a named attribute from an ...

  4. python open写入_Python3 open() 函数详解 读取文件写入文件追加文件二进制文件

    Python3 open() 函数详解 读取文件写入文件追加文件二进制文件 open()函数的主要作用是打开文件并返回相应文件对象,使用文件对象可以对当前文件进行读取.写入.追加等操作,默认情况下&q ...

  5. python bytearray转为byte_Python3 bytearray() 函数详解 将参数转为可变的字节数组

    Python3 bytearray() 函数详解 将参数转为可变的字节数组 bytearray()函数的主要用途是将参数转换为一个新的字节数组,它是一个可变的整数序列,它的取值范围是0 <= x ...

  6. python中文件读写--open函数详解

    python中open函数详解 在python中文件的读取分为三步走: 读:打开文件 -> 读文件 -> 关闭文件 (有点像把大象放进冰箱需要几步?的问题) 1.open函数 open函数 ...

  7. Python操作文件之open函数详解

    Python的open函数详解 open(file, mode='rt', encoding=None) -> BaseIO mode参数详解: 字符 含意 'r' 读取(默认) 'w' 写入, ...

  8. python bytes 改值_Python3 bytes() 函数详解 将参数转为不可变的字节数组

    Python3 bytes() 函数详解 将参数转为不可变的字节数组 bytes()函数的主要用途是将参数转换为一个新的字节数组,它是一个不可变的整数序列,它的取值范围是0 <= x < ...

  9. python之append、expend函数详解

    extend.append函数详解 一.列表 1>append()函数 2>extend()函数 二.字符串和元组中都没有append()和extend()函数 一.列表 1>app ...

最新文章

  1. My deep learning reading list
  2. 收藏 | 最新知识图谱论文清单(附解读、下载)
  3. Android SERVICE后台服务进程的自启动和保持
  4. css设置并排,CSS并排排列2个div
  5. 随机洗牌算法 银行家算法
  6. 信息学奥赛一本通 1003:对齐输出 | OpenJudge NOI 1.1 03
  7. 计算机二进制怎么转化成十六进制数是,6、计算机进制之二进制、十进制、十六进制之间的转换...
  8. 混合云存储阵列 > 产品简介 > 应用场景 > 双活容灾
  9. Ubuntu中使用freeradius配置RADIUS,并在RADIUS中配置LDAP 并实现AP认证
  10. JDK各个版本的新特性jdk1.5-jdk8
  11. php中array怎么用,php中array()函数如何使用
  12. 六石管理学:好大喜功,头目们是否相信
  13. 181108每日一句
  14. Julia: 关于Array排序函数sortslices
  15. mysql 游标循环_MySQL 游标 循环
  16. delphi 10.4来了
  17. java库存_java实现超市库存管理系统
  18. 堆Heap块Chunk
  19. Playwright之初体验
  20. 硬币面值组合问题(完全背包问题)

热门文章

  1. 实现简单QQ注册页面
  2. 以计算机写一篇作文500字,有关电脑作文500字3篇
  3. 【大数据基础】基于信用卡逾期数据的Spark数据处理与分析
  4. JetBrains 发布 2019 年 Java 调查报告
  5. HW2018校招软件类笔试题
  6. hive/mysql使用lateral view explode时会出现的问题(bug)
  7. 联通4g测试软件,用联通4G的手机更费电?测试证实比移动4G狠
  8. 米家扫地机器人按键没反应_米家扫地机器人如何恢复出厂设置
  9. 压力表负值表示什么_弹簧管式压力表轻敲变动量居然有负值,我不知道是不是我学的不好,还是计量所所长脑子有病...
  10. PhpSpreadsheet处理Excel 导入、导出并设置样式