Создание квадратных сюжетов (одинаковой высоты и ширины) в matplotlib - PullRequest
22 голосов
/ 09 июля 2010

Когда я запускаю этот код

from pylab import *

figure()
ax1 = subplot(121)
plot([1, 2, 3], [1, 2, 3])
subplot(122, sharex=ax1, sharey=ax1)
plot([1, 2, 3], [1, 2, 3])
draw()
show()

, я получаю два вспомогательных участка, которые "сжаты" в X-измерении.Как получить эти субплоты так, чтобы высота оси Y равнялась ширине оси X для обоих субплотов?

Я использую matplotlib v.0.99.1.2 в Ubuntu 10.04.

Обновление 2010-07-08 : Давайте посмотрим на некоторые вещи, которые не работают.

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

from pylab import *

figure()
ax1 = subplot(121, autoscale_on=False)
plot([1, 2, 3], [1, 2, 3])
subplot(122, sharex=ax1, sharey=ax1)
plot([1, 2, 3], [1, 2, 3])
draw()
show()

matplotlib настаивает на автоматическом масштабировании.

from pylab import *

figure()
ax1 = subplot(121, autoscale_on=False)
plot([1, 2, 3], [1, 2, 3])
subplot(122, sharex=ax1, sharey=ax1, autoscale_on=False)
plot([1, 2, 3], [1, 2, 3])
draw()
show()

В этом случае данные полностью исчезают.WTF, матплотлиб?Просто WTF?

Хорошо, может быть, если мы исправим соотношение сторон?

from pylab import *

figure()
ax1 = subplot(121, autoscale_on=False)
plot([1, 2, 3], [1, 2, 3])
axes().set_aspect('equal')
subplot(122, sharex=ax1, sharey=ax1)
plot([1, 2, 3], [1, 2, 3])
draw()
show()

Это приводит к тому, что первый субплот полностью исчезает.Это весело!Кто придумал это?

На полном серьезе, теперь ... разве это действительно трудно сделать?

Ответы [ 2 ]

19 голосов
/ 09 июля 2010

Когда вы используете sharex и sharey, возникает проблема с настройкой формата графиков.

Один из обходных путей - просто не использовать общие оси. Например, вы можете сделать это:

from pylab import *

figure()
subplot(121, aspect='equal')
plot([1, 2, 3], [1, 2, 3])
subplot(122, aspect='equal')
plot([1, 2, 3], [1, 2, 3])
show()

Тем не менее, лучшим обходным решением является изменение «настраиваемого» ключевого слова ... Вы хотите настраиваемый = 'box', но когда вы используете общие оси, он должен быть настраиваемым = 'datalim' (и возвращать его обратно на «ящик» выдает ошибку).

Однако для adjustable существует третий вариант обработки именно этого случая: adjustable="box-forced".

Например:

from pylab import *

figure()
ax1 = subplot(121, aspect='equal', adjustable='box-forced')
plot([1, 2, 3], [1, 2, 3])
subplot(122, aspect='equal', adjustable='box-forced', sharex=ax1, sharey=ax1)
plot([1, 2, 3], [1, 2, 3])
show()

Или в более современном стиле (примечание: эта часть ответа не сработала бы в 2010 году):

import matplotlib.pyplot as plt

fig, axes = plt.subplots(ncols=2, sharex=True, sharey=True)
for ax in axes:
    ax.plot([1, 2, 3], [1, 2, 3])
    ax.set(adjustable='box-forced', aspect='equal')

plt.show()

В любом случае вы получите нечто похожее на:

enter image description here

2 голосов
/ 09 июля 2010

Попробуйте:

from pylab import *

figure()
ax1 = subplot(121, autoscale_on=False, aspect='equal', xlim=[1,3], ylim=[1,3])
plot([1, 2, 3], [1, 2, 3])
##axes().set_aspect('equal')
ax2 = subplot(122, autoscale_on=False, aspect='equal', xlim=[1,3], ylim=[1,3])
plot([1, 2, 3], [1, 2, 3])
draw()
show()

Я прокомментировал строку axes(), так как это создаст новый axes в произвольном месте, а не заранее изготовленный subplot с вычисленной позицией.

Вызов subplot фактически создает экземпляр Axes, что означает, что он может использовать те же свойства, что и у Axes.

Надеюсь, это поможет:)

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