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

8 minutos de lectura

avatar de usuario
Homúnculo Retículo

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

Da la casualidad de que tengo muchos datos en el gráfico y cuando estoy usando pylab.show()tengo que maximizar la ventana antes de poder ver todo el gráfico correctamente, y los tickers de xlabel no se superponen entre sí.

¿Hay alguna forma de que pueda ‘maximizar’ la ventana mediante programación antes de guardar la imagen en un archivo? – por el momento, solo obtengo la imagen de tamaño de ventana ‘predeterminada’, lo que da como resultado que las etiquetas del eje x se superpongan entre sí.

avatar de usuario
Timur

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á control total sobre el tamaño de la imagen resultante en píxeles. Por ejemplo, si desea renderizar una imagen exactamente 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. Tenga en cuenta, sin embargo, que usar DPI muy pequeños no es una buena idea, porque matplotlib puede no encontrar una buena fuente para representar la leyenda y otro texto. Por ejemplo, no puede configurar el DPI = 1, porque no hay fuentes con caracteres representados con 1 píxel 🙂

Por otros comentarios, entendí que otro problema que tiene es la representación adecuada del texto. Para esto, también puede cambiar el tamaño de fuente. Por ejemplo, puede utilizar 6 píxeles por carácter, en lugar de los 12 píxeles por carácter que se utilizan de forma predeterminada (en la práctica, todo el texto es 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 que yo sepa, todo el código anterior funcionará de la misma manera en pylab, solo reemplace plt en mi código con el pylab (o cualquier nombre que haya asignado al importar pylab). Igual por matplotlib – usar pylab en cambio.

  • solo intenté usar esto. Algo todavía reduce mis píxeles. Tengo una matriz de imágenes numpy apiladas de 800 x 4000 píxeles y quiero guardarla sin ninguna pérdida, de modo que mi imagen guardada tenga exactamente 800×4000 píxeles. ¿Utilizó figure(figsize=(8,40)) y savefig(fname, dpi=100) y recibió un PDF de 576×2880 píxeles?

    – K.-Michael Aye

    2 de octubre de 2012 a las 2:50

  • Acabo de confirmar que se trata de un problema del motor de PDF. Un png sale correctamente.

    – K.-Michael Aye

    2 de octubre de 2012 a las 3:02

avatar de usuario
Adobe

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 trama. 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 desea configurar?

  • Gracias por la pronta respuesta. Sin embargo, esto no resuelve el problema. La imagen guardada en el archivo es la imagen que se muestra cuando uno llama pylab.show(). Para los datos que estoy trazando, necesito (manualmente) maximizar la ventana para proporcionar suficiente espacio entre las etiquetas. Casi parece que detrás de la escena, pylab.savefig() está haciendo un pylab.show()luego tomando una captura de pantalla del DEFECTO tamaño de la ventana y guardarlo en el archivo. Necesito guardar la imagen que se muestra cuando la ventana está MAXIMIZADO

    – Homúnculo Reticulli

    6 de abril de 2012 a las 10:07


  • ¿Por qué no lo personalizas de forma no GUI? Nunca escuché que es posible hacer que Python sea consciente de lo que has hecho en pylab.show().

    – Adobe

    6 de abril de 2012 a las 10:27

  • Continuación… Simplemente estoy tratando de encontrar una manera de maximizar ‘programadamente’ la ‘ventana’/lienzo (o al menos especificar un tamaño específico) antes de que la imagen se guarde en el archivo.

    – Homúnculo Reticulli

    6 de abril de 2012 a las 10:48

  • La respuesta en realidad no responde a la pregunta. Puede resolver el problema del interrogador, pero la pregunta es claramente cómo guardar la cifra maximizada, y eso no está claro de todos modos en esta respuesta.

    – La Importancia De Ser Ernesto

    24 de agosto de 2017 a las 16:58

  • @HomunculusReticulli, ¿logró encontrar una forma de hacerlo? Tengo el mismo problema y todas las soluciones sugeridas no resolvieron el problema de ahorro en absoluto.

    – Sagrado

    04/09/2017 a las 15:23

Creo que debe 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)

Especificar un valor de ppp grande debería tener un efecto similar al de maximizar la ventana de la GUI.

  • En realidad, el efecto es bastante diferente. Aumentar el DPI solo aumenta la resolución de la imagen, mientras que cambiar el tamaño de la figura cambia el espacio entre las subtramas, títulos, etc. sin cambiar el tamaño de la fuente. Por lo tanto, primero debe configurar el tamaño de la figura para obtener el tamaño de fuente correcto, luego configurar el DPI para obtener la resolución deseada.

    – milembar

    19 de marzo de 2021 a las 20:57

avatar de usuario
Máximo

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

El comando es diferente según el backend que utilice. Creo que esta es la mejor manera de asegurarme de que las imágenes guardadas tengan la misma escala que las que veo en mi pantalla.

Como 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.

Puede mirar en una figura guardada su tamaño, como 1920×983 px (tamaño cuando guardé una ventana maximizada), luego configuré el dpi en 100 y el tamaño en 19.20×9.83 y funcionó bien. Guardado exactamente igual a la cifra maximizada.

import numpy as np
import matplotlib.pyplot as plt
x, y = np.genfromtxt('fname.dat', usecols=(0,1), unpack=True)
a = plt.figure(figsize=(19.20,9.83))
a = plt.plot(x, y, '-')
plt.savefig('file.png',format="png",dpi=100)

avatar de usuario
RestitutorOrbis

Tuve este problema exacto y esto funcionó:

plt.savefig(output_dir + '/xyz.png', bbox_inches="tight")

Aquí está la documentación:

[https://matplotlib.org/3.1.1/api/_as_gen/matplotlib.pyplot.savefig.html][1]

avatar de usuario
Vincenzooo

Hice la misma búsqueda hace tiempo, parece que la solución exacta depende del backend.

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

Básicamente consiste en identificar el backend y llamar a la función adecuada. 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 (e.g. tight_layout)

  • para TkAgg en ubuntu, puede probar:
    mng = plt.get_current_fig_manager() <br/> mng.resize(*mng.window.maxsize())
    Tomado de stackoverflow.com/questions/12439588/…

    –Patricio Astudillo

    25 de febrero de 2019 a las 10:51


¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad