matplotlib - субплоты с фиксированным соотношением сторон - PullRequest
21 голосов
/ 20 января 2011

У меня проблема с отображением нескольких вспомогательных участков. Я хотел бы установить ФИЗИЧЕСКОЕ соотношение сторон подзаговоров к фиксированному значению. В моем примере у меня есть 12 вспомогательных участков (4 строки и 3 столбца) на рисунке A4 в альбомной ориентации. Там все вспомогательные участки красиво размещены на всей фигуре, а для всех вспомогательных участков высота почти равна ширине.

Но если я изменю расположение моей фигуры на портретную, субплоты растягиваются вертикально. И это именно то, что не должно происходить. Я хотел бы иметь ту же высоту и ширину участков, что и на фигуре ландшафта. Есть ли вероятность того, что соотношение сторон на сюжетах останется прежним?

Спасибо заранее, Питер

EDIT: Я нашел обходной путь. Но это работает только для нелогарифмических осей ...

aspectratio=1.0
ratio_default=(ax.get_xlim()[1]-ax.get_xlim()[0])/(ax.get_ylim()[1]-ax.get_ylim()[0])
ax.set_aspect(ratio_default*aspectratio)

Ответы [ 3 ]

17 голосов
/ 20 января 2011

На самом деле, то, что вы хотите, довольно просто ... Вам просто нужно убедиться, что adjustable установлено на 'box' на ваших осях, и у вас есть заданное соотношение сторон для осей (что угодно, кроме 'auto').

Вы можете сделать это с помощью adjustable kwarg при создании вспомогательных участков. В качестве альтернативы, вы можете сделать это после их создания, позвонив по номеру ax.set_adjustable('box') или по номеру ax.set_aspect(aspect, adjustable='box') (где аспект - либо 'equal', либо номер).

Теперь, независимо от того, как изменяется размер фигуры, на вспомогательных участках будет поддерживаться одинаковое соотношение сторон.

Например:

import matplotlib.pyplot as plt

fig = plt.figure()
ax1 = fig.add_subplot(2,1,1, adjustable='box', aspect=0.3)
ax2 = fig.add_subplot(2,1,2)

ax1.plot(range(10))
ax2.plot(range(10))

plt.show()

Теперь сравните, как реагирует нижний субплот на изменение размера, и как реагирует нижний субплот:


Начальный участок alt text

Изменение размера по вертикали: alt text

Изменение размера до горизонтального расположения: alt text

4 голосов
/ 20 мая 2016

Ваш обходной путь работает для меня.После построения данных я вызываю следующую функцию:

def fixed_aspect_ratio(ratio):
    '''
    Set a fixed aspect ratio on matplotlib plots 
    regardless of axis units
    '''
    xvals,yvals = gca().axes.get_xlim(),gca().axes.get_ylim()

    xrange = xvals[1]-xvals[0]
    yrange = yvals[1]-yvals[0]
    gca().set_aspect(ratio*(xrange/yrange), adjustable='box')
2 голосов
/ 01 октября 2016

В ответ на замечание о том, что решение не работает для логарифмических графиков при редактировании исходного вопроса - вам необходимо выполнить следующие действия:

def fixed_aspect_ratio_loglog(ratio):
    '''
    Set a fixed aspect ratio on matplotlib loglog plots 
    regardless of axis units
    '''
    xvals,yvals = gca().axes.get_xlim(),gca().axes.get_ylim()

    xrange = log(xvals[1])-log(xvals[0])
    yrange = log(yvals[1])-log(yvals[0])
    gca().set_aspect(ratio*(xrange/yrange), adjustable='box')

(теперь адаптация для полулоговых графиков должна быть очевидной)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...