Làm thế nào để bạn thay đổi kích thước của các hình vẽ bằng matplotlib?


2036

Làm thế nào để bạn thay đổi kích thước của hình vẽ bằng matplotlib?


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

307
HOẶCfig, ax = plt.subplots(figsize=(20, 10))
alexw 14/03/2016

100
Nghĩ rằng kích thước hình là bằng pixel, tôi đã chỉ định (800.600) và chương trình bị lỗi! Xin lưu ý rằng đơn vị là inch.
Raja

2
@alexw đây là tài liệu?
liang

48
fig = plt.gcf()-> fig.set_size_inches(11,8)để tránh sự nhầm lẫn một lần và mãi mãi.
Ufos

Câu trả lời:


1099

hình cho bạn biết chữ ký cuộc gọi:

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

figure(figsize=(1,1)) sẽ tạo ra một hình ảnh từng inch một, sẽ là 80 x 80 pixel trừ khi bạn cũng đưa ra một đối số dpi khác nhau.


95
Nếu bạn đã tạo được hình, hãy nói đó là 'hình 1' (đó là hình mặc định khi bạn đang sử dụng pyplot), bạn có thể sử dụng hình (num = 1, figsize = (8, 6), ...) để thay đổi kích thước của nó, v.v. Nếu bạn đang sử dụng pyplot / pylab và show()để tạo cửa sổ bật lên, bạn cần gọi figure(num=1,...) trước khi vẽ bất cứ thứ gì - pyplot / pylab tạo ra một hình ngay khi bạn vẽ một cái gì đó, và kích thước của cửa sổ bật lên xuất hiện được cố định tại thời điểm này.
drevicko

22
Tôi cảm thấy câu trả lời của bạn sẽ tốt hơn nếu bạn loại bỏ các đối số mặc định. Nó làm giảm tín hiệu đến tỷ lệ nhiễu không cần thiết.
frmsaul

3
Điều này có nghĩa là nếu bạn đặt DPI thành 1, sau đó figsize trở thành đơn vị pixel thay vì đơn vị inch? Điều này sẽ hữu ích hơn khi sử dụng matplotlib trên giao diện web và GUI.
CMCDragonkai

1
với figsize (1,1) bạn sẽ có tỷ lệ trong ảnh là 1: 1? bởi vì tất cả các biểu đồ hình tròn của tôi đều hiển thị hình bầu dục và cách duy nhất tôi tìm thấy để làm cho chúng tròn là sử dụng cốt truyện.axis ("bằng"). họ sẽ có tác dụng tương tự hay họ cư xử khác nhau?
Breno Baiardi

2
@BrenoBaiardi Câu hỏi này là về kích thước con số. Các trục trên đỉnh của hình vẫn có thể có tỷ lệ khung hình không bằng nhau ngay cả khi toàn bộ hình là 1: 1 và ngay cả khi hộp trục là 1: 1, dữ liệu có thể được chia tỷ lệ khác nhau theo hướng x và y. Vì vậy, không, lệnh đó sẽ không đảm bảo tỷ lệ khung hình bằng nhau.
Jouni K. Seppänen

741

Nếu bạn đã có con số được tạo, bạn có thể nhanh chóng làm điều này:

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

Để tuyên truyền thay đổi kích thước cho một cửa sổ gui hiện có thêm forward=True

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

3
Đã giải quyết cho tôi một vấn đề với imshow, bây giờ tôi đang sử dụng mã này ngay sau khi loại bỏ khoảng trống xung quanh khu vực vẽ plt.subplots_adjust(left=0.0, right=1.0, bottom=0.0, top=1.0).
heltonbiker

7
Tương tự, bạn có thể chạy fig.set_dpi(100).
Erik Shilts

1
Tôi đang sử dụng tính năng này trên OS X theo ipython 3.7, matplotlib 3.0.3. Tôi có thể điều chỉnh kích thước hình, nhưng cửa sổ không thay đổi kích thước (khung hình điều chỉnh, nhưng cửa sổ không phát triển hoặc co lại để phù hợp với khung vẽ). Đối số từ khóa chuyển tiếp = True dường như không có tác dụng dự định trên nền tảng này.
K. Nielson

Công việc này đối với tôi trong google
colaboratory

355

Lưu ý khấu hao:
Theo hướng dẫn chính thức của Matplotlib , việc sử dụng pylabmô-đun không còn được khuyến nghị. Vui lòng xem xét sử dụng matplotlib.pyplotmô-đun thay thế, như được mô tả bởi câu trả lời khác này .

Sau đây có vẻ hoạt động:

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

Điều này làm cho chiều rộng của hình là 5 inch và chiều cao của nó là 10 inch .

Lớp Hình sau đó sử dụng giá trị này làm giá trị mặc định cho một trong các đối số của nó.


3
Điều này cũng hoạt động độc đáo ở đầu một máy tính xách tay iPython, mà (được đưa ra --pylab = nội tuyến) có RCParams đã được nhập ở cấp cao nhất.
nealmcb

4
Điều này không hoạt động trên máy Windows của tôi với giao diện OO cho phụ trợ pyplot và Qt. fig.set_size_inches(18.5, 10.5, forward=True)đã làm việc.
Bennett Brown

2
Câu trả lời này hiện đang được thảo luận trên Meta
Mischa

Đối với phiên bản Python: 3.6.4, matplotlib: 2.2.3 Tôi nghĩ rằng bạn cần phải vượt qua một danh sách hoặc tuple, ví dụ: RCParams ['hình.figsize'] = (5, 10)
Steve Gon

2
Bất cứ ai cũng biết tại sao lần đầu tiên nó không hoạt động?
g07kore

314

SỬ DỤNG plt.rcParams

Ngoài ra còn có cách giải quyết này trong trường hợp bạn muốn thay đổi kích thước mà không sử dụng môi trường hình. Vì vậy, trong trường hợp bạn đang sử dụng plt.plot()chẳng hạn, bạn có thể đặt một bộ dữ liệu có chiều rộng và chiều cao.

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

Điều này rất hữu ích khi bạn vẽ đồ thị nội tuyến (ví dụ với IPython Notebook). Như @asamaier nhận thấy tốt hơn là không đặt câu lệnh này trong cùng một ô của câu lệnh nhập khẩu.

Chuyển đổi sang cm

Bộ figsizetuple chấp nhận inch, vì vậy nếu bạn muốn đặt nó theo centimet, bạn phải chia chúng cho 2,54, hãy xem câu hỏi này .


4
Thông minh! Cũng hữu ích để thiết lập nó một lần và âm mưu nhiều lần.
tự động hóa

Vì một số lý do, có vẻ như điều này không còn hoạt động trong máy tính xách tay Jupyter (nhưng đã từng).
Ray

@Ray Bạn có thể viết phiên bản của máy tính xách tay Jupyter của bạn không và hành vi đối với tôi nó hoạt động
GM

@GM lần trước tôi đã thử nghiệm, đó là phiên bản Jupyter 4.3.0 và Python 3.6.2 từ Anaconda, trên Windows 10 và Google Chrome 63.0.3239.84.
Ray

8
Để làm cho nó hoạt động tôi cần phải gọi plt.rcParams["figure.figsize"] = (20,3)trong một tế bào phụ. Khi tôi gọi nó trong cùng một ô với câu lệnh nhập, nó sẽ bị bỏ qua.
asmaier

269

Vui lòng thử một mã đơn giản như sau:

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

Bạn cần đặt kích thước hình trước khi vẽ.


14
Câu trả lời này cho tôi biết rằng đó là m atplotlib.pyplot.figure, mà những người khác không nói rõ ràng. Tôi tiếp tục thử những thứ như matplotlib.figurematplotlib.figure.Figure
Lyndon White

"_Tkinter.TclError: không đủ bộ nhớ trống cho bộ đệm hình ảnh"
Cerin

5
plt.figure(figsize=(1,1))là mấu chốt di chuyển. Cảm ơn bạn.
ximiki

Trong máy tính xách tay jupyter, điều này làm việc cho tôi: plt.figure (figsize = (20,10))
Abhishek Poojary

Đối với những người sử dụng máy tính xách tay jupyter, vui lòng đảm bảo rằng bạn đang sử dụng plt.figure (figsize = (15, 10)) trước các lệnh plt khác.
Yuhang Lin

90

Trong trường hợp bạn đang tìm cách thay đổi kích thước hình trong Pandas , bạn có thể làm, ví dụ:

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

nơi dflà một dataframe Pandas. Hoặc, để sử dụng hình hoặc trục hiện có

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

Nếu bạn muốn thay đổi cài đặt mặc định, bạn có thể làm như sau:

import matplotlib

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

73

Liên kết đầu tiên trong Google cho 'matplotlib figure size'Điều chỉnh kích thước ( bộ đệm Google của trang ).

Đây là một kịch bản thử nghiệm từ trang trên. Nó tạo test[1-3].pngcác tệp có kích thước khác nhau của cùng một hình ảnh:

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

Đầu ra:

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

Hai lưu ý:

  1. Các ý kiến ​​mô-đun và đầu ra thực tế khác nhau.

  2. Câu trả lời này cho phép dễ dàng kết hợp cả ba hình ảnh trong một tệp hình ảnh để thấy sự khác biệt về kích thước.


7
Mỗi lần tôi cố gắng nhớ lại cách làm, tôi kết thúc bài viết này. Vì vậy, đây là mã tôi thường tìm:fig = plt.figure() default_size = fig.get_size_inches() fig.set_size_inches( (default_size[0]*2, default_size[1]*2) )
y.selivonchyk

45

Bạn chỉ có thể sử dụng (từ matplotlib.figure.Figure ):

fig.set_size_inches(width,height)

Kể từ Matplotlib 2.0.0, các thay đổi đối với khung vẽ của bạn sẽ hiển thị ngay lập tức, khi forwardtừ khóa mặc địnhTrue .

Nếu bạn muốn chỉ thay đổi chiều rộng hoặc chiều cao thay vì cả hai, bạn có thể sử dụng

fig.set_figwidth(val) hoặc là fig.set_figheight(val)

Chúng cũng sẽ ngay lập tức cập nhật canvas của bạn, nhưng chỉ trong Matplotlib 2.2.0 trở lên.

Dành cho phiên bản cũ hơn

Bạn cần chỉ định forward=Truerõ ràng để cập nhật trực tiếp khung vẽ của bạn trong các phiên bản cũ hơn những gì được chỉ định ở trên. Lưu ý rằng set_figwidthvà các set_figheightchức năng không hỗ trợ forwardtham số trong các phiên bản cũ hơn 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()

Bạn cũng có thể dùng:

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

31

Hãy thử cho ý kiến ra fig = ...đường

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

21

Công việc này tốt cho tôi:

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

Điều này cũng có thể giúp: http://matplotlib.1069221.n5.nabble.com/Resizing-figure-windows-td11424.html


16

Để tăng kích thước của hình của bạn N lần, bạn cần chèn cái này ngay trước pl.show ():

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

Nó cũng hoạt động tốt với máy tính xách tay ipython.


10

Vì Matplotlib không thể sử dụng hệ thống số liệu một cách tự nhiên, nếu bạn muốn chỉ định kích thước của hình của mình theo một đơn vị chiều dài hợp lý như centimet, bạn có thể thực hiện các thao tác sau (mã từ 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)

Sau đó, bạn có thể sử dụng:

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

8

Điều này thay đổi kích thước con số ngay lập tức ngay cả sau khi con số được rút ra (ít nhất là sử dụng Qt4Agg / TkAgg - nhưng không phải MacOSX - với matplotlib 1.4.0):

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

7

Tổng quát hóa và đơn giản hóa câu trả lời của psihodelia. Nếu bạn muốn thay đổi kích thước hiện tại của hình theo một yếu tốsizefactor

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) 

Sau khi thay đổi kích thước hiện tại, có thể bạn phải tinh chỉnh bố cục của ô phụ . Bạn có thể làm điều đó trong GUI của cửa sổ hình hoặc bằng lệnh subplots_adjust

Ví dụ,

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

5

Một tùy chọn khác, để sử dụng hàm RC () trong matplotlib (đơn vị là inch)

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

-3

Bạn trực tiếp thay đổi kích thước hình bằng cách sử dụng

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

4
pyplotkhông có bất kỳ phương pháp nào được đặt tên set_figsize.
Princy
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.