Bagaimana Anda mengubah ukuran angka yang digambar dengan matplotlib?

2037

Bagaimana Anda mengubah ukuran gambar yang digambar dengan matplotlib?

tatwright
sumber
742
plt.figure(figsize=(20,10))
StackG
307
ATAUfig, ax = plt.subplots(figsize=(20, 10))
alexw
100
Berpikir bahwa ukuran gambar dalam piksel, saya tentukan (800.600) dan program macet! Harap dicatat bahwa unit ini inci.
Raja
2
@ alexw apakah ini dalam dokumentasi?
liang
48
fig = plt.gcf()-> fig.set_size_inches(11,8)untuk menghindari kebingungan sekali dan untuk semua.
Ufos

Jawaban:

1099

gambar memberi tahu Anda tanda tangan panggilan:

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

figure(figsize=(1,1)) akan membuat gambar inci-demi-inci, yang akan menjadi 80-oleh-80 piksel kecuali Anda juga memberikan argumen dpi berbeda.

Jouni K. Seppänen
sumber
95
Jika Anda sudah mendapatkan gambar yang dibuat, katakan itu 'angka 1' (itu yang default ketika Anda menggunakan pyplot), Anda dapat menggunakan angka (num = 1, figsize = (8, 6), ...) untuk mengubah ukurannya, dll. Jika Anda menggunakan pyplot / pylab dan show()untuk membuat jendela popup, Anda perlu menelepon figure(num=1,...) sebelum merencanakan apa pun - pyplot / pylab membuat angka segera setelah Anda menggambar sesuatu, dan ukuran popup muncul diperbaiki pada saat ini.
drevicko
22
Saya merasa jawaban Anda akan lebih baik jika Anda menghapus argumen default. Ini mengurangi rasio sinyal ke noise yang tidak perlu.
frmsaul
3
Apakah ini berarti jika Anda mengatur DPI ke 1, maka figsize menjadi satuan piksel dan bukan satuan inci? Ini akan lebih berguna ketika menggunakan matplotlib di antarmuka web dan GUI.
CMCDragonkai
1
dengan figsize (1,1) Anda akan memiliki rasio dalam gambar sebagai 1: 1? karena semua diagram lingkaran saya menunjukkan oval, dan satu-satunya cara yang saya temukan untuk membuatnya bulat adalah dengan menggunakan plot.axis ("sama dengan"). mereka akan memiliki efek yang sama atau mereka berperilaku berbeda?
Breno Baiardi
2
@BrenoBaiardi Pertanyaan ini adalah tentang ukuran gambar. Sumbu di atas gambar mungkin masih memiliki rasio aspek yang tidak sama bahkan jika angka secara keseluruhan adalah 1: 1, dan bahkan jika kotak sumbu 1: 1, data dapat diskalakan berbeda dalam arah x dan y. Jadi, tidak, perintah itu tidak akan menjamin rasio aspek yang sama.
Jouni K. Seppänen
741

Jika Anda telah membuat gambar, Anda dapat dengan cepat melakukan ini:

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

Untuk menyebarkan perubahan ukuran ke jendela gui yang ada tambahkan forward=True

fig.set_size_inches(18.5, 10.5, forward=True)
Pete
sumber
3
Memecahkan masalah bagi saya imshow, sekarang saya menggunakan kode ini setelah menghilangkan ruang di sekitar area plot plt.subplots_adjust(left=0.0, right=1.0, bottom=0.0, top=1.0).
heltonbiker
7
Demikian pula, Anda bisa berlari fig.set_dpi(100).
Erik Shilts
1
Saya menggunakan ini pada OS X di bawah ipython 3.7, matplotlib 3.0.3. Saya dapat menyesuaikan ukuran gambar, tetapi jendela tidak mengubah ukuran (kanvas gambar menyesuaikan, tetapi jendela tidak tumbuh atau menyusut untuk mengakomodasi kanvas). Maju = Argumen kata kunci sejati tampaknya tidak memiliki efek yang dimaksudkan pada platform ini.
K. Nielson
Ini bekerja untuk saya di google colaboratory
carlosaar22
355

Catatan penghentian :
Sesuai dengan panduan resmi Matplotlib , penggunaan pylabmodul tidak lagi direkomendasikan. Silakan pertimbangkan menggunakan matplotlib.pyplotmodul sebagai gantinya, seperti yang dijelaskan oleh jawaban lain ini .

Tampaknya ini berfungsi:

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

Ini membuat lebar gambar 5 inci, dan tingginya 10 inci .

Kelas Gambar kemudian menggunakan ini sebagai nilai default untuk salah satu argumennya.

tatwright
sumber
3
Ini juga berfungsi dengan baik di bagian atas notebook iPython, yang (diberi --pylab = inline) memiliki rcParams yang sudah diimpor di tingkat atas.
nealmcb
4
Ini tidak berfungsi pada mesin Windows saya dengan antarmuka OO ke pyplot dan Qt backend. fig.set_size_inches(18.5, 10.5, forward=True)bekerja.
Bennett Brown
2
Jawaban ini sedang dibahas di Meta
Mischa
Untuk versi Python: 3.6.4, matplotlib: 2.2.3 Saya pikir Anda perlu memberikan daftar atau tuple misalnya rcParams ['figure.figsize'] = (5, 10)
Steve Gon
2
Adakah yang tahu mengapa ini tidak berhasil saat pertama kali menjalankan sel?
g07kore
314

MENGGUNAKAN plt.rcParams

Ada juga solusi ini jika Anda ingin mengubah ukuran tanpa menggunakan lingkungan gambar. Jadi jika Anda menggunakan plt.plot()misalnya, Anda dapat mengatur tuple dengan lebar dan tinggi.

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

Ini sangat berguna saat Anda memplot inline (mis. Dengan IPython Notebook). Seperti yang diperhatikan @asamaier, lebih baik tidak menaruh pernyataan ini di sel yang sama dengan pernyataan impor.

Konversi ke cm

The figsizetuple menerima inci jadi jika Anda ingin mengaturnya dalam sentimeter Anda harus membagi mereka dengan 2,54 memiliki melihat ke pertanyaan ini .

GM
sumber
4
Luar biasa! Juga berguna untuk mengaturnya sekali dan merencanakan beberapa kali.
automorfik
Untuk beberapa alasan, tampaknya ini tidak lagi berfungsi di notebook Jupyter (tetapi dulu).
Ray
@ Ray Dapatkah Anda menulis versi buku catatan Jupyter Anda dan perilaku saya menurut saya berfungsi
GM
@ GM terakhir kali saya uji, itu adalah Jupyter versi 4.3.0 dan Python 3.6.2 dari Anaconda, pada Windows 10 dan Google Chrome 63.0.3239.84.
Ray
8
Untuk membuatnya berfungsi, saya perlu memanggil plt.rcParams["figure.figsize"] = (20,3)sel ekstra. Ketika saya menyebutnya di sel yang sama dengan pernyataan impor, itu diabaikan.
asmaier
270

Silakan coba kode sederhana sebagai berikut:

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

Anda perlu mengatur ukuran gambar sebelum Anda plot.

iPAS
sumber
14
Jawaban ini memberi tahu saya bahwa itu m atplotlib.pyplot.figure, yang orang lain tidak katakan dengan jelas. Saya terus mencoba hal-hal seperti matplotlib.figuredanmatplotlib.figure.Figure
Lyndon White
"_tkinter.TclError: memori tidak cukup untuk buffer gambar"
Cerin
6
plt.figure(figsize=(1,1))adalah langkah terpenting. Terima kasih.
ximiki
Dalam notebook jupyter, ini bekerja untuk saya: plt.figure (figsize = (20,10))
Abhishek Poojary
Bagi mereka yang menggunakan notebook jupyter, pastikan Anda menggunakan plt.figure (figsize = (15, 10)) sebelum perintah plt lainnya.
Yuhang Lin
90

Jika Anda sedang mencari cara untuk mengubah ukuran gambar di Panda , Anda dapat melakukan mis:

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

di mana dfadalah kerangka data Pandas. Atau, untuk menggunakan gambar atau sumbu yang ada

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

Jika Anda ingin mengubah pengaturan default, Anda dapat melakukan hal berikut:

import matplotlib

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

Tautan pertama di Google untuk 'matplotlib figure size'adalah AdjustingImageSize ( Google cache halaman ).

Berikut ini skrip pengujian dari halaman di atas. Ini membuat test[1-3].pngfile dengan ukuran berbeda dari gambar yang sama:

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

Keluaran:

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

Dua catatan:

  1. Komentar modul dan output aktual berbeda.

  2. Jawaban ini memungkinkan untuk dengan mudah menggabungkan ketiga gambar dalam satu file gambar untuk melihat perbedaan ukuran.

jfs
sumber
7
Setiap kali saya mencoba mengingat bagaimana melakukannya saya berakhir di posting ini. Jadi, ini adalah kode yang biasanya saya cari:fig = plt.figure() default_size = fig.get_size_inches() fig.set_size_inches( (default_size[0]*2, default_size[1]*2) )
y.selivonchyk
45

Anda cukup menggunakan (dari matplotlib.figure.Figure ):

fig.set_size_inches(width,height)

Pada Matplotlib 2.0.0, perubahan pada kanvas Anda akan segera terlihat, sebagai forwardkata kunci default untukTrue .

Jika Anda hanya ingin mengubah lebar atau tinggi alih-alih keduanya, Anda bisa menggunakannya

fig.set_figwidth(val) atau fig.set_figheight(val)

Ini juga akan segera memperbarui kanvas Anda, tetapi hanya di Matplotlib 2.2.0 dan yang lebih baru.

Untuk Versi Lama

Anda harus menentukan forward=Truesecara eksplisit untuk memperbarui kanvas Anda dalam versi yang lebih lama dari yang ditentukan di atas. Perhatikan bahwa set_figwidthdan set_figheightfungsi tidak mendukung forwardparameter dalam versi yang lebih lama dari Matplotlib 1.5.0.

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

Anda juga bisa menggunakan:

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

Cobalah berkomentar di luar fig = ...garis

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

Ini bekerja dengan baik untuk saya:

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

Ini juga dapat membantu: http://matplotlib.1069221.n5.nabble.com/Resizing-figure-windows-td11424.html

Blairg23
sumber
16

Untuk menambah ukuran gambar Anda N kali Anda harus memasukkan ini tepat sebelum pl.show ():

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

Ini juga bekerja dengan baik dengan notebook ipython.

psihodelia
sumber
10

Karena Matplotlib tidak dapat menggunakan sistem metrik secara asli, jika Anda ingin menentukan ukuran gambar Anda dalam satuan panjang yang wajar seperti sentimeter, Anda dapat melakukan hal berikut (kode dari 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)

Maka Anda dapat menggunakan:

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

Ini mengubah ukuran gambar segera bahkan setelah angka telah ditarik (setidaknya menggunakan Qt4Agg / TkAgg - tetapi tidak MacOSX - dengan matplotlib 1.4.0):

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

Menyamaratakan dan menyederhanakan jawaban psihodelia. Jika Anda ingin mengubah ukuran saat ini dengan faktorsizefactor

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) 

Setelah mengubah ukuran saat ini, mungkin Anda harus menyesuaikan tata letak subplot . Anda dapat melakukannya di GUI jendela gambar, atau dengan menggunakan perintah subplots_adjust

Sebagai contoh,

plt.subplots_adjust(left=0.16, bottom=0.19, top=0.82)
dicintai.Yesus
sumber
5

Pilihan lain, untuk menggunakan fungsi rc () di matplotlib (unit ini inci)

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

Anda langsung mengubah ukuran gambar dengan menggunakan

plt.set_figsize(figure=(10, 10))
Kalyan Mohanty
sumber
4
pyplottidak memiliki metode apa pun yang dinamai set_figsize.
Princy