¿Cómo se cambia el tamaño de las figuras dibujadas con matplotlib?

2039

¿Cómo se cambia el tamaño de la figura dibujada con matplotlib?

tatwright
fuente
742
plt.figure(figsize=(20,10))
StackG
307
Ofig, ax = plt.subplots(figsize=(20, 10))
alexw
100
Pensando que el tamaño de la figura está en píxeles, especifiqué (800,600) y el programa se bloqueó. Tenga en cuenta que la unidad es pulgadas.
Raja
2
@alexw, ¿está esto en la documentación?
liang
48
fig = plt.gcf()-> fig.set_size_inches(11,8)para evitar la confusión de una vez por todas.
Ovnis

Respuestas:

1099

la figura le indica la firma de la llamada:

from matplotlib.pyplot import figure
figure(num=None, figsize=(8, 6), dpi=80, facecolor='w', edgecolor='k')

figure(figsize=(1,1)) crearía una imagen de pulgada por pulgada, que sería de 80 por 80 píxeles a menos que también proporcione un argumento de dpi diferente.

Jouni K. Seppänen
fuente
95
Si ya tiene la figura creada, digamos que es 'figura 1' (esa es la predeterminada cuando usa pyplot), puede usar figura (num = 1, figsize = (8, 6), ...) para cambiar su tamaño, etc. Si está usando pyplot / pylab y show()para crear una ventana emergente, debe llamar figure(num=1,...) antes de trazar algo: pyplot / pylab crea una figura tan pronto como dibuja algo, y aparece el tamaño de la ventana emergente para ser reparado en este punto.
drevicko
22
Siento que su respuesta sería mejor si eliminara los argumentos predeterminados. Disminuye la relación señal / ruido innecesariamente.
frmsaul
3
¿Significa esto que si establece DPI en 1, el tamaño de la figura se convierte en una unidad de píxeles en lugar de una unidad de pulgadas? Esto sería más útil cuando se usa matplotlib en la web y las interfaces GUI.
CMCDragonkai
1
con figsize (1,1) tendrá una relación en la imagen de 1: 1? porque todos mis gráficos circulares son ovalados, y la única forma que encontré de hacerlos redondos fue usando plot.axis ("igual"). tendrían el mismo efecto o se comportarían de manera diferente?
Breno Baiardi
2
@BrenoBaiardi Esta pregunta es sobre el tamaño de la figura. Los ejes en la parte superior de la figura aún pueden tener una relación de aspecto desigual, incluso si la figura en su conjunto es 1: 1, e incluso si el cuadro de ejes es 1: 1, los datos se pueden escalar de manera diferente en las direcciones x e y. Entonces, no, ese comando no garantizará una relación de aspecto igual.
Jouni K. Seppänen
741

Si ya tiene la figura creada, puede hacer esto rápidamente:

fig = matplotlib.pyplot.gcf()
fig.set_size_inches(18.5, 10.5)
fig.savefig('test2png.png', dpi=100)

Para propagar el cambio de tamaño a una ventana GUI existente, agregue forward=True

fig.set_size_inches(18.5, 10.5, forward=True)
Pete
fuente
3
Me resolvió un problema con imshow, ahora estoy usando este código justo después de eliminar el espacio alrededor del área de trazado con plt.subplots_adjust(left=0.0, right=1.0, bottom=0.0, top=1.0).
heltonbiker
77
Del mismo modo, puedes correr fig.set_dpi(100).
Erik Shilts
1
Estoy usando esto en OS X bajo ipython 3.7, matplotlib 3.0.3. Puedo ajustar el tamaño de la figura, pero la ventana no cambia de tamaño (el lienzo de la figura se ajusta, pero la ventana no crece ni se contrae para acomodar el lienzo). El argumento de palabra clave forward = True no parece tener el efecto deseado en esta plataforma.
K. Nielson
Este trabajo para mí en google colaboratorio
carlosaar22
355

Nota de desaprobación:
según la guía oficial de Matplotlib , pylabya no se recomienda el uso del módulo. Considere usar el matplotlib.pyplotmódulo en su lugar, como se describe en esta otra respuesta .

Lo siguiente parece funcionar:

from pylab import rcParams
rcParams['figure.figsize'] = 5, 10

Esto hace que el ancho de la figura sea de 5 pulgadas y su altura de 10 pulgadas .

La clase Figura luego usa esto como el valor predeterminado para uno de sus argumentos.

tatwright
fuente
3
Esto también funciona bien en la parte superior de un portátil iPython, que (dado --pylab = inline) ya tiene importados rcParams en el nivel superior.
nealmcb
44
Esto no funcionó en mi máquina Windows con interfaz OO para pyplot y Qt backend. fig.set_size_inches(18.5, 10.5, forward=True)trabajó.
Bennett Brown
2
Esta respuesta se discute actualmente en Meta
Mischa
Para la versión de Python: 3.6.4, matplotlib: 2.2.3 Creo que necesita pasar una lista o tupla, por ejemplo, rcParams ['figure.figsize'] = (5, 10)
Steve Gon
2
¿Alguien sabe por qué esto no funciona la primera vez que ejecuta la celda?
g07kore
314

UTILIZANDO plt.rcParams

También existe esta solución alternativa en caso de que desee cambiar el tamaño sin utilizar el entorno de la figura. Entonces, en caso de que esté utilizando, plt.plot()por ejemplo, puede establecer una tupla con ancho y alto.

import matplotlib.pyplot as plt
plt.rcParams["figure.figsize"] = (20,3)

Esto es muy útil cuando traza en línea (por ejemplo, con IPython Notebook). Como notó @asamaier, es preferible no poner esta declaración en la misma celda de las declaraciones de importación.

Conversión a cm

La figsizetupla acepta pulgadas, por lo que si desea establecerla en centímetros, debe dividirla por 2.54. Consulte esta pregunta .

GM
fuente
44
¡Excelente! También es útil para configurarlo una vez y trazar varias veces.
Automorphic
Por alguna razón, parece que esto ya no funciona en el cuaderno Jupyter (pero solía hacerlo).
Ray
@ Ray ¿Puedes escribir la versión de tu cuaderno Jupyter y el comportamiento para mí funciona
GM
@GM la última vez que probé, fue Jupyter versión 4.3.0 y Python 3.6.2 de Anaconda, en Windows 10 y Google Chrome 63.0.3239.84.
Ray
8
Para que funcione, necesito llamar plt.rcParams["figure.figsize"] = (20,3)a un celular adicional. Cuando lo llamo en la misma celda que la declaración de importación, se ignora.
asmaier
270

Intente con un código simple como el siguiente:

from matplotlib import pyplot as plt
plt.figure(figsize=(1,1))
x = [1,2,3]
plt.plot(x, x)
plt.show()

Debe establecer el tamaño de la figura antes de trazar.

iPAS
fuente
14
Esta respuesta me dice que es m atplotlib.pyplot.figure, que los demás no dicen tan claramente. Sigo intentando cosas como matplotlib.figureymatplotlib.figure.Figure
Lyndon White
"_tkinter.TclError: no hay suficiente memoria libre para el búfer de imagen"
Cerin
66
plt.figure(figsize=(1,1))Es el movimiento crucial. Gracias.
ximiki
En el cuaderno jupyter, esto funcionó para mí: plt.figure (figsize = (20,10))
Abhishek Poojary
Para aquellos que usan el cuaderno jupyter, asegúrese de estar usando plt.figure (figsize = (15, 10)) antes que otros comandos plt.
Yuhang Lin
90

En caso de que esté buscando una manera de cambiar el tamaño de la figura en Pandas , puede hacer, por ejemplo:

df['some_column'].plot(figsize=(10, 5))

donde dfes un marco de datos de Pandas. O, para usar figuras o ejes existentes

fig, ax = plt.subplots(figsize=(10,5))
df['some_column'].plot(ax=ax)

Si desea cambiar la configuración predeterminada, puede hacer lo siguiente:

import matplotlib

matplotlib.rc('figure', figsize=(10, 5))
Kris
fuente
73

El primer enlace en Google 'matplotlib figure size'es AdjustingImageSize ( caché de Google de la página ).

Aquí hay un script de prueba de la página anterior. Crea test[1-3].pngarchivos de diferentes tamaños de la misma imagen:

#!/usr/bin/env python
"""
This is a small demo file that helps teach how to adjust figure sizes
for matplotlib

"""

import matplotlib
print "using MPL version:", matplotlib.__version__
matplotlib.use("WXAgg") # do this before pylab so you don'tget the default back end.

import pylab
import numpy as np

# Generate and plot some simple data:
x = np.arange(0, 2*np.pi, 0.1)
y = np.sin(x)

pylab.plot(x,y)
F = pylab.gcf()

# Now check everything with the defaults:
DPI = F.get_dpi()
print "DPI:", DPI
DefaultSize = F.get_size_inches()
print "Default size in Inches", DefaultSize
print "Which should result in a %i x %i Image"%(DPI*DefaultSize[0], DPI*DefaultSize[1])
# the default is 100dpi for savefig:
F.savefig("test1.png")
# this gives me a 797 x 566 pixel image, which is about 100 DPI

# Now make the image twice as big, while keeping the fonts and all the
# same size
F.set_size_inches( (DefaultSize[0]*2, DefaultSize[1]*2) )
Size = F.get_size_inches()
print "Size in Inches", Size
F.savefig("test2.png")
# this results in a 1595x1132 image

# Now make the image twice as big, making all the fonts and lines
# bigger too.

F.set_size_inches( DefaultSize )# resetthe size
Size = F.get_size_inches()
print "Size in Inches", Size
F.savefig("test3.png", dpi = (200)) # change the dpi
# this also results in a 1595x1132 image, but the fonts are larger.

Salida:

using MPL version: 0.98.1
DPI: 80
Default size in Inches [ 8.  6.]
Which should result in a 640 x 480 Image
Size in Inches [ 16.  12.]
Size in Inches [ 16.  12.]

Dos notas:

  1. Los comentarios del módulo y la salida real difieren.

  2. Esta respuesta permite combinar fácilmente las tres imágenes en un archivo de imagen para ver la diferencia de tamaño.

jfs
fuente
77
Cada vez que intento recordar cómo hacerlo termino en esta publicación. Entonces, este es el código que normalmente estoy buscando:fig = plt.figure() default_size = fig.get_size_inches() fig.set_size_inches( (default_size[0]*2, default_size[1]*2) )
y.selivonchyk
45

Simplemente puede usar (de matplotlib.figure.Figure ):

fig.set_size_inches(width,height)

A partir de Matplotlib 2.0.0, los cambios en su lienzo serán visibles de inmediato, según el valor predeterminado de la forwardpalabra clave .True

Si solo desea cambiar el ancho o la altura en lugar de ambos, puede usar

fig.set_figwidth(val) o fig.set_figheight(val)

Estos también actualizarán inmediatamente su lienzo, pero solo en Matplotlib 2.2.0 y versiones posteriores.

Para versiones anteriores

Debe especificar forward=Trueexplícitamente para actualizar en vivo su lienzo en versiones anteriores a las especificadas anteriormente. Tenga en cuenta que las funciones set_figwidthy set_figheightno admiten el forwardparámetro en versiones anteriores a Matplotlib 1.5.0.

Río
fuente
45
import matplotlib.pyplot as plt
plt.figure(figsize=(20,10))
plt.plot(x,y) ## This is your plot
plt.show()

También puedes usar:

fig, ax = plt.subplots(figsize=(20, 10))
amalik2205
fuente
31

Intenta comentar la fig = ...línea

%matplotlib inline
import numpy as np
import matplotlib.pyplot as plt

N = 50
x = np.random.rand(N)
y = np.random.rand(N)
area = np.pi * (15 * np.random.rand(N))**2

fig = plt.figure(figsize=(18, 18))
plt.scatter(x, y, s=area, alpha=0.5)
plt.show()
Renaud
fuente
21

Esto funciona bien para mi:

from matplotlib import pyplot as plt

F = plt.gcf()
Size = F.get_size_inches()
F.set_size_inches(Size[0]*2, Size[1]*2, forward=True) # Set forward to True to resize window along with plot in figure.
plt.show() # or plt.imshow(z_array) if using an animation, where z_array is a matrix or numpy array

Esto también podría ayudar: http://matplotlib.1069221.n5.nabble.com/Resizing-figure-windows-td11424.html

Blairg23
fuente
16

Para aumentar el tamaño de su figura N veces, debe insertar esto justo antes de su pl.show ():

N = 2
params = pl.gcf()
plSize = params.get_size_inches()
params.set_size_inches( (plSize[0]*N, plSize[1]*N) )

También funciona bien con el cuaderno ipython.

psihodelia
fuente
10

Como Matplotlib no puede utilizar el sistema métrico de forma nativa, si desea especificar el tamaño de su figura en una unidad razonable de longitud, como centímetros, puede hacer lo siguiente (código de gns-ank ):

def cm2inch(*tupl):
    inch = 2.54
    if isinstance(tupl[0], tuple):
        return tuple(i/inch for i in tupl[0])
    else:
        return tuple(i/inch for i in tupl)

Entonces puedes usar:

plt.figure(figsize=cm2inch(21, 29.7))
Franck Dernoncourt
fuente
8

Esto cambia el tamaño de la figura inmediatamente incluso después de que se haya dibujado la figura (al menos usando Qt4Agg / TkAgg, pero no MacOSX, con matplotlib 1.4.0):

matplotlib.pyplot.get_current_fig_manager().resize(width_px, height_px)
wilywampa
fuente
7

Generalizando y simplificando la respuesta de psihodelia. Si desea cambiar el tamaño actual de la figura por un factorsizefactor

import matplotlib.pyplot as plt

# here goes your code

fig_size = plt.gcf().get_size_inches() #Get current size
sizefactor = 0.8 #Set a zoom factor
# Modify the current size by the factor
plt.gcf().set_size_inches(sizefactor * fig_size) 

Después de cambiar el tamaño actual, puede ocurrir que tenga que ajustar el diseño de la subtrama . Puede hacerlo en la GUI de la ventana de figura, o mediante el comando subplots_adjust

Por ejemplo,

plt.subplots_adjust(left=0.16, bottom=0.19, top=0.82)
amado por Jesús
fuente
5

Otra opción, usar la función rc () en matplotlib (la unidad es pulgadas)

import matplotlib
matplotlib.rc('figure', figsize=[10,5])
Estudiante222
fuente
-3

Cambia directamente el tamaño de la figura usando

plt.set_figsize(figure=(10, 10))
Kalyan Mohanty
fuente
44
pyplotno tiene ningún método nombrado set_figsize.
Princy