Создание квадратных подграфиков (равной высоты и ширины) в matplotlib

Когда я выполняю этот код

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.

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

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

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, matplotlib? Просто 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()

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

Во всей серьезности теперь... это должно действительно быть такой твердой вещью выполнить?

23
задан Gus 7 June 2014 в 18:05
поделиться

2 ответа

Ваша проблема в установке аспекта участков возникает, когда вы используете 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()

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

Однако существует третий вариант 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

21
ответ дан 29 November 2019 в 02:52
поделиться

Попробуйте следующее:

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.

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

2
ответ дан 29 November 2019 в 02:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: