当前位置: 首页 > news >正文

matplotlib从起点出发(11)_Tutorial_11_TightLayout

如何使用紧凑的而已来干净利落地将绘图放入图形中。

tight_layout会自动调整子图参数,使子图适合图区域。这是一项实验性功能,在某些情况下可能不起作用。它仅检查刻度标签、轴标签和标题的范围。

tight_layout的替代方法是constrained_layout。

1 简单的例子

在matplotlib中,Axes(包括子图)的位置归一化的图形坐标指定。你的轴标签或标题(有时甚至是刻度标签)可能会超出图窗区域,从而被剪裁。

import matplotlib.pyplot as plt
import numpy as npplt.rcParams['savefig.facecolor'] = "0.8"def example_plot(ax, fontsize=12):ax.plot([1, 2])ax.locator_params(nbins=3)ax.set_xlabel('x-label', fontsize=fontsize)ax.set_ylabel('y-label', fontsize=fontsize)ax.set_title('Title', fontsize=fontsize)plt.close('all')
fig, ax = plt.subplots()
example_plot(ax, fontsize=24)

在这里插入图片描述

为了防止这种情况,需要调整Axes的位置。对于子图,可以通过使用Figure.subplots_adjust调整子图参数来手动完成。Figure.tight_layout会自动执行此操作。

fig, ax = plt.subplots()
example_plot(ax, fontsize=24)
plt.tight_layout()

在这里插入图片描述

请注意,matplotlib.pyplot.tight_layout()只会在调用时调整子图参数。为了在每次重绘图形时执行此调整,可以调用fig.set_tight_layout(True),或者等效地将rcParams["figure.autolayout"](默认值:False)设置为True.

当有多个子图存在时,通常会看到不同的Axes的标签相互重叠。

plt.close('all')fig, ((ax1, ax2), (ax3, ax4)) = plt.subplots(nrows=2, ncols=2)
example_plot(ax1)
example_plot(ax2)
example_plot(ax3)
example_plot(ax4)

在这里插入图片描述

tight_layout()还可以调整子图之间的间距以最小化重叠。

fig, ((ax1, ax2), (ax3, ax4)) = plt.subplots(nrows=2, ncols=2)
example_plot(ax1)
example_plot(ax2)
example_plot(ax3)
example_plot(ax4)
plt.tight_layout()

在这里插入图片描述

tight_layout()可以接受pad、w_pad和h_pad的关键字参数。它们控制着图形边框周围和子图之间的额外填充。填充器以字体大小的分数指定。

fig, ((ax1, ax2), (ax3, ax4)) = plt.subplots(nrows=2, ncols=2)
example_plot(ax1)
example_plot(ax2)
example_plot(ax3)
example_plot(ax4)
plt.tight_layout(pad=0.4, w_pad=0.5, h_pad=1.0)

在这里插入图片描述

即使子图的大小不同,只要它们的网格规格兼容,tight_layout()也会起作用,在下面的示例中,ax1和ax2是 2 × 2 2 \times 2 2×2网格的子图,而ax3是 1 × 2 1\times 2 1×2网格的子图。

plt.close('all')
fig = plt.figure()ax1 = plt.subplot(221)
ax2 = plt.subplot(223)
ax3 = plt.subplot(122)example_plot(ax1)
example_plot(ax2)
example_plot(ax3)plt.tight_layout()

在这里插入图片描述

它适用于使用subplot2grid()创建的子图。通常,从gridspec(在图中排列多个Axes)创建的子图将起作用。

plt.close('all')
fig = plt.figure()ax1 = plt.subplot2grid((3, 3), (0, 0))
ax2 = plt.subplot2grid((3, 3), (0, 1), colspan=2)
ax3 = plt.subplot2grid((3, 3), (1, 0), colspan=2, rowspan=2)
ax4 = plt.subplot2grid((3, 3), (1, 2), rowspan=2)example_plot(ax1)
example_plot(ax2)
example_plot(ax3)
example_plot(ax4)plt.tight_layout()

在这里插入图片描述

虽然没有经过彻底测试,但它似乎适用于具有aspect != "auto"的子图(例如,带有图像的Axes)。

arr = np.arange(100).reshape((10, 10))plt.close('all')
fig = plt.figure(figsize=(5, 4))ax = plt.subplot()
im = ax.imshow(arr, interpolation="none")plt.tight_layout()

在这里插入图片描述

2 警告

  • tight_layout默认情况下,考虑Axes上的所有Artist。若要从布局计算中删除Artist,可以调用Artist.set_in_layout
  • tight_layout假设Artist所需的额外空间与轴的原始位置无关。这通常是正确的,但在极少数情况下并非如此;
  • pad=0可以将某些文本剪辑几个像素。这可能是当前算法的错误或限制,目前尚不清楚为什么会发生这种情况。同时,建议使用大于0.3的填充。

3 使用 GridSpec

GridSpec有自己的GridSpec.tight_layout方法(pyplot api pyplot.tight_layout也可以)。

import matplotlib.gridspec as gridspecplt.close('all')
fig = plt.figure()gs1 = gridspec.GridSpec(2, 1)
ax1 = fig.add_subplot(gs1[0])
ax2 = fig.add_subplot(gs1[1])example_plot(ax1)
example_plot(ax2)gs1.tight_layout(fig)

在这里插入图片描述

可以提供一个可选的rect参数,该参数指定子图将适合的边界框。坐标必须采用归一化图形坐标,默认值为(0,0,1,1)。

fig = plt.figure()gs1 = gridspec.GridSpec(2, 1)
ax1 = fig.add_subplot(gs1[0])
ax2 = fig.add_subplot(gs1[1])example_plot(ax1)
example_plot(ax2)gs1.tight_layout(fig, rect=[0, 0, 0.5, 1.0])

在这里插入图片描述

但是,我们不建议将其用于手动构造更复杂的布局,例如在图的左侧有一个GridSpec,在图的右侧有一个GridSpec。对于这些用例,应该利用嵌套网格规范或Figure子图。

3 图例和注释

在matplotlib2.2之前,图例和注释被排除在决定布局的边界框计算之外。随后,这些Artist被添加到计算中,但有时不希望将它们包括在内。例如,在这种情况下,最好将Axes缩小一点,以便为图例腾出空间:

fig, ax = plt.subplots(figsize=(4, 3))
lines = ax.plot(range(10), label='A simple plot')
ax.legend(bbox_to_anchor=(0.7, 0.5), loc='center left',)
fig.tight_layout()
plt.show()

在这里插入图片描述

但是,有时这是不希望的(通常在使用fig.savefig('outname.png',bbox_inches='tight')时)。为了从边界框计算中删除图例,我们只需设置其边界leg.set_in_layout(False),图例将被忽略。

fig, ax = plt.subplots(figsize=(4, 3))
lines = ax.plot(range(10), label='B simple plot')
leg = ax.legend(bbox_to_anchor=(0.7, 0.5), loc='center left',)
leg.set_in_layout(False)
fig.tight_layout()
plt.show()

在这里插入图片描述

4 使用AxesGrid1

虽然受到限制,但也支持mpl_toolkits.axes_grid1

from mpl_toolkits.axes_grid1 import Gridplt.close('all')
fig = plt.figure()
grid = Grid(fig, rect=111, nrows_ncols=(2, 2),axes_pad=0.25, label_mode='L',)for ax in grid:example_plot(ax)
ax.title.set_visible(False)plt.tight_layout()

在这里插入图片描述

5 颜色条

如果使用Figure.colorbar创建颜色条,则只要父Axes也是子图,创建的乐观积极就会在子图中绘制,因此Figure.tight_layout将起作用。

plt.close('all')
arr = np.arange(100).reshape((10, 10))
fig = plt.figure(figsize=(4, 4))
im = plt.imshow(arr, interpolation="none")plt.colorbar(im)plt.tight_layout()

在这里插入图片描述

另一种选择是使用AxesGrid1工具包为颜色条显式创建Axes。

from mpl_toolkits.axes_grid1 import make_axes_locatableplt.close('all')
arr = np.arange(100).reshape((10, 10))
fig = plt.figure(figsize=(4, 4))
im = plt.imshow(arr, interpolation="none")divider = make_axes_locatable(plt.gca())
cax = divider.append_axes("right", "5%", pad="3%")
plt.colorbar(im, cax=cax)plt.tight_layout()

在这里插入图片描述

在这里插入图片描述

相关文章:

  • 利用Caddy实现http反向代理
  • 网络安全深入学习第八课——代理与端口转发
  • 【FastCAE源码阅读7】视图方向切换按钮实现原理
  • 【论文阅读】多模态NeRF:Cross-Spectral Neural Radiance Fields
  • LeetCode(1)合并两个有序数组【数组/字符串】【简单】
  • k8s持久化存储PV、PVC
  • 【Ruoyi管理后台】用户登录强制修改密码
  • Linux awk命令
  • 百度上线“文心一言”付费版本,AI聊天机器人市场竞争加剧
  • docker下的nginx代理转发到tomcat
  • 自然语言处理中的文本聚类:揭示模式和见解
  • Python+reuqests自动化接口测试
  • yolov5 利用Labelimg对图片进行标注
  • VR虚拟现实:VR技术如何进行原型制作
  • 数字滤波器设计---FIR 滤波器设计
  • Android Volley源码解析
  • Android交互
  • angular2开源库收集
  •  D - 粉碎叛乱F - 其他起义
  • Java-详解HashMap
  • leetcode386. Lexicographical Numbers
  • LeetCode541. Reverse String II -- 按步长反转字符串
  • Odoo domain写法及运用
  • Vue源码解析(二)Vue的双向绑定讲解及实现
  • vue自定义指令实现v-tap插件
  • 测试开发系类之接口自动化测试
  • 动态魔术使用DBMS_SQL
  • 对象引论
  • 基于遗传算法的优化问题求解
  • 精益 React 学习指南 (Lean React)- 1.5 React 与 DOM
  • 力扣(LeetCode)21
  • 前端学习笔记之观察者模式
  • 一些css基础学习笔记
  • 源码安装memcached和php memcache扩展
  • [Shell 脚本] 备份网站文件至OSS服务(纯shell脚本无sdk) ...
  • 曜石科技宣布获得千万级天使轮投资,全方面布局电竞产业链 ...
  • #Js篇:单线程模式同步任务异步任务任务队列事件循环setTimeout() setInterval()
  • #stm32整理(一)flash读写
  • #常见电池型号介绍 常见电池尺寸是多少【详解】
  • $(function(){})与(function($){....})(jQuery)的区别
  • $.each()与$(selector).each()
  • (Redis使用系列) Springboot 整合Redisson 实现分布式锁 七
  • (补)B+树一些思想
  • (黑客游戏)HackTheGame1.21 过关攻略
  • (每日持续更新)信息系统项目管理(第四版)(高级项目管理)考试重点整理 第13章 项目资源管理(七)
  • (原創) 人會胖會瘦,都是自我要求的結果 (日記)
  • .NET 4.0中的泛型协变和反变
  • .net core 6 集成和使用 mongodb
  • .NET 反射的使用
  • .net 开发怎么实现前后端分离_前后端分离:分离式开发和一体式发布
  • .Net的C#语言取月份数值对应的MonthName值
  • .NET使用HttpClient以multipart/form-data形式post上传文件及其相关参数
  • .NET微信公众号开发-2.0创建自定义菜单
  • :如何用SQL脚本保存存储过程返回的结果集
  • []常用AT命令解释()