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

2034

Jak zmienić rozmiar rysunku narysowanego za pomocą matplotlib?

tatwright
źródło
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.

Jouni K. Seppänen
źródło
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)
Pete
źródło
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.

tatwright
źródło
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 .

GM
źródło
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.

iPAS
źródło
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))
Kris
źródło
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.

jfs
źródło
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.

Rzeka
źródło
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))
amalik2205
źródło
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()
Renaud
źródło
21

Działa to dla mnie dobrze:

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

Może to również pomóc: http://matplotlib.1069221.n5.nabble.com/Resizing-figure-windows-td11424.html

Blairg23
źródło
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.

psihodelia
źródło
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))
Franck Dernoncourt
źródło
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)
wilywampa
źródło
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)
Lov.by.Jezus
źródło
5

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

import matplotlib
matplotlib.rc('figure', figsize=[10,5])
Student222
źródło
-3

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

plt.set_figsize(figure=(10, 10))
Kalyan Mohanty
źródło
4
pyplotnie ma żadnej metody o nazwie set_figsize.
Princy