matplotlib之pyplot模块——在特定网格位置中添加一个子图(subplot2grid)_matplotlib.pyplot.subplot2grid_mighty13的博客-程序员宅基地

技术标签: Matplotlib  subplot2grid  网格  子图  matplotlib  subplot  

当前有效matplotlib版本为:3.4.1

函数概述

subplot2grid函数的功能是在特定网格位置中添加一个子图。

函数的定义签名为:matplotlib.pyplot.subplot2grid(shape, loc, rowspan=1, colspan=1, fig=None, **kwargs)

函数的调用签名为:
ax = subplot2grid((nrows, ncols), (row, col), rowspan, colspan)

函数的参数为:

  • shape:定义子图网格的行数和列数。整数二元组,(nrows, ncols)
  • loc:定义新增子图在子图网格中的位置(行、列索引)。整数二元组,(nrow, ncol)
  • rowspan:定义新增子图向下跨越的行数。可选参数。整数,默认值为1
  • colspan:定义新增子图向右跨越的列数。可选参数。整数,默认值为1
  • fig:用于设置添加子图的Figure对象。可选参数。Figure对象。默认值为当前Figure对象。
  • subplot_kw :用于向创建子图时的底层函数 ~matplotlib.figure.Figure.add_subplot传递关键字参数。可选参数。字典。
  • **kwargs:用于向~.Figure.add_subplot传递的关键字参数。可选参数。

函数的返回值为:
.axes.SubplotBase实例,或其他~.axes.Axes的子类实例。

函数原理

subplot2grid函数其实是fig.add_subplot方法的封装。源码为:

def subplot2grid(shape, loc, rowspan=1, colspan=1, fig=None, **kwargs):

    if fig is None:
        fig = gcf()

    rows, cols = shape
    gs = GridSpec._check_gridspec_exists(fig, rows, cols)

    subplotspec = gs.new_subplotspec(loc, rowspan=rowspan, colspan=colspan)
    ax = fig.add_subplot(subplotspec, **kwargs)
    bbox = ax.bbox
    axes_to_delete = []
    for other_ax in fig.axes:
        if other_ax == ax:
            continue
        if bbox.fully_overlaps(other_ax.bbox):
            axes_to_delete.append(other_ax)
    for ax_to_del in axes_to_delete:
        delaxes(ax_to_del)

    return ax

因此ax = subplot2grid((nrows, ncols), (row, col), rowspan, colspan)相当于

fig = gcf()
gs = fig.add_gridspec(nrows, ncols)
ax = fig.add_subplot(gs[row:row+rowspan, col:col+colspan])

案例:简易应用

import matplotlib.pyplot as plt


def annotate_axes(fig):
    for i, ax in enumerate(fig.axes):
        ax.text(0.5, 0.5, "ax%d" % (i+1), va="center", ha="center")
        ax.tick_params(labelbottom=False, labelleft=False)


fig = plt.figure()
ax1 = plt.subplot2grid((3, 3), (0, 0), colspan=3)
ax2 = plt.subplot2grid((3, 3), (1, 0), colspan=2)
ax3 = plt.subplot2grid((3, 3), (1, 2), rowspan=2)
ax4 = plt.subplot2grid((3, 3), (2, 0))
ax5 = plt.subplot2grid((3, 3), (2, 1))

annotate_axes(fig)

plt.show()

在这里插入图片描述

案例:混合应用subplotsubplotssubplot2grid函数

import matplotlib.pyplot as plt

# 添加3行3列子图9个子图
fig, axes = plt.subplots(3, 3)
# 为第1个子图绘制图形
axes[0, 0].bar(range(1, 4), range(1, 4))
# 使用subplot函数为第5个子图绘制图形
plt.subplot(335)
plt.plot(1,'o')
# 使用subplot2grid函数将第三行子图合并为1个
plt.subplot2grid((3,3),(2,0),colspan=3)
# 返回值为Axes对象列表,元素个数为7
print(fig.axes)
plt.show()

在这里插入图片描述

subplotsubplot2grid函数之间的比较

subplot函数和subplot2grid函数极其相似。

  • 都可以向当前图像中添加一个子图。
  • 返回值也都是一个Axes实例。
  • 都可以指定子图在子图网格中的位置。

不同之处在于指定子图网格中位置的方法,特别是不规则子图布局时。

  • subplot函数指定位置的方法相对比较隐晦,比如子图位置重叠时,隐含删除被覆盖子图。
  • subplot2grid函数借助gridspec指定位置时相对清晰。

例如:

import matplotlib.pyplot as plt

# 绘制1行2列子图中的第1个子图
plt.subplot(121,facecolor='r')
# 绘制2行2列子图中的第2个子图
plt.subplot(222,facecolor='g')
# 绘制2行2列子图中的第4个子图
plt.subplot(224,facecolor='b')

plt.show()

等价于

import matplotlib.pyplot as plt

# 绘制1行2列子图中的第1个子图
plt.subplot2grid((2,2),(0,0),rowspan=2,facecolor='r')
# 绘制2行2列子图中的第2个子图
plt.subplot(222,facecolor='g')
# 绘制2行2列子图中的第4个子图
plt.subplot(224,facecolor='b')

plt.show()
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/mighty13/article/details/116140986

智能推荐

linux修改mysql配置文件_忘记MySQL密码了!?莫慌~-mysql教程-程序员宅基地

mysql教程栏目带大家解决忘记MySQL密码问题。在安装完 MySQL 或者是在使用 MySQL 时,最尴尬的就是忘记密码了,墨菲定律也告诉我们,如果一件事有可能出错,那么它一定会出错。那如果我们不小心忘记了 MySQL 的密码,该如何处理呢?别着急,本文教你一招搞定。1.修改 MySQL 配置文件首先我们需要打开 MySQL 的配置文件,如果是 Windows 系统的话,MySQL 的配置文件...

validate无效,表单验证触发的修改_表单验证validate未触发-程序员宅基地

validate无效,鼠标失去焦点没有触发表单验证,表单验证触发的修改如果只是单纯的鼠标失去焦点没有触发validate表单验证,有可能是validate的默认验证触发方式的问题,默认触发方式为 onsumit 是提交时触发表单验证,只有在表单提交时触发表单验证。这种方式有时无返满足需求,可以开启其他的触发方式或关闭触发方式,方式如下:验证的触发方式有onsubmit,onfocusout,onkeyup,onclick,focusInvalid,用onfocusout为例:$("表单的选择器"_表单验证validate未触发

代码为什么在本地编译器正常输出但在PTA编译器上无输出但也不报错?_pta编译器输出-程序员宅基地

这里写目录标题问题描述:原因:解决办法:注:(其他的PTA提交注意)问题描述:我写的代码在本地Eclipse中输出正常,但是在PTA中无任何输出,但是也没有报错,这让我百思不得其姐。原因:有可能是你的代码中包含package定义,而PTA平台编译器中不能“定义包”,虽然不会报错,但是不会输出任何结果!!!解决办法:在PTA中去除包定义 。我这里是package 甲级 (我代码定义了“甲级”包,我的程序放在了甲级这个包中)在去除了package 甲级后就,就正常输出结果了!!_pta编译器输出

从UEBA到SOAR_ueba edr-程序员宅基地

在互联网普及的20多个年头中,企业安全经历了几次变革,从最开始的设置简单的防火墙、虚拟局域网到安全运营中心建设;2005年,随着数据过载,安全信息及事件管理(SIEM)正式诞生,并成为SOC不可或缺的帮手,被广泛应用;而2015年后,随着SIEM的管理越来越复杂,处理数量越来越大,用户实体行为分析(UEBA)与安全编排自动化响应(SOAR)应运而生。传统安全主要基于威胁情报、流量特征、设备指纹等方式识别,但对于机器合法接口、真人恶意行为等容易产生错判、漏判,UEBA强调用户行为分析,以用户为视角基于行为_ueba edr

随便推点

带音符字母html表示-程序员宅基地

在处理人名时有时会遇到带有音符的字母,貌似是法语里面的,有时候在网页中直接以字符表示,如á,有时候会用á表示,以下内容都是我一个一个试出来的French_alphabet = { 'á': 'á', 'à': 'à', 'â': 'â', 'ä': 'ä', 'Á': 'Á', 'À': 'À', 'Â'

window.history.back() 返回上一页 有时候需要点击多次_react history.back需要点两次才能返回-程序员宅基地

今天遇到两个小问题记录一下1-window.history.back() 返回上一页 有时候需要点击多次,这是为什么呢?原来Windows下的window.history.back()后退后返回的不只是前一个页而是前一个页的状态。如果一个页我修改了3次那必须后退3次才能回到前一个页。怎么处理这种情况呢,我在网上找了下,并没有特别契合我现在的情况的,无非就是 让我写具体的跳转地址,但凡我能知道具体地址,我还用纠结嘛。。最终经过各种测试 实操有效的代码来了,下面展示一些 内联代码片。history._react history.back需要点两次才能返回

JVM篇 -- JDK安装目录下的所有文件说明_jdk根目录全是文件-程序员宅基地

JDK安装目录下的文件说明1.bin该路径下存放了JDK的各种工具命令,常用的javac、java等命令就放在该路径下。基本工具这些工具是JDK的基础,用这些工具来编写应用程序。 工具名称 用途 javac.exe Java语言编译器 java.exe Java应用程..._jdk根目录全是文件

html模板标签-程序员宅基地

在VS code中写html文档时,一般会先用快捷方式生成html的基本框架,即html模版。这些自动生成的标签,比较多地出现在`head`内,好多老师讲解的时候都会让我们先不用管这些代码,但是自己又很好奇,所以搜集了一些资料,毕竟知识之间都是有联系的,一个很细微的点深究下去可能都是无底洞,所以现做如下整理,当然若以后有了更多了解还会再做补充:_html模板标签

PreparedStatement与SQL批处理-程序员宅基地

1、服务器如何执行SQL语句?  当服务器接收到一条SQL语句后,服务器先要校验这条SQL语句的语法格式是否正确,然后把SQL语句编译成可执行的函数,最后执行这个函数就是执行了SQL语句。其中校验语法,和编译所花的时间比执行SQL语句花的时间还要多很多。比如我们要执行多次insert语句,如果按照平常方法,会每插入一条记录就写一条SQL语句,所以MySQL服务器需要每次都去校验每一条S