Come si modificano le dimensioni delle figure disegnate con matplotlib?


2038

Come si modifica la dimensione della figura disegnata con matplotlib?


742
plt.figure(figsize=(20,10))
StackG

307
OPPUREfig, ax = plt.subplots(figsize=(20, 10))
alexw,

100
Pensando che la dimensione della figura sia in pixel, ho specificato (800.600) e il programma si è bloccato! Si prega di notare che l'unità è pollici.
Raja,

2
@alexw è presente nella documentazione?
liang

48
fig = plt.gcf()-> fig.set_size_inches(11,8)per evitare la confusione una volta per tutte.
Ufo

Risposte:


1099

la figura indica la firma della chiamata:

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

figure(figsize=(1,1)) creerebbe un'immagine pollice per pollice, che sarebbe 80 per 80 pixel a meno che non si fornisca anche un argomento dpi diverso.


95
Se hai già creato la figura, supponi che sia "figura 1" (che è quella predefinita quando usi pyplot), puoi usare la figura (num = 1, figsize = (8, 6), ...) per cambiarne le dimensioni ecc. Se stai usando pyplot / pylab e show()per creare una finestra pop-up, devi chiamare figure(num=1,...) prima di tracciare qualsiasi cosa: pyplot / pylab crea una figura non appena disegni qualcosa e appare la dimensione del popup da risolvere a questo punto.
drevicko,

22
Sento che la tua risposta sarebbe migliore se rimuovessi gli argomenti predefiniti. Riduce inutilmente il rapporto segnale-rumore.
frmsaul,

3
Questo significa che se si imposta DPI su 1, Figsize diventa un'unità pixel anziché un'unità pollici? Ciò sarebbe più utile quando si utilizza matplotlib su interfacce Web e GUI.
CMCDragonkai,

1
con figsize (1,1) avrai un rapporto nell'immagine come 1: 1? perché tutti i miei grafici a torta sono ovali e l'unico modo in cui ho scoperto di farli girare era usando plot.axis ("uguale a"). avrebbero lo stesso effetto o si comportano in modo diverso?
Breno Baiardi,

2
@BrenoBaiardi Questa domanda riguarda le dimensioni della figura. Gli assi nella parte superiore della figura possono avere ancora proporzioni diseguali anche se la figura nel suo insieme è 1: 1 e anche se la casella degli assi è 1: 1, i dati possono essere ridimensionati in modo diverso nelle direzioni xey. Quindi, no, quel comando non garantisce un rapporto di aspetto uguale.
Jouni K. Seppänen,

741

Se hai già creato la figura, puoi farlo rapidamente:

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

Per propagare la modifica delle dimensioni in una finestra gui esistente aggiungere forward=True

fig.set_size_inches(18.5, 10.5, forward=True)

3
Risolto un problema con me imshow, ora sto usando questo codice subito dopo aver eliminato lo spazio attorno all'area della stampa con plt.subplots_adjust(left=0.0, right=1.0, bottom=0.0, top=1.0).
Heltonbiker,

7
Allo stesso modo, puoi correre fig.set_dpi(100).
Erik Shilts,

1
Sto usando questo su OS X sotto ipython 3.7, matplotlib 3.0.3. Sono in grado di regolare le dimensioni della figura, ma la finestra non si ridimensiona (la tela della figura si regola, ma la finestra non si ingrandisce o si restringe per adattarsi alla tela). L'argomento della parola chiave forward = True non sembra avere l'effetto desiderato su questa piattaforma.
K. Nielson,

Questo lavoro per me in google colaboratory
carlosaar22

355

Nota di deprecazione:
secondo la guida ufficiale di Matplotlib , l'uso del pylabmodulo non è più raccomandato. Si consiglia di utilizzare matplotlib.pyplotinvece il modulo, come descritto da questa altra risposta .

Il seguente sembra funzionare:

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

Ciò rende la larghezza della figura di 5 pollici e la sua altezza di 10 pollici .

La classe Figure utilizza quindi questo come valore predefinito per uno dei suoi argomenti.


3
Funziona bene anche nella parte superiore di un notebook iPython, che (dato --pylab = inline) ha rcParams già importato al massimo livello.
nealmcb,

4
Questo non ha funzionato sul mio computer Windows con interfaccia OO per pyplot e QT backend. fig.set_size_inches(18.5, 10.5, forward=True)lavorato.
Bennett Brown,

2
Questa risposta è attualmente discussa su Meta
Mischa il

Per la versione Python: 3.6.4, matplotlib: 2.2.3 Penso che sia necessario passare un elenco o una tupla, ad esempio rcParams ['figure.figsize'] = (5, 10)
Steve Gon,

2
Qualcuno sa perché questo non funziona al primo avvio della cella?
g07kore,

314

USANDO plt.rcParams

C'è anche questa soluzione alternativa nel caso in cui si desideri modificare le dimensioni senza utilizzare l'ambiente figure. Quindi, nel caso tu stia usando plt.plot()ad esempio, puoi impostare una tupla con larghezza e altezza.

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

Questo è molto utile quando si traccia in linea (ad es. Con IPython Notebook). Come notato da @asamaier è preferibile non inserire questa affermazione nella stessa cella delle dichiarazioni di importazione.

Conversione a cm

La figsizetupla accetta i pollici, quindi se vuoi impostarli in centimetri devi dividerli per 2,54 dai un'occhiata a questa domanda .


4
Eccellente! Utile anche per impostarlo una volta e tracciare più volte.
automorfo

Per qualche motivo, sembra che questo non funzioni più nel notebook Jupyter (ma era solito).
Ray,

@Ray Puoi scrivere la versione del tuo quaderno Jupyter e il comportamento per me funziona
GM

@GM l'ultima volta che ho provato, era Jupyter versione 4.3.0 e Python 3.6.2 di Anaconda, su Windows 10 e Google Chrome 63.0.3239.84.
Ray

8
Per farlo funzionare, devo chiamare plt.rcParams["figure.figsize"] = (20,3)una cella in più. Quando lo chiamo nella stessa cella dell'istruzione import, viene ignorato.
asmaier

270

Prova un codice semplice come segue:

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

È necessario impostare le dimensioni della figura prima di stampare.


14
Questa risposta mi dice che è m atplotlib.pyplot.figure, che gli altri non dicono altrettanto chiaramente. Continuo a provare cose del genere matplotlib.figureematplotlib.figure.Figure
Lyndon White il

"_tkinter.TclError: memoria insufficiente per buffer immagine"
Cerin

6
plt.figure(figsize=(1,1))è la mossa cruciale. Grazie.
ximiki,

Nel taccuino di Giove, questo ha funzionato per me: plt.figure (figsize = (20,10))
Abhishek Poojary,

Per coloro che usano il quaderno jupyter, assicurarsi di utilizzare plt.figure (figsize = (15, 10)) prima di altri comandi plt.
Yuhang Lin,

90

Nel caso in cui tu stia cercando un modo per cambiare la dimensione della figura in Panda , potresti fare ad esempio:

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

dove si dftrova un frame di dati Pandas. Oppure, per utilizzare figure o assi esistenti

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

Se si desidera modificare le impostazioni predefinite, è possibile effettuare le seguenti operazioni:

import matplotlib

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

73

Il primo link in Google per 'matplotlib figure size'è AdjustingImageSize ( cache di Google della pagina ).

Ecco uno script di test dalla pagina sopra. Crea test[1-3].pngfile di dimensioni diverse della stessa immagine:

#!/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.

Produzione:

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

Due note:

  1. I commenti del modulo e l'output effettivo differiscono.

  2. Questa risposta consente di combinare facilmente tutte e tre le immagini in un file di immagine per vedere la differenza nelle dimensioni.


7
Ogni volta che sto cercando di ricordare come farlo, finisco in questo post. Quindi, questo è il codice che sto normalmente cercando:fig = plt.figure() default_size = fig.get_size_inches() fig.set_size_inches( (default_size[0]*2, default_size[1]*2) )
y.selivonchyk,

45

Puoi semplicemente usare (da matplotlib.figure.Figure ):

fig.set_size_inches(width,height)

A partire da Matplotlib 2.0.0, le modifiche all'area di disegno saranno immediatamente visibili, come impostazione predefinita per la forwardparola chiave .True

Se vuoi solo cambiare la larghezza o l' altezza invece di entrambi, puoi usare

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

Questi aggiorneranno immediatamente anche la tua tela, ma solo in Matplotlib 2.2.0 e versioni successive.

Per le versioni precedenti

Devi specificare forward=Trueesplicitamente per aggiornare in tempo reale la tua tela in versioni precedenti a quanto specificato sopra. Si noti che le funzioni set_figwidthe set_figheightnon supportano il forwardparametro nelle versioni precedenti a Matplotlib 1.5.0.


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

Puoi anche usare:

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

31

Prova a commentare la fig = ...riga

%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()

21

Questo funziona bene per me:

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

Questo potrebbe anche aiutare: http://matplotlib.1069221.n5.nabble.com/Resizing-figure-windows-td11424.html


16

Per aumentare la dimensione della tua figura N volte devi inserirla subito prima di pl.show ():

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

Funziona bene anche con il notebook ipython.


10

Poiché Matplotlib non è in grado di utilizzare il sistema metrico in modo nativo, se si desidera specificare la dimensione della figura in un'unità di lunghezza ragionevole come centimetri, è possibile effettuare le seguenti operazioni (codice da 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)

Quindi puoi usare:

plt.figure(figsize=cm2inch(21, 29.7))

8

Questo ridimensiona la figura immediatamente anche dopo che la figura è stata disegnata (almeno usando Qt4Agg / TkAgg - ma non MacOSX - con matplotlib 1.4.0):

matplotlib.pyplot.get_current_fig_manager().resize(width_px, height_px)

7

Generalizzare e semplificare la risposta di Psihodelia. Se si desidera modificare la dimensione corrente della figura di un fattoresizefactor

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) 

Dopo aver modificato le dimensioni correnti, è possibile che sia necessario ottimizzare il layout della sottotrama . È possibile farlo nella GUI della finestra della figura o tramite il comando subplots_adjust

Per esempio,

plt.subplots_adjust(left=0.16, bottom=0.19, top=0.82)

5

Un'altra opzione, per usare la funzione rc () in matplotlib (l'unità è pollici)

import matplotlib
matplotlib.rc('figure', figsize=[10,5])

-3

È possibile modificare direttamente la dimensione della figura utilizzando

plt.set_figsize(figure=(10, 10))

4
pyplotnon ha alcun metodo chiamato set_figsize.
Princy
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.