首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Matplotlib 中文用户指南 3.5 密致布局指南

Matplotlib 中文用户指南 3.5 密致布局指南

作者头像
ApacheCN_飞龙
发布于 2022-12-01 07:35:42
发布于 2022-12-01 07:35:42
72500
代码可运行
举报
文章被收录于专栏:信数据得永生信数据得永生
运行总次数:0
代码可运行

密致布局指南

原文:Tight Layout guide 译者:飞龙 协议:CC BY-NC-SA 4.0

tight_layout会自动调整子图参数,使之填充整个图像区域。这是个实验特性,可能在一些情况下不工作。它仅仅检查坐标轴标签、刻度标签以及标题的部分。

简单的示例

在 matplotlib 中,轴域(包括子图)的位置以标准化图形坐标指定。 可能发生的是,你的轴标签或标题(有时甚至是刻度标签)会超出图形区域,因此被截断。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
plt.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)

为了避免它,轴域的位置需要调整。对于子图,这可以通过调整子图参数(移动轴域的一条边来给刻度标签腾地方)。Matplotlib v1.1 引入了一个新的命令tight_layout(),自动为你解决这个问题。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
plt.tight_layout()

当你拥有多个子图时,你会经常看到不同轴域的标签叠在一起。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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()也会调整子图之间的间隔来减少堆叠。

tight_layout()可以接受关键字参数padw_pad或者h_pad,这些参数图像边界和子图之间的额外边距。边距以字体大小单位规定。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
plt.tight_layout(pad=0.4, w_pad=0.5, h_pad=1.0)

即使子图大小不同,tight_layout()也能够工作,只要网格的规定的兼容的。在下面的例子中,ax1ax2是 2x2 网格的子图,但是ax3是 1x2 网格。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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使用GridSpec自定义子布局的位置)创建的子图也能正常工作。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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的子图(例如带有图像的轴域)。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
arr = np.arange(100).reshape((10,10))

plt.close('all')
fig = plt.figure(figsize=(5,4))

ax = plt.subplot(111)
im = ax.imshow(arr, interpolation="none")

plt.tight_layout()

警告

  • tight_layout()只考虑刻度标签,轴标签和标题。 因此,其他艺术家可能被截断并且也可能重叠。
  • 它假定刻度标签,轴标签和标题所需的额外空间与轴域的原始位置无关。 这通常是真的,但在罕见的情况下不是。
  • pad = 0将某些文本剪切几个像素。 这可能是当前算法的错误或限制,并且不清楚为什么会发生。 同时,推荐使用至少大于 0.3 的间隔。

GridSpec一起使用

GridSpec拥有自己的tight_layout()方法(pyplot APItight_layout()也能生效)。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
plt.close('all')
fig = plt.figure()

import matplotlib.gridspec as gridspec

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)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
gs1.tight_layout(fig, rect=[0, 0, 0.5, 1])

例如,这可用于带有多个gridspecs的图形。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
gs2 = gridspec.GridSpec(3, 1)

for ss in gs2:
    ax = fig.add_subplot(ss)
    example_plot(ax)
    ax.set_title("")
    ax.set_xlabel("")

ax.set_xlabel("x-label", fontsize=12)

gs2.tight_layout(fig, rect=[0.5, 0, 1, 1], h_pad=0.5)

我们可以尝试匹配两个网格的顶部和底部。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
top = min(gs1.top, gs2.top)
bottom = max(gs1.bottom, gs2.bottom)

gs1.update(top=top, bottom=bottom)
gs2.update(top=top, bottom=bottom)

虽然这应该足够好了,调整顶部和底部可能也需要调整hspace。 为了更新hspacevspace,我们再次使用更新后的rect参数调用tight_layout()。 注意,rect参数指定的区域包括刻度标签。因此,我们将底部(正常情况下为 0)增加每个gridspec的底部之差。 顶部也一样。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
top = min(gs1.top, gs2.top)
bottom = max(gs1.bottom, gs2.bottom)

gs1.tight_layout(fig, rect=[None, 0 + (bottom-gs1.bottom),
                            0.5, 1 - (gs1.top-top)])
gs2.tight_layout(fig, rect=[0.5, 0 + (bottom-gs2.bottom),
                            None, 1 - (gs2.top-top)],
                 h_pad=0.5)

AxesGrid1一起使用

虽然受限但也支持axes_grid1工具包

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
plt.close('all')
fig = plt.figure()

from mpl_toolkits.axes_grid1 import Grid
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()

颜色条

如果你使用colorbar命令创建了颜色条,创建的颜色条是Axes而不是Subplot的实例,所以tight_layout没有效果。在 Matplotlib v1.1 中,你可以使用gridspec将颜色条创建为子图。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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, use_gridspec=True)

plt.tight_layout()

![])http://matplotlib.org/_images/tight_layout_guide-14.png

另一个选项是使用AxesGrid1工具包,显式为颜色条创建一个轴域:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
plt.close('all')
arr = np.arange(100).reshape((10,10))
fig = plt.figure(figsize=(4, 4))
im = plt.imshow(arr, interpolation="none")

from mpl_toolkits.axes_grid1 import make_axes_locatable
divider = make_axes_locatable(plt.gca())
cax = divider.append_axes("right", "5%", pad="3%")
plt.colorbar(im, cax=cax)

plt.tight_layout()
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2017-01-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
让子弹飞~利用OPcache扩展提升PHP7性能 | laravel篇
What is OPcache OPcache是PHP中的Zend扩展,可以大大提升PHP的性能。 OPcache 通过将 PHP 脚本预编译的字节码存储到共享内存中来提升 PHP 的性能, 存储预编译字节码的好处就是 省去了每次加载和解析 PHP 脚本的开销。
AlicFeng
2018/10/08
1.3K0
PHP安装配置Opcache加速你的网站
本文针对PHP5.5等高级版本,编译时需要加上--enable-opcache参数
老高的技术博客
2022/12/28
7540
PHP安装配置Opcache加速你的网站
使用Redis和opcache扩展为网站加速教程
php在执行函数最消耗时间的就是查询SQL数据库了,一般来讲一个页面的数据库查询大概在120到260次左右,使用Redis或者Memcached缓存,原理就是将php查询过的数据库缓存下来,下一次相同内容就不再查询数据库了,直接从缓存获取,极大的提高php执行效率。
Hello-1
2022/08/30
6700
使用Redis和opcache扩展为网站加速教程
编译安装PHP8.0测试版开启Opcache JIT
PHP已经进入了PHP8.0的测试研发阶段,其中就包括万众期待的PHP JIT新特性,这里我们尝新编译安装PHP8.0,并试着开启opcache中的JIT
Zach
2020/07/23
2.4K0
如何更好的使用OPcache实现性能优化
一直知道opcache可以提高PHP性能,但没有具体的关注,更多的利用其他的组件来提升系统的性能。一次无意开启了opcache之后,并随意设置了一些配置。结果导致后面在使用一个项目时,发现项目总是不会读取到最新的代码,而是隔一段时间才会执行到最新代码。排查了很久才想起来开启了opcache,于是对opcache做了一个简单的学习与总结。
兔云小新LM
2021/09/25
1.3K0
如何更好的使用OPcache实现性能优化
[PHP] opcache优化作用
1. PHP 初始化执行环节,启动 Zend 引擎,加载注册的扩展模块。 2. 初始化后读取 PHP 脚本文件,Zend 引擎对 PHP 文件进行词法分析,语法分析,生成语法树。 3. Zend 引擎编译语法树,生成 Opcode。 4. Zend 引擎执行 Opcode,返回执行结果。
唯一Chat
2021/07/29
5350
php7性能优化之opcache
最近业务有所增长,随之而来的是慢请求逐渐多了起来,在搜索php性能优化的过程中发现了opcache,相关的文章很多,但是都比较零碎,所以在此做个总结。公司当前使用的PHP版本为php7.x.x。
阿dai学长
2021/07/15
1.6K0
使用OPCache提升PHP的性能
对于 PHP 这样的解释型语言来说,每次的运行都会将所有的代码进行一次加载解析,这样一方面的好处是代码随时都可以进行热更新修改,因为我们不需要编译。但是这也会带来一个问题,那就是无法承载过大的访问量。毕竟每次加载解析再释放,都会增加 CPU 的负担,通常一台 8核16G 的服务器在2、3000并发左右 CPU 就能达到60%以上的使用率。而且如果你使用的是类似于 Laravel 这种大型的框架,效率将更加低下。这个时候,我们通常会通过增加服务器数量来做负载均衡,从而达到减轻服务器压力的效果。不过,这样做的成本又会增加许多。那么,有没有什么优化的方案呢?
硬核项目经理
2020/08/13
1.1K0
PHP5.5中的Zend OPcache加速可以代替eaccelerator
eaccelerator无法兼容php5.5.0,好在php在5.5.0默认提供了Zend OPcache,所以一直习惯eaccelerator的朋友如果要升级到php5.5.0的话,可能要暂时和eaccelerator说bye bye了。 配置Zend OPcache 一直以来都习惯用eAccelerator为php提供加速,但是目前有两个问题: eAccelerator暂时不兼容php5.5.0
星哥玩云
2022/06/30
4710
详解:PHP加速器配置神器opcache
当解释器完成对脚本代码的分析后,便将它们生成可以直接运行的中间代码,也称为操作码(Operate Code,opcode)。Opcode cache的目地是避免重复编译,减少CPU和内存开销。如果动态内容的性能瓶颈不在于CPU和内存,而在于I/O操作,比如数据库查询带来的磁盘I/O开销,那么opcode cache的性能提升是非常有限的。但是既然opcode cache能带来CPU和内存开销的降低,这总归是好事。
用户4988085
2021/07/25
2.2K0
PHP新特性之字节码缓存和内置服务器
Zend OPcache 1).从PHP5.0//开始,内置了字节码缓存功能,名为Zend OPcache。因为PHP是解释性语言,PHP解释器执行PHP脚本时会解析PHP脚本代码,生成一系列的Zend操作码,然后执行字节码,每次的HTTP请求都是这样,会消耗很多资源,使用字节码缓存可以缓存预先编译的字节码,减少响应时间,降低系统资源的压力。 启用Zend OPcache 默认情况之下,Zend OPcache是没有启动的。如果是自己编译PHP,执行的时候命令必须包含以下选项:
用户2323866
2021/06/29
6690
低成本高收益的PHP性能提升方案
OPcache通过将 PHP 脚本预编译的字节码存储到共享内存中来提升 PHP 的性能, 存储预编译字节码的好处就是 省去了每次加载和解析 PHP 脚本的开销。
Jayjiao
2018/08/28
6010
CentOS7安装NextCloud
为了您服务的安全和性能, 请将所有设置配置正确. 我们将会进行一些自动化检查以帮助您完成这项工作. 详情请查看 "小提示" 部分及相关文档.
孤鸿
2022/10/04
7080
PHP Opcache工作原理
在理解 OPCache 功能之前,我们有必要先理解PHP-FPM + Nginx 的工作机制,以及PHP脚本解释执行的机制。
猿哥
2019/11/10
1.7K0
PHP开启opcache提升代码性能
配置指令如下: [opcache] zend_extension=opcache.so opcache.enable_cli=1 ;共享内存大小, 这个根据你们的需求可调 opcache.memory_consumption=256 ;interned string的内存大小, 也可调 opcache.interned_strings_buffer=8 ;最大缓存的文件数目 opcache.max_accelerated_files=4000 ;60s检查一次文件更新 opcache.reval
luxixing
2019/05/30
8890
CentOS 6.5下PHP 5.6编译安装
编译前执行下列命令 sh#添加组 groupadd www #添加php-fpm用户 useradd -c php-fpm-user -g www -M php-fpm # c和c++编译器 yum install -y gcc gcc-c++ # PHP扩展依赖 yum install -y libxml2-devel openssl-devel libcurl-devel libjpeg-devel libpng-devel libicu-devel openldap-devel 编译指令 prefi
luxixing
2019/05/28
7500
AppNode面板成功安装Nextcloud后出现安全警告解决办法 原创 PHP 配置
本文针对通过AppNode面板网站管理环境成功安装Nextcloud后出现安全警告解决办法; image.png 首先通过网站管理>建站市场 下载Nextcloud程序: image.png 访问域名按照步骤成功安装Nextcloud后出现如下图所示安全警告: 第一条:PHP 的设置似乎有问题, 无法获取系统环境变量. 使用 getenv(\"PATH\") 测试时仅返回空结果. 可通过AppNode网站管理>PHP>环境变量 新增FastCGI环境变量即可,配置如下: env[HOSTNAME
奇梦
2018/07/18
1.4K0
PHP5.4.36中APC与APCu的对比与感觉
APC全称Alternative PHP Cache,可选php缓存,包括opcache及用户变量缓存。
星哥玩云
2022/07/04
5950
PHP7.0正式版编译安装升级及WordPress问题解决分享
盼望以久的 PHP 7.0 正式版,终于在今天发布了! 官方给出的新特性如下: PHP 7.0.0 comes with new version of the Zend Engine with fea
张戈
2018/03/21
1.1K0
PHP7.0正式版编译安装升级及WordPress问题解决分享
PHP - 性能优化 - 开启Opcache
对于PHP、Python属于解释型语言,不产生机器码,而是产生中间码(中间码是不能直接执行,这个中间码只有解释器可以识别到,中间码要靠解析器来进行执行) PHP的解析器是Zend,PHP使用Zend引擎,中间码我们也称作为操作码(opcode)
九霄道长
2021/03/02
1.5K0
推荐阅读
相关推荐
让子弹飞~利用OPcache扩展提升PHP7性能 | laravel篇
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验