matplotlib之pyplot模块——调整子图布局(subplots_adjust、tight_layout)

Matplotlib布局全解析:从边距调整到子图间距控制 在数据可视化领域,图形布局是决定图表专业性与可读性的关键技术。其核心原理在于对画布空间、坐标系系统与元素相对位置的精确控制,通过调整边距、间距等参数实现信息的高效传达。这一技术对于提升学术论文插图、数据分析报告及交互式仪表板的视觉效果具有重要价值。在实际应用中,无论是处理多子图面板的排列,还是优化图例、标签的显示,都需要掌握从基础参数调整到高级布局管理的系统方法。本文聚焦于Matplotlib中的布局实践,深入探讨了**Figure边距**的精细调控与**子图间距**的优化策略,帮助开发者解决常见的元素重叠 阅读详情
AI摘要

本文详细介绍了Python中matplotlib库的subplots_adjust和tight_layout两个函数,用于调整多子图的布局。subplots_adjust允许用户自定义子图的左右、上下、宽度和高度间距,而tight_layout则自动计算合适的间距以适应图像。通过案例展示了这两个函数的使用,并解释了其内部原理,包括如何与rcParams结合以及如何更新子图参数。同时,还提到了rcParams中的figure.autolayout设置,可以自动应用tight_layout效果。

在pyplot模块中,与调整子图布局的函数主要为subplots_adjust和tight_layout,其中subplots_adjust是修改子图间距的通用函数,tight_layout默认执行一种固定的间距配置,也可以自定义间距配置,底层原理类似于subplots_adjust函数。

subplots_adjust函数概述

subplots_adjust函数的功能为调整子图的布局参数。对于没有设置的参数保持不变,初始值由rcParams["figure.subplot.[name]"]提供。

函数的签名为matplotlib.pyplot.subplots_adjust(left=None, bottom=None, right=None, top=None, wspace=None, hspace=None)

函数的参数如下:

  • left:所有子图整体相对于图像的左外边距,距离单位为图像宽度的比例(小数)。可选参数。浮点数。默认值为0.125。
  • right:所有子图整体相对于图像的右外边距,距离单位为图像宽度的比例(小数)。可选参数。浮点数。默认值为0.0。
  • bottom:所有子图整体相对于图像的下外边距,距离单位为图像高度的比例(小数)。可选参数。浮点数。默认值为0.11。
  • top:所有子图整体相对于图像的上外边距,距离单位为图像高度的比例(小数)。可选参数。浮点数。默认值为0.88。
  • wspace:子图间宽度内边距,距离单位为子图平均宽度的比例(小数)。浮点数。默认值为0.2。
  • hspace:子图间高度内边距,距离单位为子图平均高度的比例(小数)。可选参数。浮点数。默认值为0.2。

rcParams["figure.subplot.[name]"]的值如下:

## The figure subplot parameters.  All dimensions are a fraction of the figure width and height.
#figure.subplot.left:   0.125  # the left side of the subplots of the figure
#figure.subplot.right:  0.9    # the right side of the subplots of the figure
#figure.subplot.bottom: 0.11   # the bottom of the subplots of the figure
#figure.subplot.top:    0.88   # the top of the subplots of the figure
#figure.subplot.wspace: 0.2    # the amount of width reserved for space between subplots,
                               # expressed as a fraction of the average axis width
#figure.subplot.hspace: 0.2    # the amount of height reserved for space between subplots,
                               # expressed as a fraction of the average axis height

subplots_adjust函数原理

根据以下源码可知,子图间距的默认设置即rcParams["figure.subplot.[name]"],使用subplots_adjust函数调整后,间距配置保存在figure.subplotpars。

pyplot.subplots_adjust()源码

def subplots_adjust(
        left=None, bottom=None, right=None, top=None, wspace=None,
        hspace=None):
    return gcf().subplots_adjust(
        left=left, bottom=bottom, right=right, top=top, wspace=wspace,
        hspace=hspace)

figure.Figure.subplots_adjust()源码

def subplots_adjust(self, left=None, bottom=None, right=None, top=None,
                    wspace=None, hspace=None):
    if self.get_constrained_layout():
        self.set_constrained_layout(False)
        _api.warn_external(
            "This figure was using constrained_layout, but that is "
            "incompatible with subplots_adjust and/or tight_layout; "
            "disabling constrained_layout.")
    self.subplotpars.update(left, bottom, right, top, wspace, hspace)
    for ax in self.axes:
        if isinstance(ax, SubplotBase):
            ax._set_position(ax.get_subplotspec().get_position(self))
    self.stale = True

figure.Figure.__init__()源码

if subplotpars is None:
    subplotpars = SubplotParams()

self.subplotpars = subplotpars

figure.SubplotParams类源码

class SubplotParams:
    """
    A class to hold the parameters for a subplot.
    """
    def __init__(self, left=None, bottom=None, right=None, top=None,
                 wspace=None, hspace=None):
        self.validate = True
        for key in ["left", "bottom", "right", "top", "wspace", "hspace"]:
            setattr(self, key, mpl.rcParams[f"figure.subplot.{key}"])
        self.update(left, bottom, right, top, wspace, hspace)

    def update(self, left=None, bottom=None, right=None, top=None,
               wspace=None, hspace=None):
        """
        Update the dimensions of the passed parameters. *None* means unchanged.
        """
        if self.validate:
            if ((left if left is not None else self.left)
                    >= (right if right is not None else self.right)):
                raise ValueError('left cannot be >= right')
            if ((bottom if bottom is not None else self.bottom)
                    >= (top if top is not None else self.top)):
                raise ValueError('bottom cannot be >= top')
        if left is not None:
            self.left = left
        if right is not None:
            self.right = right
        if bottom is not None:
            self.bottom = bottom
        if top is not None:
            self.top = top
        if wspace is not None:
            self.wspace = wspace
        if hspace is not None:
            self.hspace = hspace

案例:subplots_adjust()修改间距验证

import matplotlib.pyplot as plt

# 原始间距配置
fig,ax=plt.subplots(3,3)
print(vars(fig.subplotpars))
# 通过subplots_adjust()设置间距配置
plt.subplots_adjust(left=0.1,bottom=0.1,right=0.9,top=0.9,wspace=0.1,hspace=0.1)
print(vars(fig.subplotpars))
plt.show()

输出:

{'validate': True, 'left': 0.125, 'bottom': 0.125, 'right': 0.9, 'top': 0.88, 'wspace': 0.2, 'hspace': 0.2}
{'validate': True, 'left': 0.1, 'bottom': 0.1, 'right': 0.9, 'top': 0.9, 'wspace': 0.1, 'hspace': 0.1}

原始间距设置
在这里插入图片描述

subplots_adjust()修改间距后
在这里插入图片描述

tight_layout函数概述

tight_layout函数的功能为子图的内边距。备注:对axes()函数生成的子图无效。

函数的签名为matplotlib.pyplot.tight_layout(*, pad=1.08, h_pad=None, w_pad=None, rect=None)

函数的参数如下:

  • pad:所有子图整体边缘相对于图像边缘的内边距,距离单位为字体大小的比例(小数,与rcParams["font.size"]相关)。可选参数。浮点数。默认值为1.08。
  • h_pad, w_pad:子图之间的内边距,距离单位为字体大小的比例(小数)。可选参数。浮点数。默认值为pad。
  • rect:绘制子图的矩形区域的归一化坐标。可选参数。4元组(left, bottom, right, top)。默认值为(0, 0, 1, 1)。

tight_layout函数原理

根据以下源码可知pyplot.tight_layout()函数主要通过matplotlib.tight_layout模块相关函数构造子图间距设置,最终通过figure.Figure.subplots_adjust函数更新设置。

pyplot.tight_layout()源码

def tight_layout(pad=1.08, h_pad=None, w_pad=None, rect=None):
    gcf().tight_layout(pad=pad, h_pad=h_pad, w_pad=w_pad, rect=rect)

figure.Figure.tight_layout()源码

def tight_layout(self, *, pad=1.08, h_pad=None, w_pad=None, rect=None):
    from .tight_layout import (
        get_renderer, get_subplotspec_list, get_tight_layout_figure)
    from contextlib import suppress
    subplotspec_list = get_subplotspec_list(self.axes)
    if None in subplotspec_list:
        _api.warn_external("This figure includes Axes that are not "
                            "compatible with tight_layout, so results "
                            "might be incorrect.")

    renderer = get_renderer(self)
    ctx = (renderer._draw_disabled()
            if hasattr(renderer, '_draw_disabled')
            else suppress())
    with ctx:
        kwargs = get_tight_layout_figure(
            self, self.axes, subplotspec_list, renderer,
            pad=pad, h_pad=h_pad, w_pad=w_pad, rect=rect)
    if kwargs:
        self.subplots_adjust(**kwargs)

案例:应用tight_layout后验证间距配置

import matplotlib.pyplot as plt

# 原始间距配置
fig,ax=plt.subplots(3,3)
print(vars(fig.subplotpars))
# 设置tight_layout之后的默认间距配置
plt.tight_layout()
print(vars(fig.subplotpars))
# 设置tight_layout内边距之后的间距配置
plt.tight_layout(h_pad=2.5,w_pad=2.5)
print(vars(fig.subplotpars))
plt.show()

输出为:

{'validate': True, 'left': 0.125, 'bottom': 0.125, 'right': 0.9, 'top': 0.88, 'wspace': 0.2, 'hspace': 0.2}
{'validate': True, 'left': 0.0779513888888889, 'bottom': 0.09652777777777778, 'right': 0.9566261574074074, 'top': 0.9486111111111112, 'wspace': 0.42123244337593335, 'hspace': 0.5247524752475248}
{'validate': True, 'left': 0.0779513888888889, 'bottom': 0.0965277777777778, 'right': 0.9566261574074075, 'top': 0.9486111111111111, 'wspace': 0.6248542240052247, 'hspace': 0.8996088657105613}

扩展

通过设置rcParams['figure.autolayout']=True可图像自动应用tight_layout。

## Figure layout
#figure.autolayout: False  # When True, automatically adjust subplot
                           # parameters to make the plot fit the figure
                           # using `tight_layout`
#figure.constrained_layout.use: False  # When True, automatically make plot
                                       # elements fit on the figure. (Not
                                       # compatible with `autolayout`, above).
#figure.constrained_layout.h_pad:  0.04167  # Padding around axes objects. Float representing
#figure.constrained_layout.w_pad:  0.04167  # inches. Default is 3/72 inches (3 points)
#figure.constrained_layout.hspace: 0.02     # Space between subplot groups. Float representing
#figure.constrained_layout.wspace: 0.02     # a fraction of the subplot widths being separated.
jupyter中subplots_adjust()调整子图大小无效、子图溢出和日期标签遮挡坐标轴刻度的问题解决 阅读详情

相关推荐

plt绘图—取消坐标轴,边框处理,白边处理,颜色图谱

调整图片像素或大小 plt.figure(dpi= 150) plt.figure(figsize=(16,4)) 取消坐标轴 ax = plt.subplot() ax.contourf(grid_x_plot, grid_y_plot, f_plot, levels = levels, cmap=cmap2) ax.set_xticks([]) ax.set_yticks([]) 不显示图...

qq_24591139的博客 7979

XAMPP phpmyadmin修改mysql密码

我手动修改了mysql的root账户的密码,然后就访问不了phpmyadmin了。 解决方法: 打开xampp目录(默认的安装目录,如果修改,请找到xampp的安装目录),打开phpmyadmin的目录,在该目录下找到config.inc.php 修改如下配置,保存,重启apache,在地址栏输入localhost/phpmyadmin,就可以直接进入phpmyadmin的管理界面了 ...

weixin_33778778的博客 301

Matplotlib图表布局全解析:从边距调整到子图间距控制

在数据可视化中,图表布局是影响信息传达效果的关键因素。其核心原理在于控制图形容器(Figure)与绘图区域(Axes)之间的空间关系,通过调整边距(Margins)和间距(Spacings)来优化可读性。这一技术价值在于能够提升图表的专业性和清晰度,避免元素重叠或裁剪,确保数据故事被准确呈现。在实际应用场景中,无论是科研论文、商业报告还是仪表盘开发,合理的布局都至关重要。本文聚焦于Matplotlib中的布局控制,详细介绍了如何使用`tight_layout`、`constrained_layout`等自动

weixin_30512043的博客 383

subplots_adjust()函数--matplotlib

调整子区的展现效果。

chongbaikaishi的博客 4776

Matplotlib子图布局:Subplot与Axes核心概念与实战指南

在数据可视化领域,子图布局是构建复杂图表的基础技术。其核心原理在于将图形区域划分为多个独立的坐标系,每个坐标系称为一个Axes对象,它是承载所有绘图元素(如坐标轴、数据线、标签)的容器。理解这一原理对于实现高效、灵活的可视化至关重要,它使得用户能够精确控制每个绘图区域的位置、大小和样式。从技术价值看,掌握子图布局不仅能提升图表的美观度和信息密度,更是实现自动化报告、仪表盘等高级应用的关键。在实际应用场景中,无论是科研论文中的多图对比、商业报告中的指标展示,还是实时监控系统的数据面板,都依赖于稳健的子图管理。

weixin_30448603的博客 497

图像拼接实战:subplots与subplot用法对比及批量可视化

在深度学习与数据分析过程中,可视化是理解数据的关键手段。matplotlib作为Python生态核心绘图库,提供了灵活的坐标轴管理机制,其中subplot与subplots分别适用于动态绘制与批量网格布局。掌握两者的差异及Figure-Axes结构,能够大幅提升多图展示的效率与代码可维护性。图像拼接在数据集预览、模型输出对比、训练过程监控等场景中尤为常用,结合PyTorch和FashionMNIST可快速实践批量可视化框架。从基础概念到工程实现,详解常见坑点,帮助读者高效生成专业美观的图像网格。

weixin_34198762的博客 606

python学习之基础内容(三)

三. Matplotlib数据可视化 1.安装及导入 Pip安装:pip install matplotlib 导入库:import matplotlib.pyplt as plt 2.画布 3.绘图 #Matplotlib绘图 import matplotlib.pyplot as plt plt.figure(figsize=(3,2),facecolor="green") plt.plot() #绘制空白图形 plt.show() #显示绘图 4.参数设置

liuyingshudian的博客 3255

Matplotlib子图与多子图实战:从基础布局到复杂仪表盘构建

数据可视化是数据分析与科学计算中的核心环节,其本质是将抽象数据转化为直观图形,以揭示数据内在的模式、趋势与关联。在Python生态中,Matplotlib作为最基础且强大的绘图库,其子图(Subplot)功能是实现多图表协同展示的关键技术。通过创建包含多个坐标轴(Axes)的画布(Figure),开发者可以在单一视图中组织折线图、柱状图、饼图等不同图表类型,形成逻辑严谨的“数据故事板”。这项技术的核心价值在于提升信息密度与叙事效率,广泛应用于数据分析报告、学术论文图表以及实时监控仪表盘等场景。本文聚焦于Ma

weixin_33795806的博客 321

Matplotlib Introductory Pyplot tutorial

bottom:所有子图整体相对于图像的下外边距,距离单位为图像高度的比例(小数)。left:所有子图整体相对于图像的左外边距,距离单位为图像宽度的比例(小数)。默认值为0.125。right:所有子图整体相对于图像的右外边距,距离单位为图像宽度的比例(小数)。top:所有子图整体相对于图像的上外边距,距离单位为图像高度的比例(小数)。hspace:子图间高度内边距,距离单位为子图平均高度的比例(小数)。设置值的时候,所有artists都会被影响, 当查询允许的值的时候, 只有序列中的第一个实例会被查询.

weixin_55688821的博客 237

别再被matplotlib子图大小搞懵了!用GridSpec轻松搞定等宽等高子图布局(附完整代码)

上周我准备投稿的论文图表就遭遇了这个尴尬——四个并排的热图,理论上应该完全等宽,但实际输出时却像被随意拉伸的橡皮筋,宽度各不相同。更糟的是,当我尝试添加colorbar后,整个布局彻底崩坏。这种问题在学术图表中尤为致命,因为严谨的排版直接影响评审人对研究专业性的第一印象。是matplotlib的网格布局引擎,它允许我们像CSS Grid那样精确控制每个子图的位置和尺寸比例。的等宽只是初始分配,实际渲染时会根据内容动态调整,这是科研图表需要精确控制时的致命缺陷。:多行子图的高度不一致。:子图间距过大或过小。

340

Matplotlib复杂子图嵌套布局:GridSpec、subplot2grid与inset_axes实战详解

在数据可视化领域,图表布局是提升信息传达效率的关键技术。其核心原理在于对画布空间进行精细化分割与坐标轴管理,以实现多图表的高效组合。这项技术的核心价值在于能够将复杂的数据关系通过逻辑清晰的视觉层次呈现,从而在学术研究、商业分析等场景中制作出信息密度高、可读性强的专业级图表。Matplotlib作为Python生态中功能强大的绘图库,其底层的Figure与Axes对象为复杂布局提供了基础。针对子图嵌套这一常见需求,GridSpec通过虚拟网格系统实现了比例精确的布局控制,subplot2grid提供了直观的坐

weixin_30660027的博客 371

掌握Matplotlib画图白边控制:从默认布局到精准裁剪

本文详细解析了Matplotlib画图时白边的控制技巧,从默认布局到精准裁剪。通过介绍`bbox_inches`、`pad_inches`等关键参数,帮助用户优化图片保存效果,适用于学术论文、PPT插图等场景。特别推荐`tight_layout`和`subplots_adjust`方法,实现像素级布局调整,提升图表美观度。

leonard61306500的专栏 371

数据科学:Matplotlib、Seaborn笔记

数据科学:Matplotlib、Seaborn笔记

算法工程师 1411

Matplotlib中plot、subplot与subplots的区别与选型指南

数据可视化中,绘图函数与布局工具的分工是核心概念。plot负责在当前坐标系绘制数据,subplot和subplots则管理画布分块。理解“先布局、后画图”的原理,能避免坐标系错乱和图形重叠。合理选用布局工具可提升多子图对比效率,适用于数据分析、科研绘图和工程报表等场景。本文深入解析plot、subplot、subplots三者的角色定位、常见误用及选型策略,帮助开发者避开混用陷阱,写出清晰高效的可视化代码。

weixin_33892359的博客 388

[小技巧] 如何复制知乎电子书中的文字和图片

文章目录一、背景二、复制文字1.最简单的方法(适合短小文字)2. 进阶方法(适合大段文字)三、复制图片四、注意事项 一、背景 有时候希望从书中摘录一部分文字作为笔记,但是知乎电子书阅读时候是禁止copy的,要么手打,要么OCR,给学习带来了一些不便。 审查元素后发现,知乎电子书是把文字分成一段一段的,试图F12直接copy不太方便。 本问将以谷歌Chrome浏览器为例,给出复制小技巧。 二、复制文字 1.最简单的方法(适合短小文字) 选中你需要的文字,左键单击不放,直接拖到地址栏。 然后可以从地址栏中

江南蜡笔小新 9246

40分钟快速入门Dart基础(上)

针对final 和const 理解的有点模糊的可以参考这篇文章: 可以参考这里Flutter 知识梳理(Dart)-Dart中static final const 区别看是不是超级好上手,好操作~其实Dart的整个学习起来还是蛮简单的,对于有基础的老司机更简单一些。分分钟敲起来~这篇文章就简单的介绍到这里如何短时间快速入门Dart,避免入坑。由于是想让大家快速入门Flutter,所以针对上面的这些章节我们讲解的只是一些在开发Flutter 过程中常用的一些方法和函数。

qq_7813180 4570

Python绘图避坑指南:plot、subplot、subplots到底怎么选?

数据可视化中,绘图接口的选择直接影响代码可维护性。plot作为绘图方法依附于坐标轴对象,subplot用于手动划分网格区域,subplots则一次性创建画布与坐标轴数组。理解三者的本质差异,能有效避免子图重叠、状态错乱等常见问题。在数据分析、课程作业和实验报告等场景中,合理选用subplots可显著提升多子图布局效率,实现批量属性统一设置与坐标轴共享。掌握这些基础概念,是写出清晰、可复用可视化代码的关键一步。

aofan9566的博客 296

GBT 27930-2015/2023国标充电协议A类CAN报文ID说明

国标充电CAN的ID,仅供学习参考。

qqq080的博客 7795

别再只会用subplot了!用Matplotlib GridSpec搞定复杂子图布局(附5图居中实战代码)

本文深入解析Matplotlib GridSpec模块,教你如何突破subplot的局限,实现复杂子图布局。通过5图居中实战代码演示,掌握非对称布局、子图跨行跨列、精确间距控制等高阶技巧,提升数据可视化效果。特别适合Python数据分析和科学计算场景。

weixin_30786657的博客 440

Cesium 模拟飞机坠毁功能

Cesium 模拟飞机坠毁功能,粒子模拟

QQhelphelp的博客 1068

基于FreeRTOS与MQTT的物联网技术应用系列——步进电机控制(三)SD卡驱动、FatFS等的移植和ini配置文件读取的实现

本文实现了基于STM32F107VC的金牛开发板的基于SPI模式的SD卡驱动和FatFS的移植,以及利用minini库对ini配置信息文件进行读取。

sqshining的专栏 2137

Matplotlib中plot、subplot、subplots的区别与使用场景详解

数据可视化中,绘图命令的层级关系常被混淆。plot负责在坐标轴上绘制线条,subplot和subplots则用于划分画布。subplot按编号逐个创建子图,适合简单布局;subplots一次性返回画布和子图数组,便于复杂布局和批量操作。理解这些命令的分层逻辑,能避免常见错误,提升代码可维护性。本文深入解析三者的核心差异、实操技巧及常见问题,帮助开发者高效绘制多子图。

weixin_34023982的博客 344

YOLOv8改进 | Conv篇:基于FasterBlock与C2f结构的二次创新,参数量下降70万【附保姆级代码】

通过引入FasterBlock二次创新C2f结构,我们成功地对YOLOv8模型进行了优化,显著降低了其参数量,并提升了推理速度,而精度保持不变甚至有所提升。该模型在多个实际应用场景中展现出了优异的性能,尤其是在嵌入式设备、移动端和自动驾驶等领域,具有广泛的应用潜力。未来的研究将进一步优化模型结构,探索更多的应用场景,为目标检测技术的发展做出贡献。

一键难忘的博客 3214

Matplotlib图表深度解析:从折线图到子图布局的Python数据可视化实战

数据可视化是数据分析与科学计算中的核心环节,它将抽象数据转化为直观图形,帮助揭示模式、趋势和异常。其原理在于通过视觉编码(如位置、长度、颜色、形状)映射数据维度,从而高效传递信息。在Python生态中,Matplotlib作为底层绘图库,提供了从数据到像素的完整控制链路,其技术价值在于能够创建高度定制化、符合出版标准的专业图表,尤其适用于需要精细控制图表每个元素的复杂场景。掌握折线图、散点图、柱状图、直方图等基础图表的实现与定制,并理解子图布局与样式美学,是进行有效数据叙事和构建复杂仪表板的关键。本文聚焦于

weixin_34314962的博客 449

RK356X linux系统移植RTL8723BU模块遇到的坑

RK356X linux系统移植RTL8723BU模块遇到的坑

目前从事linux驱动开发,多交流多学习吧 953

100天精通Python(可视化篇)——第89天:Bokeh库绘图可视化基础入门(参数说明+案例实战)

专栏导读 一、Bokeh是什么? 二、安装与导入 三、Bokeh接口介绍 四、创建图表 五、添加自定义渲染器 切换主题 添加图例 图例位置 图例方向 图例背景和边界 图例文本的外观 行列布局 网格布局

努力让自己发光,对的人才能迎着光而来 1万+
上一篇: matplotlib之pyplot模块——向任意位置添加一个子图(axes)
下一篇: matplotlib:font_manager模块FontProperties类的使用(字体属性)
mighty13
博客等级 码龄23年 728粉丝 438原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值