Matplotlib subplots_adjust hspace 使标题和 xlabels 不重叠?

Posted

技术标签:

【中文标题】Matplotlib subplots_adjust hspace 使标题和 xlabels 不重叠?【英文标题】:Matplotlib subplots_adjust hspace so titles and xlabels don't overlap? 【发布时间】:2011-01-25 23:07:25 【问题描述】:

比如说,matplotlib 中有 3 行子图,其中一行的 xlabels 可以与下一行的标题重叠。必须摆弄pl.subplots_adjust(hspace),这很烦人。

是否有 hspace 的配方可以防止重叠并适用于任何 nrow?

""" matplotlib xlabels overlap titles ? """
import sys
import numpy as np
import pylab as pl

nrow = 3
hspace = .4  # of plot height, titles and xlabels both fall within this ??
exec "\n".join( sys.argv[1:] )  # nrow= ...

y = np.arange(10)
pl.subplots_adjust( hspace=hspace )

for jrow in range( 1, nrow+1 ):
    pl.subplot( nrow, 1, jrow )
    pl.plot( y**jrow )
    pl.title( 5 * ("title %d " % jrow) )
    pl.xlabel( 5 * ("xlabel %d " % jrow) )

pl.show()

我的版本:

matplotlib 0.99.1.1, Python 2.6.4, Mac OSX 10.4.11, 后端:Qt4AggTkAgg => Tkinter 回调异常)

(对于许多额外的点,任何人都可以按照 Tcl/Tk 书中第 17 章“打包器”的内容概述 matplotlib 的打包器/间隔器的工作原理吗?)

【问题讨论】:

您可能想在 matplotlib bugtracker sourceforge.net/tracker/?group_id=80706 上为此提交一个错误/愿望清单条目@ 您在pl.show() 之前尝试过pl.tight_layout() 以获得“自动”解决方案吗? @Sebastian Raschka,“用户警告:tight_layout:回退到 Agg 渲染器”,mac 上的 matplotlib 1.4.3。 (问题是 5 年前的问题。) @denis 哎呀,不好意思,问的时候真的没注意数据…… 【参考方案1】:

我觉得这很棘手,但有一些关于它的信息here at the MatPlotLib FAQ。它相当麻烦,并且需要找出单个元素(刻度标签)占用的空间......

更新: 该页面指出tight_layout() 函数是最简单的方法,它尝试自动更正间距。

否则,它会显示获取各种元素(例如标签)大小的方法,以便您可以更正轴元素的间距/位置。这是上面FAQ页面的一个例子,它决定了一个非常宽的y轴标签的宽度,并相应地调整轴的宽度:

import matplotlib.pyplot as plt
import matplotlib.transforms as mtransforms
fig = plt.figure()
ax = fig.add_subplot(111)
ax.plot(range(10))
ax.set_yticks((2,5,7))
labels = ax.set_yticklabels(('really, really, really', 'long', 'labels'))

def on_draw(event):
   bboxes = []
   for label in labels:
       bbox = label.get_window_extent()
       # the figure transform goes from relative coords->pixels and we
       # want the inverse of that
       bboxi = bbox.inverse_transformed(fig.transFigure)
       bboxes.append(bboxi)

   # this is the bbox that bounds all the bboxes, again in relative
   # figure coords
   bbox = mtransforms.Bbox.union(bboxes)
   if fig.subplotpars.left < bbox.width:
       # we need to move it over
       fig.subplots_adjust(left=1.1*bbox.width) # pad a little
       fig.canvas.draw()
   return False

fig.canvas.mpl_connect('draw_event', on_draw)

plt.show()

【讨论】:

接受,但确实很麻烦——mttiw,麻烦大于它的价值 链接已消失。这个答案实际上变得毫无用处。 链接再次存在 - 说tight_layout() 现在是要走的路,确实如此。 tight_layout() 不考虑数字字幕。请参阅***.com/questions/8248467/… 以获得解决方案。【参考方案2】:

Jose 发布的链接已更新,pylab 现在有一个 tight_layout() 函数自动执行此操作(在 matplotlib 版本 1.1.0 中)。

http://matplotlib.org/api/pyplot_api.html#matplotlib.pyplot.tight_layout

http://matplotlib.org/users/tight_layout_guide.html#plotting-guide-tight-layout

【讨论】:

tight_layout() 不考虑数字字幕。请参阅***.com/questions/8248467/… 获取解决方案。【参考方案3】:

您可以使用 plt.subplots_adjust 更改子图链接之间的间距

subplots_adjust(left=None, bottom=None, right=None, top=None, wspace=None, hspace=None)

left  = 0.125  # the left side of the subplots of the figure
right = 0.9    # the right side of the subplots of the figure
bottom = 0.1   # the bottom of the subplots of the figure
top = 0.9      # the top of the subplots of the figure
wspace = 0.2   # the amount of width reserved for blank space between subplots
hspace = 0.2   # the amount of height reserved for white space between subplots

【讨论】:

问题是“必须摆弄 pl.subplots_adjust( hspace ),烦人。”

以上是关于Matplotlib subplots_adjust hspace 使标题和 xlabels 不重叠?的主要内容,如果未能解决你的问题,请参考以下文章

Matplotlib 基本概念

Matplotlib快速入门

matplotlib绘图入门详解

matplotlib 绘图常用函数

Matplotlib 教程

安装matplotlib?