Cómo hacer que pylab.savefig () guarde la imagen para la ventana ‘maximizada’ en lugar del tamaño predeterminado

Estoy usando pylab en matplotlib para crear un gráfico y guardar el gráfico en un archivo de imagen. Sin embargo, cuando pylab.savefig( image_name ) la imagen usando pylab.savefig( image_name ) , encuentro que la imagen de TAMAÑO guardada es la misma que la imagen que se muestra cuando uso pylab.show() .

Como sucede, tengo muchos datos en la gráfica y cuando uso pylab.show() , tengo que maximizar la ventana antes de poder ver toda la gráfica correctamente, y los marcadores de tags xlabel no se superponen en cada una. otro.

¿Hay alguna forma en que pueda “maximizar” la ventana mediante progtwigción antes de guardar la imagen en un archivo? – en este momento, solo obtengo la imagen de tamaño de ventana ‘predeterminada’, lo que hace que las tags del eje x se superpongan unas sobre otras.

Usted establece el tamaño en la inicialización:

 fig2 = matplotlib.pyplot.figure(figsize=(8.0, 5.0)) # in inches! 

Editar :

Si el problema es con las marcas del eje x, puede configurarlas “manualmente”:

 fig2.add_subplot(111).set_xticks(arange(1,3,0.5)) # You can actually compute the interval You need - and substitute here 

Y así sucesivamente con otros aspectos de su ttwig. Puedes configurarlo todo. Aquí hay un ejemplo:

 from numpy import arange import matplotlib # import matplotlib as mpl import matplotlib.pyplot # import matplotlib.pyplot as plt x1 = [1,2,3] y1 = [4,5,6] x2 = [1,2,3] y2 = [5,5,5] # initialization fig2 = matplotlib.pyplot.figure(figsize=(8.0, 5.0)) # The size of the figure is specified as (width, height) in inches # lines: l1 = fig2.add_subplot(111).plot(x1,y1, label=r"Text $formula$", "r-", lw=2) l2 = fig2.add_subplot(111).plot(x2,y2, label=r"$legend2$" ,"g--", lw=3) fig2.add_subplot(111).legend((l1,l2), loc=0) # axes: fig2.add_subplot(111).grid(True) fig2.add_subplot(111).set_xticks(arange(1,3,0.5)) fig2.add_subplot(111).axis(xmin=3, xmax=6) # there're also ymin, ymax fig2.add_subplot(111).axis([0,4,3,6]) # all! fig2.add_subplot(111).set_xlim([0,4]) fig2.add_subplot(111).set_ylim([3,6]) # labels: fig2.add_subplot(111).set_xlabel(r"x $2^2$", fontsize=15, color = "r") fig2.add_subplot(111).set_ylabel(r"y $2^2$") fig2.add_subplot(111).set_title(r"title $6^4$") fig2.add_subplot(111).text(2, 5.5, r"an equation: $E=mc^2$", fontsize=15, color = "y") fig2.add_subplot(111).text(3, 2, unicode('f\374r', 'latin-1')) # saving: fig2.savefig("fig2.png") 

Entonces, ¿qué es exactamente lo que quieres configurar?

Hay dos opciones principales en matplotlib (pylab) para controlar el tamaño de la imagen:

  1. Puede establecer el tamaño de la imagen resultante en pulgadas
  2. Puede definir el DPI (puntos por pulgada) para el archivo de salida (básicamente, es una resolución)

Normalmente, le gustaría hacer ambas cosas, porque de esta manera tendrá un control total sobre el tamaño de la imagen resultante en píxeles . Por ejemplo, si desea representar exactamente una imagen de 800×600, puede usar DPI = 100 y establecer el tamaño en 8 x 6 pulgadas:

 import matplotlib.pyplot as plt # plot whatever you need... # now, before saving to file: figure = plt.gcf() # get current figure figure.set_size_inches(8, 6) # when saving, specify the DPI plt.savefig("myplot.png", dpi = 100) 

Uno puede usar cualquier DPI. De hecho, es posible que desee jugar con varios valores de DPI y tamaño para obtener el resultado que más le guste. Sin embargo, tenga en cuenta que el uso de DPI muy pequeños no es una buena idea, ya que matplotlib puede no encontrar una buena fuente para representar leyendas y otros textos. Por ejemplo, no puede establecer el DPI = 1, porque no hay fonts con caracteres representados con 1 píxel 🙂

Por otros comentarios, entendí que otro problema que tiene es la representación correcta del texto. Para esto, también puede cambiar el tamaño de la fuente. Por ejemplo, puede usar 6 píxeles por carácter, en lugar de 12 píxeles por carácter utilizado de forma predeterminada (efectivamente, haciendo que todo el texto sea dos veces más pequeño).

 import matplotlib #... matplotlib.rc('font', size=6) 

Finalmente, algunas referencias a la documentación original: http://matplotlib.sourceforge.net/api/pyplot_api.html#matplotlib.pyplot.savefig , http://matplotlib.sourceforge.net/api/pyplot_api.html#matplotlib.pyplot .gcf , http://matplotlib.sourceforge.net/api/figure_api.html#matplotlib.figure.Figure.set_size_inches , http://matplotlib.sourceforge.net/users/customizing.html#dynamic-rc-settings

PD: Lo siento, no usé pylab, pero, por lo que sé, todo el código anterior funcionará de la misma manera en pylab: simplemente reemplace plt en mi código con pylab (o el nombre que haya asignado al importar pylab). Lo mismo para matplotlib – usa pylab lugar.

Creo que necesitas especificar una resolución diferente al guardar la figura en un archivo:

 fig = matplotlib.pyplot.figure() # generate your plot fig.savefig("myfig.png",dpi=600) 

La especificación de un valor de ppp grande debe tener un efecto similar al maximizar la ventana de la GUI.

Marque esto: Cómo maximizar una ventana plt.show () usando Python

El comando es diferente según el backend que uses. Me parece que esta es la mejor manera de asegurarse de que las imágenes guardadas tengan la misma escala que lo que veo en mi pantalla.

Desde que uso Canopy con el backend QT:

 pylab.get_current_fig_manager().window.showMaximized() 

Luego llamo a savefig () según sea necesario con un aumento de DPI por respuesta de silvado.

Hice el mismo tiempo de búsqueda, parece que la solución exacta depende del backend.

He leído un montón de fonts y probablemente la más útil fue la respuesta de Pythonio aquí. Cómo maximizar una ventana de plt.show () usando Python. Ajusté el código y terminé con la siguiente función. Funciona decentemente para mí en Windows, principalmente uso Qt, donde lo uso bastante a menudo, mientras que se prueba mínimamente con otros backends.

Básicamente consiste en identificar el backend y llamar a la función apropiada. Tenga en cuenta que agregué una pausa después porque tenía problemas con algunas ventanas que se maximizaban y otras no, parece que esto se resolvió para mí.

 def maximize(backend=None,fullscreen=False): """Maximize window independently on backend. Fullscreen sets fullscreen mode, that is same as maximized, but it doesn't have title bar (press key F to toggle full screen mode).""" if backend is None: backend=matplotlib.get_backend() mng = plt.get_current_fig_manager() if fullscreen: mng.full_screen_toggle() else: if backend == 'wxAgg': mng.frame.Maximize(True) elif backend == 'Qt4Agg' or backend == 'Qt5Agg': mng.window.showMaximized() elif backend == 'TkAgg': mng.window.state('zoomed') #works fine on Windows! else: print ("Unrecognized backend: ",backend) #not tested on different backends (only Qt) plt.show() plt.pause(0.1) #this is needed to make sure following processing gets applied (eg tight_layout) 

Si entiendo correctamente lo que quieres hacer, puedes crear tu figura y configurar el tamaño de la ventana. Después, puede guardar su gráfico con el botón de la caja de herramientas de matplotlib. Aquí un ejemplo:

 from pylab import get_current_fig_manager,show,plt,imshow plt.Figure() thismanager = get_current_fig_manager() thismanager.window.wm_geometry("500x500+0+0") #in this case 500 is the size (in pixel) of the figure window. In your case you want to maximise to the size of your screen or whatever imshow(your_data) show()