Третий раз очарование. Я предполагаю, что это ошибка, и ответ Жени предполагает, что она исправлена в последней версии. У меня версия 0.99.1.1, и я создал следующее решение:
import matplotlib.pyplot as plt
import numpy as np
def forceAspect(ax,aspect=1):
im = ax.get_images()
extent = im[0].get_extent()
ax.set_aspect(abs((extent[1]-extent[0])/(extent[3]-extent[2]))/aspect)
data = np.random.rand(10,20)
fig = plt.figure()
ax = fig.add_subplot(111)
ax.imshow(data)
ax.set_xlabel('xlabel')
ax.set_aspect(2)
fig.savefig('equal.png')
ax.set_aspect('auto')
fig.savefig('auto.png')
forceAspect(ax,aspect=1)
fig.savefig('force.png')
Это force.png:
Ниже приведены мои неудачные, но, надеюсь, информативные попытки.
Второй ответ:
Мой «оригинальный ответ» ниже - излишний, так как он делает что-то похожее на axes.set_aspect()
. Я думаю, вы хотите использовать axes.set_aspect('auto')
. Я не понимаю, почему это так, но он создает для меня график квадратного изображения, например этот скрипт:
import matplotlib.pyplot as plt
import numpy as np
data = np.random.rand(10,20)
fig = plt.figure()
ax = fig.add_subplot(111)
ax.imshow(data)
ax.set_aspect('equal')
fig.savefig('equal.png')
ax.set_aspect('auto')
fig.savefig('auto.png')
Создает график изображения с «равным» соотношением сторон:
и один с «автоматическим» соотношением сторон:
Код, приведенный ниже в «исходном ответе», обеспечивает отправную точку для явно контролируемого соотношения сторон, но кажется, что он игнорируется после вызова imshow.
Оригинальный ответ:
Вот пример процедуры, которая настроит параметры подзаголовка так, чтобы вы получили желаемое соотношение сторон:
import matplotlib.pyplot as plt
def adjustFigAspect(fig,aspect=1):
'''
Adjust the subplot parameters so that the figure has the correct
aspect ratio.
'''
xsize,ysize = fig.get_size_inches()
minsize = min(xsize,ysize)
xlim = .4*minsize/xsize
ylim = .4*minsize/ysize
if aspect < 1:
xlim *= aspect
else:
ylim /= aspect
fig.subplots_adjust(left=.5-xlim,
right=.5+xlim,
bottom=.5-ylim,
top=.5+ylim)
fig = plt.figure()
adjustFigAspect(fig,aspect=.5)
ax = fig.add_subplot(111)
ax.plot(range(10),range(10))
fig.savefig('axAspect.png')
Это дает такую фигуру:
Я могу представить, если у вас есть несколько подзаголовков на рисунке, вы захотите включить количество подзаголовков y и x в качестве параметров ключевого слова (по умолчанию 1 каждый) в предоставленную процедуру. Затем , используя эти цифры и hspace
и wspace
ключевые слова, вы можете сделать все подзаговоры иметь правильное соотношение сторон.
ax.axis('equal')
случайно не пробовали ? Как все говорили, то, что вы сделали, должно сработать, но,ax.axis
возможно, это еще один способ найти обходной путь.