python - font - ¿Cómo puedo establecer la relación de aspecto en matplotlib?
subplot title python (4)
¿Cuál es la versión de matplotlib
que está ejecutando? Recientemente tuve que actualizar a 1.1.0
, y con él, add_subplot(111,aspect=''equal'')
funciona para mí.
Estoy tratando de hacer un gráfico cuadrado (usando imshow), es decir, una relación de aspecto de 1: 1, pero no puedo. Ninguno de estos funciona:
import matplotlib.pyplot as plt
ax = fig.add_subplot(111,aspect=''equal'')
ax = fig.add_subplot(111,aspect=1.0)
ax.set_aspect(''equal'')
plt.axes().set_aspect(''equal'')
Parece que las llamadas simplemente se ignoran (un problema que a menudo parece tener con matplotlib).
Esta respuesta se basa en la respuesta de Yann. Establecerá la relación de aspecto para gráficos lineales o log-log. Utilicé información adicional de https://.com/a/16290035/2966723 para comprobar si los ejes son logarítmicos.
def forceAspect(ax,aspect=1):
#aspect is width/height
scale_str = ax.get_yaxis().get_scale()
xmin,xmax = ax.get_xlim()
ymin,ymax = ax.get_ylim()
if scale_str==''linear'':
asp = abs((xmax-xmin)/(ymax-ymin))/aspect
elif scale_str==''log'':
asp = abs((scipy.log(xmax)-scipy.log(xmin))/(scipy.log(ymax)-scipy.log(ymin)))/aspect
ax.set_aspect(asp)
Obviamente puedes usar cualquier versión de log
que quieras, he usado scipy
, pero numpy
o math
deberían estar bien.
La tercera es la vencida. Creo que esto es un error y la respuesta de Zhenya sugiere que está arreglado 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 están mis intentos infructuosos, pero con suerte informativos.
Segunda respuesta:
Mi ''respuesta original'' a continuación es exagerada, 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 un diagrama de imagen cuadrado 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 diagrama de imagen con una relación de aspecto ''igual'': y uno con relación de aspecto ''automático'':
El código proporcionado a continuación en la ''respuesta original'' proporciona un punto de partida para una relación de aspecto explícitamente controlada, pero parece ignorarse una vez que se llama a 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 tienes varias subtramas dentro de la figura, querrás incluir el número de subparcelas yy como parámetros de palabras clave (valor predeterminado en 1 cada uno) a la rutina provista. Luego, usando esos números y las palabras clave hspace
y wspace
, puede hacer que todas las subtramas tengan la proporción de aspecto correcta.
deberías probar con figaspect. Esto funciona para mi. De los documentos:
Crea una figura con relación de aspecto especificada. Si arg es un número, use esa relación de aspecto. > Si arg es una matriz, figaspect determinará el ancho y la altura para una figura que se ajuste a la proporción de aspecto que conserva la matriz. Se muestran el ancho y la altura de la figura en pulgadas. Asegúrese de crear un eje con igual y altura, por ejemplo
Ejemplo de uso:
# make a figure twice as tall as it is wide
w, h = figaspect(2.)
fig = Figure(figsize=(w,h))
ax = fig.add_axes([0.1, 0.1, 0.8, 0.8])
ax.imshow(A, **kwargs)
# make a figure with the proper aspect for an array
A = rand(5,3)
w, h = figaspect(A)
fig = Figure(figsize=(w,h))
ax = fig.add_axes([0.1, 0.1, 0.8, 0.8])
ax.imshow(A, **kwargs)
Editar: No estoy seguro de lo que estás buscando. El código anterior cambia el lienzo (el tamaño de la gráfica). Si desea cambiar el tamaño de la ventana de matplotlib, de la figura, utilice:
In [68]: f = figure(figsize=(5,1))
esto produce una ventana de 5x1 (wxh).