La tercera es la vencida. Supongo que esto es un error y la respuesta de Zhenya sugiere que está corregido en la última versión. Tengo la versión 0.99.1.1 y he creado la siguiente solución:
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')
Esto es 'force.png':
A continuación se muestran mis intentos infructuosos, pero con suerte informativos.
Segunda respuesta:
Mi 'respuesta original' a continuación es excesiva, ya que hace algo similar a axes.set_aspect()
. Creo que quieres usar axes.set_aspect('auto')
. No entiendo por qué este es el caso, pero produce una gráfica de imagen cuadrada para mí, por ejemplo, este script:
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')
Produce un gráfico de imagen con una relación de aspecto 'igual':
y uno con una relación de aspecto 'automática':
El código proporcionado a continuación en la 'respuesta original' proporciona un punto de partida para una relación de aspecto controlada explícitamente, pero parece que se ignora una vez que se llama a un imshow.
Respuesta original:
Aquí hay un ejemplo de una rutina que ajustará los parámetros de la subparcela para que obtenga la relación de aspecto deseada:
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')
Esto produce una figura como esta:
Me imagino que si tiene varias subparcelas dentro de la figura, querrá incluir el número de subtramas yyx como parámetros de palabras clave (por defecto en 1 cada una) en la rutina proporcionada. Luego, usando esos números y las palabras clave hspace
y wspace
, puede hacer que todas las subtramas tengan la relación de aspecto correcta.
ax.axis('equal')
por casualidad? Como todos han dicho, lo que hiciste debería funcionar, peroax.axis
podría ser otra ruta para intentar una solución alternativa.