Python Matplotlib通过plt.subplots创建子绘图

作者:我什么都布吉岛 时间:2022-06-03 08:23:16 

前言

plt.subplots调用后将会产生一个图表(Figure)和默认网格(Grid),与此同时提供一个合理的控制策略布局子绘图。

一、只有子图的绘制

如果没有提供参数给subplots将会返回:

Figure一个Axes对象

例子:

fig, ax = plt.subplots()
ax.plot(x, y)
ax.set_title('A single plot')

Python Matplotlib通过plt.subplots创建子绘图

二、单个方向堆叠子图

堆叠子图就需要用到额外的可选参数,分别是子图的行和列数,如果你只传递一个数字,默认列数为1,行堆叠。

比如:

fig, axs = plt.subplots(2)
fig.suptitle('Vertically stacked subplots')
axs[0].plot(x, y)
axs[1].plot(x, -y)

Python Matplotlib通过plt.subplots创建子绘图

当然如果你的子图比较少,可以考虑用元组接收axes对象:

fig, (ax1, ax2) = plt.subplots(2)
fig.suptitle('Vertically stacked subplots')
ax1.plot(x, y)
ax2.plot(x, -y)

如果想要按照行排列,将参数改成(1,2)即可。

三、行列方向扩展子图

如果行列扩展子图,那么axes返回的则是一个二维Numpy数组。利用axe的flat属性,可以批量对轴进行赋值。

fig, axs = plt.subplots(2, 2)
axs[0, 0].plot(x, y)
axs[0, 0].set_title('Axis [0, 0]')# 等价于axes[0][0]
axs[0, 1].plot(x, y, 'tab:orange')
axs[0, 1].set_title('Axis [0, 1]')
axs[1, 0].plot(x, -y, 'tab:green')
axs[1, 0].set_title('Axis [1, 0]')
axs[1, 1].plot(x, -y, 'tab:red')
axs[1, 1].set_title('Axis [1, 1]')

for ax in axs.flat:
   ax.set(xlabel='x-label', ylabel='y-label')

# Hide x labels and tick labels for top plots and y ticks for right plots.
for ax in axs.flat:
   ax.label_outer()

当然你可以用单个轴对象接收:

fig, ((ax1, ax2), (ax3, ax4)) = plt.subplots(2, 2)
fig.suptitle('Sharing x per column, y per row')
ax1.plot(x, y)
ax2.plot(x, y**2, 'tab:orange')
ax3.plot(x, -y, 'tab:green')
ax4.plot(x, -y**2, 'tab:red')

for ax in fig.get_axes():
   ax.label_outer()

四、共享轴

默认情况下,每个子图都是独立创建的。

看下面这个例子:

fig, (ax1, ax2) = plt.subplots(2)
fig.suptitle('Axes values are scaled individually by default')
ax1.plot(x, y)
ax2.plot(x + 1, -y)

Python Matplotlib通过plt.subplots创建子绘图

可以看出两者的横坐标刻度并不对齐,那么应该如何设置共享?答:在subplot创建之时使用sharex=Truesharedy=True分别创建X轴共享或者Y轴共享。

将上边的例子修改为以下:

fig, (ax1, ax2) = plt.subplots(2, sharex=True)
fig.suptitle('Aligning x-axis using sharex')
ax1.plot(x, y)
ax2.plot(x + 1, -y)

结果如下:

Python Matplotlib通过plt.subplots创建子绘图

OK,看上去确实统一了坐标轴,除此,python帮你移除了多余的坐标刻度,上面中间的刻度被删除了。

如果你觉得中间的留白不太舒服的话,也有办法去除。方法是通过GridSpec对象,但是使用上就比较麻烦了,因为你需要自己创建一个figure并使用add_gridspec返回这个对象,然后再通过subplot进行接下来的操作。

直接看例子吧:

fig = plt.figure()
gs = fig.add_gridspec(3, hspace=0)
axs = gs.subplots(sharex=True, sharey=True)
fig.suptitle('Sharing both axes')
axs[0].plot(x, y ** 2)
axs[1].plot(x, 0.3 * y, 'o')
axs[2].plot(x, y, '+')

# Hide x labels and tick labels for all but bottom plot.
for ax in axs:
   ax.label_outer()

Python Matplotlib通过plt.subplots创建子绘图

这里还用到了轴的label_outer方法,这是用来隐藏非边界的坐标轴的。“share”在这里的意思是:共享一个坐标轴,也就意味着刻度的位置是对齐的。

请注意,修改sharex和sharey是全局修改的,所以你如果想让每一行和每一列共享一个坐标轴,可以考虑用sharex='col', sharey='row'

fig = plt.figure()
gs = fig.add_gridspec(2, 2, hspace=0, wspace=0)
(ax1, ax2), (ax3, ax4) = gs.subplots(sharex='col', sharey='row')
fig.suptitle('Sharing x per column, y per row')
ax1.plot(x, y)
ax2.plot(x, y**2, 'tab:orange')
ax3.plot(x + 1, -y, 'tab:green')
ax4.plot(x + 2, -y**2, 'tab:red')

for ax in axs.flat:
   ax.label_outer()

Python Matplotlib通过plt.subplots创建子绘图

如果你需要关联更加复杂的共享轴关系,可以创建出来使用axe的成员sharex、sharey进行设置:

fig, axs = plt.subplots(2, 2)
axs[0, 0].plot(x, y)
axs[0, 0].set_title("main")
axs[1, 0].plot(x, y**2)
axs[1, 0].set_title("shares x with main")
axs[1, 0].sharex(axs[0, 0])
axs[0, 1].plot(x + 1, y + 1)
axs[0, 1].set_title("unrelated")
axs[1, 1].plot(x + 2, y + 2)
axs[1, 1].set_title("also unrelated")
fig.tight_layout()# 让绘图更加紧凑

Python Matplotlib通过plt.subplots创建子绘图

五、极坐标子图

fig, (ax1, ax2) = plt.subplots(1, 2, subplot_kw=dict(projection='polar'))
ax1.plot(x, y)
ax2.plot(x, y ** 2)
plt.show()

Python Matplotlib通过plt.subplots创建子绘图

来源:https://blog.csdn.net/weixin_39258979/article/details/126039763

标签:Python,Matplotlib,plt.subplots,创建,子绘图
0
投稿

猜你喜欢

  • CentOS7中使用shell脚本安装python3.8环境(推荐)

    2022-08-24 17:04:24
  • python实现三阶魔方还原的示例代码

    2021-03-12 08:45:04
  • Python命令行参数解析模块getopt使用实例

    2021-02-20 08:53:48
  • 如何用Response.Write调用代替内嵌表达式?

    2010-06-13 14:33:00
  • Python包,__init__.py功能与用法分析

    2021-06-17 22:19:54
  • python中如何使用函数改变list

    2022-06-04 13:38:38
  • 基于JS实现动态跟随特效的示例代码

    2023-06-30 11:15:16
  • Oracle Session每日统计功能实现

    2023-07-22 09:47:24
  • Python中多线程及程序锁浅析

    2023-06-02 02:59:33
  • python的几种矩阵相乘的公式详解

    2021-03-28 21:13:56
  • 关于python简单的爬虫操作(requests和etree)

    2022-01-08 02:17:27
  • Python实现的爬取豆瓣电影信息功能案例

    2023-07-18 21:59:25
  • 解析Oracle数据库中的对象集合schema

    2023-07-22 20:42:34
  • Python下载网络小说实例代码

    2023-08-01 18:22:17
  • PHP的mysqli_stat()函数讲解

    2023-06-12 08:11:33
  • Python中csv模块的基本使用教程

    2021-06-20 21:49:55
  • MYSQL教程:服务器优化和硬件优化

    2009-02-27 15:43:00
  • 后台程序开发常用jQuery插件

    2010-04-06 12:11:00
  • SQL Server查询速度慢的原因及优化方法

    2009-01-05 13:46:00
  • Python+matplotlib绘制饼图和堆叠图

    2022-11-17 05:42:40
  • asp之家 网络编程 m.aspxhome.com