Wie ändert man die Größe von mit matplotlib gezeichneten Figuren?

2035

Wie ändern Sie die Größe der mit matplotlib gezeichneten Figur?

tatwright
quelle
741
plt.figure(figsize=(20,10))
StackG
307
ODERfig, ax = plt.subplots(figsize=(20, 10))
Alexw
99
Da ich dachte, dass die Figurengröße in Pixel angegeben ist, habe ich angegeben (800.600) und das Programm ist abgestürzt! Bitte beachten Sie, dass das Gerät Zoll ist.
Raja
2
@alexw ist das in der Dokumentation?
Liang
48
fig = plt.gcf()-> fig.set_size_inches(11,8)um die Verwirrung ein für alle Mal zu vermeiden.
Ufos

Antworten:

1099

Abbildung zeigt Ihnen die Anrufsignatur:

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

figure(figsize=(1,1)) würde ein Zoll-für-Zoll-Bild erstellen, das 80 x 80 Pixel groß wäre, sofern Sie nicht auch ein anderes dpi-Argument angeben.

Jouni K. Seppänen
quelle
95
Wenn Sie die Figur bereits erstellt haben, sagen Sie, es ist 'Figur 1' (das ist die Standardeinstellung, wenn Sie Pyplot verwenden), können Sie Figur verwenden (num = 1, figsize = (8, 6), ...) Um die Größe usw. zu ändern. Wenn Sie Pyplot / Pylab verwenden und show()ein Popup-Fenster erstellen, müssen Sie aufrufen, figure(num=1,...) bevor Sie etwas zeichnen. Pyplot / Pylab erstellt eine Figur, sobald Sie etwas zeichnen, und die Größe des Popups wird angezeigt an dieser Stelle fixiert werden.
Drevicko
22
Ich denke, Ihre Antwort wäre besser, wenn Sie die Standardargumente entfernen würden. Es verringert das Signal-Rausch-Verhältnis unnötig.
Frmsaul
3
Bedeutet dies, wenn Sie DPI auf 1 setzen, wird figsize zu einer Pixeleinheit anstelle einer Zolleinheit? Dies ist nützlicher, wenn Sie matplotlib auf Web- und GUI-Schnittstellen verwenden.
CMCDragonkai
1
Mit figsize (1,1) haben Sie im Bild ein Verhältnis von 1: 1? weil alle meine Kreisdiagramme oval sind und ich sie nur mit plot.axis ("equals") rund machen konnte. sie würden den gleichen Effekt haben oder sie verhalten sich anders?
Breno Baiardi
2
@BrenoBaiardi Diese Frage bezieht sich auf die Figurengröße. Die Achsen oben auf der Figur können immer noch ein ungleiches Seitenverhältnis haben, selbst wenn die Figur insgesamt 1: 1 ist, und selbst wenn das Achsenfeld 1: 1 ist, können die Daten in x- und y-Richtung unterschiedlich skaliert werden. Nein, dieser Befehl garantiert kein gleiches Seitenverhältnis.
Jouni K. Seppänen
741

Wenn Sie die Figur bereits erstellt haben, können Sie dies schnell tun:

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

Um die Größenänderung auf ein vorhandenes GUI-Fenster zu übertragen, fügen Sie hinzu forward=True

fig.set_size_inches(18.5, 10.5, forward=True)
Pete
quelle
3
Ich habe ein Problem mit imshowbehoben. Jetzt verwende ich diesen Code, nachdem ich den Platz um den Plotbereich mit beseitigt habe plt.subplots_adjust(left=0.0, right=1.0, bottom=0.0, top=1.0).
Heltonbiker
7
Ebenso können Sie ausführen fig.set_dpi(100).
Erik Shilts
1
Ich verwende dies unter OS X unter Ipython 3.7, Matplotlib 3.0.3. Ich kann die Figurengröße anpassen, aber die Größe des Fensters wird nicht geändert (die Leinwand der Figur wird angepasst, aber das Fenster wächst oder schrumpft nicht, um die Leinwand aufzunehmen). Das Schlüsselwortargument forward = True scheint auf dieser Plattform nicht die beabsichtigte Wirkung zu haben.
K. Nielson
Diese Arbeit für mich in Google
Colaboratory
355

Verfallshinweis: Gemäß
dem offiziellen Matplotlib-Handbuch wird die Verwendung des pylabModuls nicht mehr empfohlen. Bitte verwenden Sie stattdessen das matplotlib.pyplotModul, wie in dieser anderen Antwort beschrieben .

Folgendes scheint zu funktionieren:

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

Dies macht die Breite der Figur 5 Zoll und ihre Höhe 10 Zoll .

Die Figure-Klasse verwendet dies dann als Standardwert für eines ihrer Argumente.

tatwright
quelle
3
Dies funktioniert auch gut oben auf einem iPython-Notebook, in das (bei --pylab = inline) rcParams bereits auf der obersten Ebene importiert wurden.
Nealmcb
4
Dies funktionierte auf meinem Windows-Computer mit OO-Schnittstelle zu Pyplot und Qt-Backend nicht. fig.set_size_inches(18.5, 10.5, forward=True)hat funktioniert.
Bennett Brown
2
Diese Antwort wird derzeit auf Meta
Mischa
Für Python-Version: 3.6.4, matplotlib: 2.2.3 Ich denke, Sie müssen eine Liste oder ein Tupel übergeben, z. B. rcParams ['figure.figsize'] = (5, 10)
Steve Gon
2
Weiß jemand, warum dies beim ersten Ausführen der Zelle nicht funktioniert?
g07kore
314

VERWENDUNG von plt.rcParams

Es gibt auch diese Problemumgehung für den Fall, dass Sie die Größe ändern möchten, ohne die Figurenumgebung zu verwenden. Wenn Sie plt.plot()beispielsweise verwenden, können Sie ein Tupel mit Breite und Höhe festlegen.

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

Dies ist sehr nützlich, wenn Sie inline zeichnen (z. B. mit IPython Notebook). Wie @asamaier bemerkt hat, ist es vorzuziehen, diese Anweisung nicht in dieselbe Zelle der Importanweisungen zu setzen.

Umrechnung in cm

Das figsizeTupel akzeptiert Zoll. Wenn Sie es also in Zentimetern einstellen möchten, müssen Sie es durch 2,54 teilen. Schauen Sie sich diese Frage an .

GM
quelle
4
Ausgezeichnet! Auch nützlich, um es einmal einzustellen und mehrmals zu zeichnen.
automorph
Aus irgendeinem Grund scheint dies im Jupyter-Notebook nicht mehr zu funktionieren (aber früher).
Ray
@ Ray Kannst du die Version deines Jupyter-Notizbuchs schreiben und das Verhalten für mich, das es funktioniert
GM
@GM Als ich das letzte Mal getestet habe, war es Jupyter Version 4.3.0 und Python 3.6.2 von Anaconda unter Windows 10 und Google Chrome 63.0.3239.84.
Ray
8
Damit es funktioniert, muss ich plt.rcParams["figure.figsize"] = (20,3)eine zusätzliche Zelle anrufen . Wenn ich es in derselben Zelle wie die import-Anweisung aufrufe, wird es ignoriert.
Asmaier
269

Bitte versuchen Sie einen einfachen Code wie folgt:

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

Sie müssen die Figurengröße festlegen, bevor Sie zeichnen.

iPAS
quelle
14
Diese Antwort sagt mir, dass es m ist atplotlib.pyplot.figure, was die anderen nicht so klar sagen. Ich versuche immer wieder Dinge wie matplotlib.figureundmatplotlib.figure.Figure
Lyndon White
"_tkinter.TclError: nicht genügend freier Speicher für Bildpuffer"
Cerin
5
plt.figure(figsize=(1,1))ist der entscheidende Schritt. Vielen Dank.
Ximiki
In Jupyter Notebook funktionierte dies für mich: plt.figure (figsize = (20,10))
Abhishek Poojary
Wenn Sie ein Jupiter-Notebook verwenden, stellen Sie bitte sicher, dass Sie plt.figure (figsize = (15, 10)) vor anderen plt-Befehlen verwenden.
Yuhang Lin
90

Wenn Sie nach einer Möglichkeit suchen, die Figurengröße in Pandas zu ändern , können Sie z.

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

Wo dfist ein Pandas-Datenrahmen? Oder um vorhandene Figuren oder Achsen zu verwenden

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

Wenn Sie die Standardeinstellungen ändern möchten, können Sie Folgendes tun:

import matplotlib

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

Der erste Link in Google für 'matplotlib figure size'ist AdjustingImageSize ( Google-Cache der Seite ).

Hier ist ein Testskript von der obigen Seite. Es werden test[1-3].pngDateien unterschiedlicher Größe desselben Bildes erstellt:

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

Ausgabe:

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

Zwei Anmerkungen:

  1. Die Modulkommentare und die tatsächliche Ausgabe unterscheiden sich.

  2. Diese Antwort ermöglicht es einfach, alle drei Bilder in einer Bilddatei zu kombinieren, um den Größenunterschied zu erkennen.

jfs
quelle
7
Jedes Mal, wenn ich mich daran zu erinnern versuche, wie es geht, lande ich in diesem Beitrag. Also, das ist der Code, den ich normalerweise suche:fig = plt.figure() default_size = fig.get_size_inches() fig.set_size_inches( (default_size[0]*2, default_size[1]*2) )
y.selivonchyk
45

Sie können einfach verwenden (aus matplotlib.figure.Figure ):

fig.set_size_inches(width,height)

Ab Matplotlib 2.0.0 werden Änderungen an Ihrer Zeichenfläche sofort sichtbar, da das forwardSchlüsselwort standardmäßig verwendet wirdTrue .

Wenn Sie nur die Breite oder Höhe anstelle von beiden ändern möchten , können Sie verwenden

fig.set_figwidth(val) oder fig.set_figheight(val)

Diese aktualisieren auch sofort Ihre Zeichenfläche, jedoch nur in Matplotlib 2.2.0 und höher.

Für ältere Versionen

Sie müssen forward=Trueexplizit angeben, um Ihre Zeichenfläche in älteren Versionen als den oben angegebenen live zu aktualisieren. Beachten Sie, dass die Funktionen set_figwidthund set_figheightden forwardParameter in älteren Versionen als Matplotlib 1.5.0 nicht unterstützen .

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

Sie können auch verwenden:

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

Versuchen Sie, die fig = ...Zeile zu kommentieren

%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
quelle
21

Das funktioniert gut für mich:

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

Dies kann auch hilfreich sein: http://matplotlib.1069221.n5.nabble.com/Resizing-figure-windows-td11424.html

Blairg23
quelle
16

Um Ihre Figur N-mal zu vergrößern, müssen Sie dies kurz vor Ihrer pl.show () einfügen:

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

Es funktioniert auch gut mit ipython Notebook.

Psihodelia
quelle
10

Da Matplotlib nicht in der Lage ist nativ das metrische System zu verwenden, wenn Sie die Größe Ihrer Figur in einer angemessenen Längeneinheit wie Zentimeter angeben möchten, können Sie den folgenden (Code aus tun 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)

Dann können Sie verwenden:

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

Dadurch wird die Größe der Figur sofort nach dem Zeichnen der Figur geändert (zumindest unter Verwendung von Qt4Agg / TkAgg - aber nicht MacOSX - mit matplotlib 1.4.0):

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

Verallgemeinerung und Vereinfachung der Antwort von Psihodelia. Wenn Sie die aktuelle Größe der Figur um einen Faktor ändern möchtensizefactor

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) 

Nach dem Ändern der aktuellen Größe kann es vorkommen, dass Sie das Layout des Unterplots optimieren müssen . Sie können dies in der GUI des Figurenfensters oder mit dem Befehl subplots_adjust tun

Zum Beispiel,

plt.subplots_adjust(left=0.16, bottom=0.19, top=0.82)
geliebt von Jesus
quelle
5

Eine weitere Option ist die Verwendung der Funktion rc () in matplotlib (die Einheit ist Zoll).

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

Sie ändern die Figurengröße direkt mit

plt.set_figsize(figure=(10, 10))
Kalyan Mohanty
quelle
4
pyplothat keine Methode benannt set_figsize.
Princy