matplotlib 子图超过4个_让数据对比更高效,Matplotlib给出了4种创建子图的方法!...

有时候需要从多个角度对数据进行对比。Matplotlib为此提出了子图(subplot)的概念:在较大的图形中同时放置一组较小的坐标轴。这些子图可能是画中画(inset)、网格图(gridof plots),或者是其他更复杂的布局形式。

plt.axes创建子图

创建坐标轴最基本的方法就是使用plt.axes 函数。这个函数的默认配置是创建一个标准的坐标轴,填满整张图。它还有一个可选参数,由图形坐标系统的四个值构成。这四个值分别表示图形坐标系统的[bottom, left, width, height](底坐标、左坐 标、宽度、高度),数值的取值范围是左下角(原点)为 0,右上角为 1。

如果想要在右上角创建一个画中画,那么可以首先将 x y 设置为 0.65(就是坐标轴原点 位于图形高度 65% 和宽度 65% 的位置),然后将 x y 扩展到 0.2(也就是将坐标轴的宽 度与高度设置为图形的 20%)。

ax1 = plt.axes() # 默认坐标轴ax2 = plt.axes([0.65, 0.65, 0.2, 0.2])
527f315c6b2d49c8e4ef61f4ccbc866e.png

使用fig.add_axes()创建两个竖直排列的坐标轴。

fig = plt.figure()ax1 = fig.add_axes([0.1, 0.5, 0.8, 0.4], xticklabels=[], ylim=(-1.2, 1.2))ax2 = fig.add_axes([0.1, 0.1, 0.8, 0.4], ylim=(-1.2, 1.2))x = np.linspace(0, 10)ax1.plot(np.sin(x))ax2.plot(np.cos(x))
fcffe9cc13f2b98f4061c8f2b0070569.png

现在就可以看到两个紧挨着的坐标轴(上面的坐标轴没有刻度):上子图(起点 y 坐标为

0.5 位置)与下子图的 x 轴刻度是对应的(起点 y 坐标为 0.1,高度为 0.4)。

plt.subplot创建网格图

若干彼此对齐的行列子图是常见的可视化任务,Matplotlib 拥有一些可以轻松创建它们的 简便方法。最底层的方法是用 plt.subplot() 在一个网格中创建一个子图。这个命令有三个整型参数——将要创建的网格子图行数、列数和索引值,索引值从 1 开始,从左上角到 右下角依次增大。

for i in range(1, 7): plt.subplot(2, 3, i)plt.text(0.5, 0.5, str((2, 3, i)), fontsize=18, ha='center')
5636550d046c91a4da98328270a24345.png

plt.subplots_adjust 命令可以调整子图之间的间隔。用面向对象接口的命令 fig.add_subplot() 可以取得同样的效果。

fig = plt.figure()fig.subplots_adjust(hspace=0.4, wspace=0.4)for i in range(1, 7): ax = fig.add_subplot(2, 3, i) ax.text(0.5, 0.5, str((2, 3, i)), fontsize=18, ha='center')
f5df8937afa263846e323800cb281e15.png

我们通过 plt.subplots_adjust 的 hspace 与 wspace 参数设置与图形高度与宽度一致的子图间距,数值以子图的尺寸为单位

plt.subplots快速创建网格

当你打算创建一个大型网格子图时,就没办法使用前面那种亦步亦趋的方法了,尤其是当 你想隐藏内部子图的 x 轴与 y 轴标题时。出于这一需求,plt.subplots() 实现了你想要的功能(需要注意此处 subplots 结尾多了个 s)。这个函数不是用来创建单个子图的,而是用一行代码创建多个子图,并返回一个包含子图的 NumPy 数组。关键参数是行数与列数, 以及可选参数 sharex 与 sharey,通过它们可以设置不同子图之间的关联关系。

例如,创建一个 2×3 网格子图,每行的 3 个子图使用相同的 y 轴坐标,每列的 2 个子图 使用相同的 x 轴坐标。

fig, ax = plt.subplots(2, 3, sharex='col', sharey='row')
608928fb254e5a328822f5b525e7e832.png

设置 sharex 与 sharey 参数之后,我们就可以自动去掉网格内部子图的标签,让图形看起来更整洁。坐标轴实例网格的返回结果是一个 NumPy 数组,这样就可以通过标准的数组取值方式轻松获取想要的坐标轴了。

# 坐标轴存放在一个NumPy数组中,按照[row, col]取值 for i in range(2): for j in range(3): ax[i, j].text(0.5, 0.5, str((i, j)), fontsize=18, ha='center')fig
cd02873679907513750691a3dee0945a.png

plt.GridSpec实现更复杂的排列方式

如果想实现不规则的多行多列子图网格,plt.GridSpec() 是最好的工具。plt.GridSpec()对象本身不能直接创建一个图形,它只是 plt.subplot() 命令可以识别的简易接口。

例如, 创建一个带行列间距的 2×3 网格。

grid = plt.GridSpec(2, 3, wspace=0.4, hspace=0.3)

可以通过类Python 切片的语法,设置子图的位置和扩展尺寸。

plt.subplot(grid[0, 0])plt.subplot(grid[0, 1:])plt.subplot(grid[1, :2])plt.subplot(grid[1, 2])
a67d26b998d8e30f64656211f50ff4e1.png

这四种不同的方式,在不同的场景中使用非常的高效。第四种方式适合灵活的排列方式,第三种只要一行代码,就可以快速创建。第二种格子图,方便多个数据对比。第一种在不同的位置创建一个图中图。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值