Clase de ejes: establece explícitamente el tamaño (ancho / alto) de los ejes en unidades determinadas

Quiero crear una figura usando matplotlib donde puedo especificar explícitamente el tamaño de los ejes, es decir, quiero establecer el ancho y la altura de los ejes bbox.

He mirado por todas partes y no puedo encontrar una solución para esto. Lo que normalmente encuentro es cómo ajustar el tamaño de la Figura completa (incluidas las marcas y las tags), por ejemplo, usando fig, ax = plt.subplots(figsize=(w, h))

Esto es muy importante para mí, ya que quiero tener una escala 1: 1 de los ejes, es decir, 1 unidad en papel es igual a 1 unidad en realidad. Por ejemplo, si xrange es de 0 a 10 con el tick mayor = 1 y el eje x es de 10 cm, entonces 1 tick mayor = 1cm. Guardaré esta figura como pdf para importarla a un documento de látex.

Esta pregunta trajo un tema similar pero la respuesta no resuelve mi problema (usando el plt.gca().set_aspect('equal', adjustable='box') )

De esta otra pregunta veo que es posible obtener el tamaño de los ejes, pero no cómo modificarlos explícitamente.

Cualquier idea de cómo puedo configurar el tamaño del cuadro de ejes y no solo el tamaño de la figura. El tamaño de la figura debe adaptarse al tamaño de los ejes.

¡Gracias!

Para aquellos familiarizados con pgfplots en látex, le gustaría tener algo similar a la opción de scale only axis (vea aquí por ejemplo).

El tamaño de los ejes está determinado por el tamaño de la figura y las separaciones de la figura, que se pueden establecer utilizando figure.subplots_adjust() . En sentido inverso, esto significa que puede establecer el tamaño de los ejes configurando el tamaño de la figura teniendo en cuenta los espaciados de la figura:

 import matplotlib.pyplot as plt def set_size(w,h, ax=None): """ w, h: width, height in inches """ if not ax: ax=plt.gca() l = ax.figure.subplotpars.left r = ax.figure.subplotpars.right t = ax.figure.subplotpars.top b = ax.figure.subplotpars.bottom figw = float(w)/(rl) figh = float(h)/(tb) ax.figure.set_size_inches(figw, figh) fig, ax=plt.subplots() ax.plot([1,3,2]) set_size(5,5) plt.show() 

Parece que Matplotlib tiene clases auxiliares que le permiten definir ejes con un tamaño fijo. Demo de tamaño fijo.

Descubrí que la respuesta ImportanceofBeingErnests que modifica el tamaño de la figura para ajustar el tamaño de los ejes proporciona resultados inconsistentes con los ajustes de matplotlib específicos que utilizo para producir gráficos listos para publicación. Los errores leves estaban presentes en el tamaño de la figura final, y no pude encontrar una manera de resolver el problema con su enfoque. Para la mayoría de los casos de uso, creo que esto no es un problema, sin embargo, los errores se notaron al combinar varios PDF para su publicación.

En lugar de desarrollar un ejemplo de trabajo mínimo para encontrar el problema real que tengo con el enfoque de cambio de tamaño de la figura, encontré un trabajo en torno al cual se usa el tamaño de los ejes fijos utilizando la clase divisoria.

 from mpl_toolkits.axes_grid1 import Divider, Size def fix_axes_size_incm(axew, axeh): axew = axew/2.54 axeh = axeh/2.54 #lets use the tight layout function to get a good padding size for our axes labels. fig = plt.gcf() ax = plt.gca() fig.tight_layout() #obtain the current ratio values for padding and fix size oldw, oldh = fig.get_size_inches() l = ax.figure.subplotpars.left r = ax.figure.subplotpars.right t = ax.figure.subplotpars.top b = ax.figure.subplotpars.bottom #work out what the new ratio values for padding are, and the new fig size. neww = axew+oldw*(1-r+l) newh = axeh+oldh*(1-t+b) newr = r*oldw/neww newl = l*oldw/neww newt = t*oldh/newh newb = b*oldh/newh #right(top) padding, fixed axes size, left(bottom) pading hori = [Size.Scaled(newr), Size.Fixed(axew), Size.Scaled(newl)] vert = [Size.Scaled(newt), Size.Fixed(axeh), Size.Scaled(newb)] divider = Divider(fig, (0.0, 0.0, 1., 1.), hori, vert, aspect=False) # the width and height of the rectangle is ignored. ax.set_axes_locator(divider.new_locator(nx=1, ny=1)) #we need to resize the figure now, as we have may have made our axes bigger than in. fig.set_size_inches(neww,newh) 

Cosas que vale la pena destacar:

  • Una vez que llama a set_axes_locator() en una instancia de eje, interrumpe la función tight_layout() .
  • El tamaño de figura original que elija será irrelevante, y el tamaño de figura final se determinará por el tamaño de los ejes que elija y el tamaño de las tags / tags de marca / marcas de salida.
  • Este enfoque no funciona con barras de escala de color.
  • Este es mi primer post de desbordamiento de stack.