Comment changez-vous la taille des figures dessinées avec matplotlib?

2040

Comment changez-vous la taille de la figure dessinée avec matplotlib?

tatwright
la source
742
plt.figure(figsize=(20,10))
StackG
307
OUfig, ax = plt.subplots(figsize=(20, 10))
alexw
100
Pensant que la taille de la figure est en pixels, j'ai spécifié (800 600) et le programme s'est écrasé! Veuillez noter que l'unité est en pouces.
Raja
2
@alexw est-ce dans la documentation?
liang
48
fig = plt.gcf()-> fig.set_size_inches(11,8)pour éviter la confusion une fois pour toutes.
Ufos

Réponses:

1100

la figure vous indique la signature de l'appel:

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

figure(figsize=(1,1)) créerait une image pouce par pouce, qui serait de 80 par 80 pixels, sauf si vous donnez également un argument dpi différent.

Jouni K. Seppänen
la source
95
Si vous avez déjà créé la figure, disons que c'est `` figure 1 '' (c'est la valeur par défaut lorsque vous utilisez pyplot), vous pouvez utiliser la figure (num = 1, figsize = (8, 6), ...) pour changer sa taille, etc. Si vous utilisez pyplot / pylab et show()pour créer une fenêtre contextuelle, vous devez appeler figure(num=1,...) avant de tracer quoi que ce soit - pyplot / pylab crée une figure dès que vous dessinez quelque chose, et la taille de la fenêtre contextuelle apparaît à fixer à ce stade.
drevicko
22
J'ai l'impression que votre réponse serait meilleure si vous supprimiez les arguments par défaut. Il diminue inutilement le rapport signal / bruit.
frmsaul
3
Est-ce à dire que si vous définissez DPI à 1, alors figsize devient une unité de pixel au lieu d'une unité de pouce? Cela serait plus utile lors de l'utilisation de matplotlib sur les interfaces Web et GUI.
CMCDragonkai
1
avec figsize (1,1), vous aurez un rapport dans l'image de 1: 1? parce que tous mes camemberts sont de forme ovale, et la seule façon que j'ai trouvée pour les arrondir était d'utiliser plot.axis ("equals"). auraient-ils le même effet ou se comportent-ils différemment?
Breno Baiardi
2
@BrenoBaiardi Cette question concerne la taille de la figure. Les axes au-dessus de la figure peuvent toujours avoir un rapport d'aspect inégal même si la figure dans son ensemble est 1: 1, et même si la zone des axes est 1: 1, les données peuvent être mises à l'échelle différemment dans les directions x et y. Donc, non, cette commande ne garantira pas un rapport d'aspect égal.
Jouni K. Seppänen
743

Si vous avez déjà créé la figure, vous pouvez le faire rapidement:

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

Pour propager le changement de taille dans une fenêtre GUI existante, ajoutez forward=True

fig.set_size_inches(18.5, 10.5, forward=True)
Pete
la source
3
J'ai résolu un problème avec imshow, maintenant j'utilise ce code juste après avoir éliminé l'espace autour de la zone de traçage avec plt.subplots_adjust(left=0.0, right=1.0, bottom=0.0, top=1.0).
heltonbiker
7
De même, vous pouvez exécuter fig.set_dpi(100).
Erik Shilts
1
J'utilise ceci sur OS X sous ipython 3.7, matplotlib 3.0.3. Je peux ajuster la taille de la figure, mais la fenêtre ne se redimensionne pas (la toile de la figure s'ajuste, mais la fenêtre ne s'agrandit pas ou ne se rétrécit pas pour accueillir la toile). L'argument du mot clé forward = True ne semble pas avoir l'effet escompté sur cette plateforme.
K. Nielson
Ce travail pour moi dans google colaboratory
carlosaar22
355

Remarque sur la dépréciation:
selon le guide officiel de Matplotlib , l'utilisation du pylabmodule n'est plus recommandée. Veuillez envisager d'utiliser le matplotlib.pyplotmodule à la place, comme décrit par cette autre réponse .

Les éléments suivants semblent fonctionner:

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

Cela fait la largeur de la figure 5 pouces et sa hauteur 10 pouces .

La classe Figure l'utilise ensuite comme valeur par défaut pour l'un de ses arguments.

tatwright
la source
3
Cela fonctionne également très bien en haut d'un bloc-notes iPython, qui (étant donné --pylab = inline) a rcParams déjà importé au niveau supérieur.
nealmcb
4
Cela n'a pas fonctionné sur ma machine Windows avec une interface OO vers pyplot et backend Qt. fig.set_size_inches(18.5, 10.5, forward=True)travaillé.
Bennett Brown
2
Cette réponse est actuellement discutée sur Meta
Mischa
Pour la version Python: 3.6.4, matplotlib: 2.2.3 Je pense que vous devez passer une liste ou un tuple, par exemple rcParams ['figure.figsize'] = (5, 10)
Steve Gon
2
Quelqu'un sait pourquoi cela ne fonctionne pas lors de la première exécution de la cellule?
g07kore
314

UTILISATION de plt.rcParams

Il existe également cette solution de contournement si vous souhaitez modifier la taille sans utiliser l'environnement de la figure. Donc, si vous utilisez plt.plot()par exemple, vous pouvez définir un tuple avec largeur et hauteur.

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

Ceci est très utile lorsque vous tracez en ligne (par exemple avec IPython Notebook). Comme @asamaier l'a remarqué, il est préférable de ne pas placer cette déclaration dans la même cellule des déclarations d'importation.

Conversion en cm

Le figsizetuple accepte les pouces, donc si vous voulez le définir en centimètres, vous devez les diviser par 2,54. Consultez cette question .

GM
la source
4
Excellent! Également utile pour le définir une fois et tracer plusieurs fois.
Automorphe
Pour une raison quelconque, il semble que cela ne fonctionne plus dans le cahier Jupyter (mais qu'il le faisait).
Ray
@Ray Pouvez-vous écrire la version de votre ordinateur portable Jupyter et le comportement pour moi, cela fonctionne
GM
@GM la dernière fois que j'ai testé, c'était Jupyter version 4.3.0 et Python 3.6.2 d'Anaconda, sur Windows 10 et Google Chrome 63.0.3239.84.
Ray
8
Pour que cela fonctionne, j'ai besoin d'appeler plt.rcParams["figure.figsize"] = (20,3)dans une cellule supplémentaire. Lorsque je l'appelle dans la même cellule que l'instruction import, elle est ignorée.
asmaier
270

Veuillez essayer un code simple comme suit:

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

Vous devez définir la taille de la figure avant de tracer.

iPAS
la source
14
Cette réponse me dit que c'est m atplotlib.pyplot.figure, ce que les autres ne disent pas aussi clairement. Je continue d'essayer des choses comme matplotlib.figureetmatplotlib.figure.Figure
Lyndon White
"_tkinter.TclError: pas assez de mémoire libre pour le tampon d'image"
Cerin
6
plt.figure(figsize=(1,1))est le mouvement crucial. Je vous remercie.
ximiki
Dans le cahier jupyter, cela a fonctionné pour moi: plt.figure (figsize = (20,10))
Abhishek Poojary
Pour ceux qui utilisent le cahier jupyter, assurez-vous que vous utilisez plt.figure (figsize = (15, 10)) avant les autres commandes plt.
Yuhang Lin
90

Si vous cherchez un moyen de modifier la taille de la figure dans Pandas , vous pouvez par exemple:

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

dfest une trame de données Pandas. Ou, pour utiliser une figure ou des axes existants

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

Si vous souhaitez modifier les paramètres par défaut, vous pouvez procéder comme suit:

import matplotlib

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

Le premier lien dans Google pour 'matplotlib figure size'est AdjustingImageSize ( cache Google de la page ).

Voici un script de test de la page ci-dessus. Il crée des test[1-3].pngfichiers de différentes tailles de la même image:

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

Production:

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

Deux notes:

  1. Les commentaires du module et la sortie réelle diffèrent.

  2. Cette réponse permet de combiner facilement les trois images dans un fichier image pour voir la différence de taille.

jfs
la source
7
Chaque fois que j'essaie de me rappeler comment le faire, je me retrouve dans ce post. Donc, c'est le code que je recherche normalement:fig = plt.figure() default_size = fig.get_size_inches() fig.set_size_inches( (default_size[0]*2, default_size[1]*2) )
y.selivonchyk
45

Vous pouvez simplement utiliser (depuis matplotlib.figure.Figure ):

fig.set_size_inches(width,height)

À partir de Matplotlib 2.0.0, les modifications apportées à votre canevas seront immédiatement visibles, car le forwardmot - clé par défaut estTrue .

Si vous souhaitez simplement modifier la largeur ou la hauteur au lieu des deux, vous pouvez utiliser

fig.set_figwidth(val) ou fig.set_figheight(val)

Ceux-ci mettront également à jour immédiatement votre toile, mais uniquement dans Matplotlib 2.2.0 et plus récent.

Pour les versions plus anciennes

Vous devez spécifier forward=Trueexplicitement afin de mettre à jour en direct votre canevas dans des versions antérieures à ce qui est spécifié ci-dessus. Notez que les fonctions set_figwidthet set_figheightne prennent pas en charge le forwardparamètre dans les versions antérieures à Matplotlib 1.5.0.

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

Vous pouvez aussi utiliser:

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

Essayez de commenter la fig = ...ligne

%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
la source
21

Cela fonctionne bien pour moi:

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

Cela pourrait également aider: http://matplotlib.1069221.n5.nabble.com/Resizing-figure-windows-td11424.html

Blairg23
la source
16

Pour augmenter la taille de votre chiffre N fois, vous devez l'insérer juste avant votre pl.show ():

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

Il fonctionne également bien avec le bloc-notes ipython.

psihodelia
la source
10

Étant donné que Matplotlib ne peut pas utiliser le système métrique en mode natif, si vous souhaitez spécifier la taille de votre figure dans une unité de longueur raisonnable telle que les centimètres, vous pouvez faire ce qui suit (code 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)

Ensuite, vous pouvez utiliser:

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

Cela redimensionne la figure immédiatement même après que la figure a été dessinée (au moins en utilisant Qt4Agg / TkAgg - mais pas MacOSX - avec matplotlib 1.4.0):

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

Généraliser et simplifier la réponse de psihodelia. Si vous souhaitez modifier la taille actuelle de la figure d'un facteursizefactor

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) 

Après avoir modifié la taille actuelle, il peut arriver que vous deviez affiner la disposition du sous-tracé . Vous pouvez le faire dans l'interface graphique de la fenêtre de figure, ou au moyen de la commande subplots_adjust

Par exemple,

plt.subplots_adjust(left=0.16, bottom=0.19, top=0.82)
aimé.par.Jésus
la source
5

Une autre option, pour utiliser la fonction rc () dans matplotlib (l'unité est en pouces)

import matplotlib
matplotlib.rc('figure', figsize=[10,5])
Étudiant222
la source
-3

Vous modifiez directement la taille de la figure en utilisant

plt.set_figsize(figure=(10, 10))
Kalyan Mohanty
la source
4
pyplotn'a pas de méthode nommée set_figsize.
Princy