Matplotlib subplots_adjust hspace, чтобы заголовки и xlabels не перекрывались? - PullRequest
40 голосов
/ 10 марта 2010

С, скажем, 3 рядами вспомогательных участков в matplotlib, 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,
  • backend: Qt4Agg (TkAgg => Исключение в обратном вызове Tkinter)

(Может ли кто-нибудь описать, как работает упаковщик / проставка matplotlib, в соответствии с главой 17 "Упаковщик" в книге Tcl / Tk?)

Ответы [ 3 ]

43 голосов
/ 01 июля 2011

Вы можете использовать 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
34 голосов
/ 04 января 2012

Ссылка, опубликованная Хосе, была обновлена, и в 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

18 голосов
/ 25 марта 2010

Я нахожу это довольно хитрым, но есть некоторая информация об этом здесь, в MatPlotLib FAQ . Это довольно громоздко и требует выяснения того, какое место занимают отдельные элементы (тиклабели) ...

Обновление: На странице указано, что функция tight_layout() - это самый простой способ, который пытается автоматически исправить интервал.

В противном случае в нем показаны способы получения размеров различных элементов (например, меток), чтобы вы могли затем корректировать расстояния / положения элементов ваших осей. Вот пример с вышеупомянутой страницы часто задаваемых вопросов, которая определяет ширину очень широкой метки оси 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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...