密致布局指南

原文:Tight Layout guide

译者:飞龙

协议:CC BY-NC-SA 4.0

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

简单的示例

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

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(),自动为你解决这个问题。

plt.tight_layout()

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

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,这些参数图像边界和子图之间的额外边距。边距以字体大小单位规定。

plt.tight_layout(pad=0.4, w_pad=0.5, h_pad=1.0)

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

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自定义子布局的位置)创建的子图也能正常工作。

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的子图(例如带有图像的轴域)。

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 API 的tight_layout()也能生效)。


plt.close('all')
fig = plt.figure()import matplotlib.gridspec as gridspecgs1 = 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)

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

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

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)

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

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的底部之差。 顶部也一样。

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工具包

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将颜色条创建为子图。

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工具包,显式为颜色条创建一个轴域:

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()

Matplotlib 中文用户指南 3.5 密致布局指南相关推荐

  1. Matplotlib 中文用户指南 8.1 屏幕截图

    屏幕截图 原文:Screenshots 译者:飞龙 协议:CC BY-NC-SA 4.0 这里你会找到一些示例图和生成它们的代码. 简单绘图 这里是一个带有文本标签的基本的绘图: 源代码 子图示例 多 ...

  2. Matplotlib 中文用户指南 4.3 文本属性及布局

    文本属性及布局 原文:Text properties and layout 译者:飞龙 协议:CC BY-NC-SA 4.0 matplotlib.text.Text实例有各种属性,可以通过关键字参数 ...

  3. Matplotlib 中文用户指南 3.6 图例指南

    图例指南 原文:Legend guide 译者:飞龙 协议:CC BY-NC-SA 4.0 此图例指南是legend()中可用文档的扩展 - 请在继续阅读本指南之前确保你熟悉该文档(见篇尾)的内容. ...

  4. Matplotlib 中文用户指南 4.6 编写数学表达式

    编写数学表达式 原文:Writing mathematical expressions 译者:飞龙 协议:CC BY-NC-SA 4.0 你可以在任何 matplotlib 文本字符串中使用子 TeX ...

  5. Matplotlib 中文用户指南 4.7 使用 LaTeX 渲染文本

    使用 LaTeX 渲染文本 原文:Text rendering With LaTeX 译者:飞龙 协议:CC BY-NC-SA 4.0 Matplotlib 可以选择使用 LaTeX 来管理所有文本布 ...

  6. Matplotlib 中文用户指南 4.4 默认字体

    默认字体 原文:Text properties and layout 译者:飞龙 协议:CC BY-NC-SA 4.0 基本的默认字体由一系列rcParams参数控制: rcParam 用法 'fon ...

  7. Matplotlib 中文用户指南 3.9 路径效果指南

    路径效果指南 原文:Path effects guide 译者:飞龙 协议:CC BY-NC-SA 4.0 Matplotlib 的patheffects模块提供了一些功能,用于将多个绘制层次应用到任 ...

  8. Matplotlib 中文用户指南 3.5 艺术家教程

    艺术家教程 原文:Artist tutorial 译者:飞龙 协议:CC BY-NC-SA 4.0 matplotlib API 有三个层级. matplotlib.backend_bases.Fig ...

  9. Matplotlib 中文用户指南 3.1 pyplot 教程

    pyplot 教程 原文:Pyplot tutorial 译者:飞龙 协议:CC BY-NC-SA 4.0 matplotlib.pyplot是一个命令风格函数的集合,使matplotlib的机制更像 ...

最新文章

  1. R使用dplyr包对变量、特征进行标准化(standardize)缩放操作
  2. 查询linux kafka安装目录,Linux下安装并(单节点)配置启动Kafka
  3. 不快乐工作场所的生存法则
  4. 毕业后的五年拉开大家差距的原因在哪里?
  5. vb.net2019-读逗号分隔csv等文件
  6. 懒汉式(线程安全,同步代码块儿)
  7. iPhone 11外壳保护套曝光:噢,这个浓厚的老干部风格
  8. 装双系统出现winload.efi,也就是安装win10,提示0xc0000359
  9. 人力资源管理系统概要设计说明书
  10. 5个小众视频素材网站,你知道吗?
  11. 124-移动端游乐园项目
  12. 通过uart串口和printf函数打印
  13. 湖北省创新型中小企业培育申报流程方法及申报时间要求指南
  14. mod_rewrite htaccess 简单使用
  15. 甲骨文oracle云计算迎来转机
  16. Elasticsearch中FST与前缀搜索
  17. idea使用账号不能登录
  18. Bugly 1:版本更新
  19. 软件测试的核心竞争力是什么?
  20. MediaCoder CUDA H.264 编码器测试报告

热门文章

  1. ios运行html游戏,Objective-c / iOS – 使用Safari打开本地html文件
  2. 图像的频率谱和功率谱代表什么_使用 FastAI 和即时频率变换进行音频分类
  3. VSCODE打开野火电机代码需要增加的配置 c_cpp_properties.json
  4. 1004.ubuntu16.04 安装protobuf
  5. c++ log函数_高斯拉普拉斯算子(Laplacian of Gaussian, LoG)
  6. as5300g2 nas软件功能_群晖NAS软件Qnote介绍及使用方法教程
  7. 数值计算方法(七)——两种消去法求解线性方程组
  8. L2TP协议笔记2---L2TP主要协议报文分析
  9. Hash魔法:一致性 hash 算法
  10. java 怎么控制暂停5秒钟_java – libGDX暂停运行几秒钟