Jak zmienić rozmiar rysunków za pomocą matplotlib?


2034

Jak zmienić rozmiar rysunku narysowanego za pomocą matplotlib?


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

306
LUBfig, ax = plt.subplots(figsize=(20, 10))
alexw

99
Myśląc, że rozmiar figury jest wyrażony w pikselach, podałem (800,600) i program się zawiesił! Pamiętaj, że jednostka to cale.
Raja

2
@alexw czy jest to w dokumentacji?
liang

48
fig = plt.gcf()-> fig.set_size_inches(11,8)aby raz na zawsze uniknąć zamieszania.
Ufos

Odpowiedzi:


1099

rysunek pokazuje podpis połączenia:

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

figure(figsize=(1,1)) utworzyłby obraz cal po calu, który byłby 80 na 80 pikseli, chyba że podasz inny argument dpi.


95
Jeśli masz już utworzoną figurę, powiedz, że jest to „figura 1” (jest to domyślna, gdy używasz pyplot), możesz użyć figury (num = 1, figsize = (8, 6), ...) aby zmienić jego rozmiar itp. Jeśli używasz pyplot / pylab i show()tworzysz wyskakujące okienko, musisz zadzwonić figure(num=1,...) przed wykreśleniem czegokolwiek - pyplot / pylab tworzy postać, gdy tylko coś narysujesz, i pojawia się rozmiar wyskakującego okienka do ustalenia w tym momencie.
drevicko,

22
Wydaje mi się, że Twoja odpowiedź byłaby lepsza, gdybyś usunął domyślne argumenty. Niepotrzebnie zmniejsza stosunek sygnału do szumu.
frmsaul,

3
Czy to oznacza, że ​​jeśli ustawisz DPI na 1, figsize stanie się jednostką pikseli zamiast jednostki cala? Byłoby to bardziej przydatne, gdy używasz matplotlib w interfejsach WWW i GUI.
CMCDragonkai

1
z figsize (1,1) będziesz miał stosunek na obrazie jako 1: 1? ponieważ wszystkie moje wykresy kołowe są owalne, a jedynym sposobem na ich zaokrąglenie było użycie plot.axis („równa się”). miałyby ten sam efekt, czy zachowują się inaczej?
Breno Baiardi

2
@BrenoBaiardi To pytanie dotyczy wielkości figury. Osie na górze figury mogą nadal mieć nierówny współczynnik kształtu, nawet jeśli figura jako całość wynosi 1: 1, a nawet jeśli pole osi wynosi 1: 1, dane mogą być skalowane inaczej w kierunkach xiy. Więc nie, to polecenie nie gwarantuje równego współczynnika proporcji.
Jouni K. Seppänen

741

Jeśli masz już utworzoną figurę, możesz szybko to zrobić:

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

Aby propagować zmianę rozmiaru do istniejącego okna GUI, dodaj forward=True

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

3
Rozwiązałem problem z imshow, teraz używam tego kodu zaraz po wyeliminowaniu przestrzeni wokół obszaru kreślenia plt.subplots_adjust(left=0.0, right=1.0, bottom=0.0, top=1.0).
heltonbiker

7
Podobnie możesz biegać fig.set_dpi(100).
Erik Shilts

1
Używam tego na OS X w ipython 3.7, matplotlib 3.0.3. Jestem w stanie dostosować rozmiar figury, ale okno nie zmienia rozmiaru (płótno figury dostosowuje się, ale okno nie powiększa się ani nie kurczy, aby pomieścić płótno). Wydaje się, że argument słowa kluczowego forward = True nie ma zamierzonego wpływu na tę platformę.
K. Nielson,

Ta praca dla mnie w google colaboratory
carlosaar22

354

Uwaga dotycząca wycofania:
Zgodnie z oficjalnym przewodnikiem Matplotlib korzystanie z pylabmodułu nie jest już zalecane. Zastanów się nad użyciem matplotlib.pyplotmodułu, jak opisano w tej innej odpowiedzi .

Wydaje się, że działają:

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

To sprawia, że ​​szerokość figury wynosi 5 cali, a jej wysokość 10 cali .

Klasa Figure wykorzystuje tę wartość jako domyślną dla jednego z argumentów.


3
Działa to również ładnie na górze notebooka iPython, który (biorąc pod uwagę --pylab = inline) ma już zaimportowane rcParams na najwyższym poziomie.
nealmcb,

4
Nie działało to na moim komputerze z systemem Windows z interfejsem OO do pyplot i backendu Qt. fig.set_size_inches(18.5, 10.5, forward=True)pracował
Bennett Brown,

2
Ta odpowiedź jest obecnie dyskutowana na Meta
Mischa,

Dla wersji Python: 3.6.4, matplotlib: 2.2.3 Myślę, że musisz przekazać listę lub krotkę, np. RcParams ['figure.figsize'] = (5, 10)
Steve Gon

2
Czy ktoś wie, dlaczego to nie działa przy pierwszym uruchomieniu komórki?
g07kore

314

UŻYWANIE plt.rcParams

Jest to również obejście na wypadek, gdybyś chciał zmienić rozmiar bez korzystania ze środowiska rysunkowego. Tak więc w przypadku używasz plt.plot()na przykład, można ustawić krotki z szerokości i wysokości.

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

Jest to bardzo przydatne, gdy drukujesz w tekście (np. Z IPython Notebook). Jak zauważył @asamaier, lepiej nie umieszczać tego oświadczenia w tej samej komórce, co oświadczenia dotyczące importu.

Konwersja na cm

figsizeKrotka akceptuje cali więc jeśli chcesz, aby ustawić go w centymetrach trzeba podzielić je przez 2,54 rzucić okiem na to pytanie .


4
Świetny! Przydatny także do jednorazowego ustawienia i wielokrotnego drukowania.
automorficzny

Z jakiegoś powodu wydaje się, że to już nie działa w notatniku Jupyter (ale kiedyś).
Ray

@Ray Czy możesz napisać wersję swojego notesu Jupyter i zachowanie dla mnie to działa
GM

@GM ostatnim razem, gdy testowałem, był to Jupyter w wersji 4.3.0 i Python 3.6.2 z Anacondy na Windows 10 i Google Chrome 63.0.3239.84.
Ray

8
Aby zadziałało, muszę zadzwonić plt.rcParams["figure.figsize"] = (20,3)do dodatkowej komórki. Gdy wywołam go w tej samej komórce, co instrukcja importu, zostanie zignorowany.
asmaier

269

Wypróbuj prosty kod w następujący sposób:

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

Musisz ustawić rozmiar figury przed wydrukowaniem.


14
Ta odpowiedź mówi mi, że to m atplotlib.pyplot.figure, czego inni nie mówią tak jasno. Próbuję takich rzeczy jak matplotlib.figureimatplotlib.figure.Figure
Lyndon White,

„_tkinter.TclError: za mało wolnej pamięci dla bufora obrazu”
Cerin

5
plt.figure(figsize=(1,1))jest najważniejszym ruchem. Dziękuję Ci.
ximiki,

W notatniku jupyter zadziałało to dla mnie: plt.figure (figsize = (20,10))
Abhishek Poojary

Dla tych, którzy używają notatnika jupyter, upewnij się, że używasz plt.figure (figsize = (15, 10)) przed innymi poleceniami plt.
Yuhang Lin,

90

Jeśli szukasz sposobu na zmianę wielkości figury w Pandach , możesz na przykład:

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

gdzie dfjest ramka danych Pandas. Lub użyć istniejącej figury lub osi

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

Jeśli chcesz zmienić ustawienia domyślne, możesz wykonać następujące czynności:

import matplotlib

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

73

Pierwszy link w Google dla 'matplotlib figure size'to AdjustingImageSize ( pamięć podręczna Google strony ).

Oto skrypt testowy z powyższej strony. Tworzy test[1-3].pngpliki o różnych rozmiarach tego samego obrazu:

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

Wynik:

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

Dwie notatki:

  1. Komentarze modułu i rzeczywista wydajność różnią się.

  2. Ta odpowiedź pozwala łatwo połączyć wszystkie trzy obrazy w jednym pliku obrazu, aby zobaczyć różnicę rozmiarów.


7
Za każdym razem, gdy próbuję sobie przypomnieć, jak to zrobić, kończę w tym poście. fig = plt.figure() default_size = fig.get_size_inches() fig.set_size_inches( (default_size[0]*2, default_size[1]*2) )
Oto

45

Możesz po prostu użyć (z matplotlib.figure.Figure ):

fig.set_size_inches(width,height)

Począwszy od Matplotlib 2.0.0 zmiany w obszarze roboczym będą widoczne natychmiast, ponieważ forwardsłowo kluczowe jest domyślnie ustawione naTrue .

Jeśli chcesz zmienić szerokość lub wysokość zamiast obu, możesz użyć

fig.set_figwidth(val) lub fig.set_figheight(val)

Będą one również natychmiast aktualizować twoje płótno, ale tylko w Matplotlib 2.2.0 i nowszych.

Dla starszych wersji

Musisz forward=Truejawnie określić, aby na żywo aktualizować swoje płótno w wersjach starszych niż podane powyżej. Należy pamiętać, że set_figwidthi set_figheightfunkcje nie obsługują forwardparametru w wersjach starszych niż 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()

Możesz także użyć:

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

31

Spróbuj skomentować fig = ...linię

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


16

Aby zwiększyć rozmiar twojej figury N razy, musisz wstawić ją tuż przed pl.show ():

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

Działa również dobrze z notebookiem ipython.


10

Ponieważ Matplotlib nie jest w stanie używać systemu metrycznego natywnie, jeśli chcesz określić rozmiar swojej postaci w rozsądnej jednostce długości, takiej jak centymetry, możesz wykonać następujące czynności (kod z 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)

Następnie możesz użyć:

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

8

Spowoduje to zmianę rozmiaru figury natychmiast po jej narysowaniu (przynajmniej przy użyciu Qt4Agg / TkAgg - ale nie MacOSX - z matplotlib 1.4.0):

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

7

Uogólnienie i uproszczenie odpowiedzi psihodelii. Jeśli chcesz zmienić aktualny rozmiar figury współczynniksizefactor

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) 

Po zmianie bieżącego rozmiaru może się zdarzyć, że konieczne będzie dostrojenie układu podplotu . Możesz to zrobić w graficznym oknie graficznym lub za pomocą polecenia subplots_adjust

Na przykład,

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

5

Inna opcja, aby użyć funkcji rc () w matplotlib (jednostka to cal)

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

-3

Możesz bezpośrednio zmienić rozmiar figury za pomocą

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

4
pyplotnie ma żadnej metody o nazwie set_figsize.
Princy
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.