Когда я выполняю этот код
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()
Эти причины первый подграфик, который исчезнет полностью. Это весело! Кто придумал тот?
Во всей серьезности теперь... это должно действительно быть такой твердой вещью выполнить?
Ваша проблема в установке аспекта участков возникает, когда вы используете 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()
В любом случае, вы получите что-то похожее на:
Попробуйте следующее:
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
.
Надеюсь, это поможет :)