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

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

作者头像
ApacheCN_飞龙
发布于 2022-12-01 07:35:42
发布于 2022-12-01 07:35:42
75100
代码可运行
举报
文章被收录于专栏:信数据得永生信数据得永生
运行总次数: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 删除。

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
matplotlib(五)排版布局
  tight_layout在上面示例中已经出现过,在这里做一个补充说明,tight_layout自动调整subplot(s)参数,以便subplot(s)适应图形区域。这是一个实验性功能,在某些情况下可能无效,而且它仅对ticklabels, axis labels, titles有效。作图时我们可能会遇到这种问题,发现部分title、ticks、label被截断了,如下图所示:
SL_World
2021/09/18
8490
matplotlib基础:使用GridSpec自定义子图
指定绘制子图的网格形状,同时要设置绘制子图的行列数。当然也可以调整子图的布局(如 left,right等)。
bugsuse
2020/04/21
4.7K0
matplotlib基础:使用GridSpec自定义子图
干货|教你一文掌握:Matplotlib+Seaborn可视化
Seaborn和Matplotlib是Python最强大的两个可视化库。Seaborn其默认主题让人惊讶,而Matplotlib可以通过其多个分类为用户打造专属功能。
1480
2020/03/09
5K0
干货|教你一文掌握:Matplotlib+Seaborn可视化
Python进阶之Matplotlib入门(九)
Matplotlib是Python的画图领域使用最广泛的绘图库,它能让使用者很轻松地将数据图形化以及利用它可以画出许多高质量的图像,是用Python画图的必备技能。对于这个教程,大家最好亲自码一遍代码,这样可以更有收获。
HuangWeiAI
2019/12/17
7240
Python进阶之Matplotlib入门(九)
Python数据分析之matplotlib(提高篇)
matplotlib核心剖析(http://www.cnblogs.com/vamei/archive/2013/01/30/2879700.html#commentform)
AI异构
2020/07/29
7060
Python数据分析之matplotlib(提高篇)
Matplotlib新手上路(中)
接上回继续 一、多张图布局(subplot) 1.1 subplot布局方式 import matplotlib.pyplot as plt plt.figure() plt.subplot(3, 2, 1) # 3行2列的第1张图 plt.plot([0, 1], [0, 1]) plt.subplot(322) # 等效于plt.subplot(2,2,2) 3行2列的第2张图 plt.plot([1, 1], [0, 2]) plt.plot([0, 2], [1, 1]) plt.sub
菩提树下的杨过
2018/03/28
7850
Matplotlib新手上路(中)
Python数据分析入门(二十二):多图布局
在一个Figure上面,可能存在多个Axes对象,如果Figure比较小,那么有可能会造成一些图形元素重叠,这时候我们就可以通过fig.tight_layout或者是fig.subplots_adjust方法来帮我们调整。假如现在没有经过调整,那么以下代码的效果图如下:
松鼠爱吃饼干
2021/08/06
4770
Python数据分析入门(二十二):多图布局
Python数据分析之matplotlib(基础篇)
在matplotlib中,整个图像为一个Figure对象。在Figure对象中可以包含一个,或者多个Axes对象。每个Axes对象都是一个拥有自己坐标系统的绘图区域。其逻辑关系如下:
AI异构
2020/07/29
4860
Python数据分析之matplotlib(基础篇)
matplotlib的多图合并
本文是我在学习莫烦老师视频教程时候整理的笔记。Matplotlib是一个python的 2D绘图库,它以各种硬拷贝格式和跨平台的交互式环境生成出版质量级别的图形。通过Matplotlib,开发者可以仅需要几行代码,便可以生成绘图,直方图,功率谱,条形图,散点图等。承接上文:
触摸壹缕阳光
2020/04/26
2K0
matplotlib 入门使用指南
1. pyplot模块 1.1. color的值 blue 1.2. Marker的值 point marker 1.3. LineStyles的值 solid line style 例子: 'b' # blue markers with default shape 'ro' # red circles 'g-' # green solid line '--' # dashed line with default color 'k^:' # black triangle_up mark
syy
2020/04/07
1.1K0
matplotlib 同时绘制多个图形(二)
matplotlib中,使用subplot2grid()函数,可以让图形跨越固定的网格布局。通过设置该函数的rowspan 和 colspan 参数,可以让图形占据多个行和列。
用户6021899
2019/08/14
2K0
Matplotlib
Matplotlib 官网 此篇笔记参考来源为《莫烦Python》 安装同之前所述,参考《Python初学基础》 基本使用 2.1 基本用法 import matplotlib.pyplot as plt import numpy as np x = np.linspace(-1, 1, 50) #使用np.linspace定义x:范围是(-1,1);个数是50 y = 2*x + 1 plt.figure() #定义一个图像窗口 plt.plot(x, y) plt.show()
闪电gogogo
2018/05/28
1.3K0
美化Matplotlib的3个小技巧
来源:DeepHub IMBA 本文约2300字,建议阅读5分钟 本文中,我们将介绍3个可以用于定制Matplotlib图表的技巧 Matplotlib是Python的数据可视化库的基础。它是其他可视化工具(如Seaborn)的基础。 Matplotlib提供了很大的灵活性,因此您可以自定义或调整几乎所有的图表。但是想要完全控制可视化就需要编写更多的代码。 在本文中,我们将介绍3个可以用于定制Matplotlib图表的技巧: 减少x轴或y轴上的刻度数 添加一个辅助y轴 共享x轴的子图坐标对齐 本文中我们将
数据派THU
2022/10/09
2.4K0
美化Matplotlib的3个小技巧
美化Matplotlib的3个小技巧
Matplotlib是Python的数据可视化库的基础。它是其他可视化工具(如Seaborn)的基础。 Matplotlib提供了很大的灵活性,因此您可以自定义或调整几乎所有的图表。但是想要完全控制可视化就需要编写更多的代码。 在本文中,我们将介绍3个可以用于定制Matplotlib图表的技巧: 减少x轴或y轴上的刻度数 添加一个辅助y轴 共享x轴的子图坐标对齐 本文中我们将使用折线图为例,但这些技巧也可以应用于其他类型的图。我创建了一个数据集模拟价格和销售数据。 import pandas a
张俊红
2022/10/09
1.5K0
美化Matplotlib的3个小技巧
Matplotlib 中文用户指南 3.3 使用 GridSpec 自定义子图位置
指定子图将放置的网格的几何位置。 需要设置网格的行数和列数。 子图布局参数(例如,左,右等)可以选择性调整。
ApacheCN_飞龙
2022/12/01
8270
Matplotlib 中文用户指南 3.3 使用 GridSpec 自定义子图位置
Python数据分析Matplotlib
1.2 使用matplotlib.pyplot中的annotate()函数标注文字
荣仔_最靓的仔
2021/02/02
3.8K0
Python数据分析Matplotlib
python学习之matplot
import matplotlib.pyplot as plt import numpy as np import pandas as pd from mpl_toolkits.mplot3d import Axes3D import matplotlib.gridspec as gridspec from matplotlib import animation
py3study
2020/01/08
8330
Matplotlib使用笔记
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
村雨遥
2019/09/09
6150
Matplotlib从入门到精通03-布局格式定方圆
参考: https://datawhalechina.github.io/fantastic-matplotlib/%E7%AC%AC%E4%B8%80%E5%9B%9E%EF%BC%9AMatplotlib%E5%88%9D%E7%9B%B8%E8%AF%86/index.html
IT从业者张某某
2023/10/16
3690
Matplotlib从入门到精通03-布局格式定方圆
Matplotlib 中文用户指南 8.2 我们最喜欢的秘籍
这里是一个简短的教程,示例和代码片段的集合,展示了一些有用的经验和技巧,来制作更精美的图像,并克服一些 matplotlib 的缺陷。
ApacheCN_飞龙
2022/12/01
9690
Matplotlib 中文用户指南 8.2 我们最喜欢的秘籍
相关推荐
matplotlib(五)排版布局
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档