Trong Matplotlib, đối số có nghĩa gì trong fig.add_subplot (111)?


472

Đôi khi tôi bắt gặp mã như thế này:

import matplotlib.pyplot as plt
x = [1, 2, 3, 4, 5]
y = [1, 4, 9, 16, 25]
fig = plt.figure()
fig.add_subplot(111)
plt.scatter(x, y)
plt.show()

Sản xuất:

Biểu đồ ví dụ được tạo bởi mã bao gồm

Tôi đã đọc tài liệu như điên nhưng tôi không thể tìm thấy lời giải thích cho 111. đôi khi tôi thấy a 212.

Các đối số fig.add_subplot()có nghĩa là gì?

Câu trả lời:


470

Đây là các tham số lưới subplot được mã hóa dưới dạng một số nguyên. Ví dụ: "111" có nghĩa là "lưới 1x1, ô phụ đầu tiên" và "234" có nghĩa là "lưới 2x3, ô phụ thứ 4".

Hình thức thay thế cho add_subplot(111)add_subplot(1, 1, 1).


18
Có tài liệu chi tiết về điều này? Sự khác biệt giữa lưới 1x1 và lưới 2x3 trong bối cảnh này là gì?
donatello

19
Lưới 1x1 = 1 hàng, 1 cột. Lưới 2x3 = 2 hàng, 3 cột. Số thứ ba bắt đầu từ 1 và tăng hàng đầu tiên. Xem tài liệu của subplot () để biết thêm.
Christian Alis

18
Như những người khác đã giải thích (hơn hai năm trước), đây là một di sản từ matlab. Nhưng vì lợi ích của độc giả trong tương lai, bạn nên biết rằng tồn tại một sự thay thế tốt hơn, dưới dạng subplots()phương pháp.
jarondl

26
Tài liệu về di sản subplot()ở đâysubplots()đây .
crayzeewulf

511

Tôi nghĩ rằng điều này sẽ được giải thích tốt nhất bằng hình ảnh sau đây:

nhập mô tả hình ảnh ở đây

Để khởi tạo ở trên, người ta sẽ gõ:

import matplotlib.pyplot as plt
fig = plt.figure()
fig.add_subplot(221)   #top left
fig.add_subplot(222)   #top right
fig.add_subplot(223)   #bottom left
fig.add_subplot(224)   #bottom right 
plt.show()

19
Tôi nghĩ rằng phiên bản có dấu phẩy trực quan và dễ đọc hơn nhiều so với phiên bản có số có 3 chữ số
endolith

Điều này thật tuyệt vời cho thấy làm thế nào để "định vị các ô con trong lưới" là lưới 2x2 như ví dụ minh họa ở trên hoặc một lưới các đồ thị 4 x 4, v.v. Nhưng ai đó có thể giải thích điều gì xác định kích thước của các biểu đồ được hiển thị. Mặc định cho (2,2,1) Tôi thấy khá nhỏ tôi muốn nó có thể gấp đôi kích thước đó hoặc hơn.
yoshiserry

7
Điều này khá hữu ích. Bức ảnh này sẽ đẹp hơn một chút nếu nó không vuông (2x2) nhưng nếu không thì rất hữu ích.
TravisJ

@TravisJ Wow, thật trùng hợp! Tôi đã suy nghĩ chính xác điều tương tự khoảng một giờ trước khi bạn viết điều đó! Tôi sẽ thay đổi sớm :)
SaiyanGirl 6/03/2015

7
Câu trả lời rất hữu ích! Mặc dù tôi nghĩ rằng chỉnh sửa là không chính xác. Hành vi mở rộng các ô con với các câu lệnh như 1: 2 hoặc [1 3] không được Matplotlib hỗ trợ (ít nhất là không ở trong 1.5.0) và dường như chỉ là Matlab. (Lưu ý rằng có các tùy chọn khác trong Matplotlib để đạt được hành vi này, ví dụ: gridspec )
phòng thí nghiệm

39

Câu trả lời từ Constantin là tại chỗ nhưng để có thêm thông tin, hành vi này được kế thừa từ Matlab.

Hành vi Matlab được giải thích trong phần Thiết lập hình - Hiển thị nhiều ô trên mỗi hình của tài liệu Matlab.

subplot (m, n, i) phá vỡ cửa sổ hình thành một ma trận m-by-n của các ô con nhỏ và chọn subplot ithe cho âm mưu hiện tại. Các ô được đánh số dọc theo hàng trên cùng của cửa sổ hình, sau đó là hàng thứ hai, v.v.


2
Đây là matplotlib, không phải matlab.
dom0

45
Phần lớn hành vi của matplotlib được thừa hưởng từ Matlab. Vì tài liệu Matlab tốt hơn nên tôi nghĩ nó có thể giúp giải thích cách gọi chức năng cụ thể này. Vâng, bạn là chính xác, điều này (câu hỏi) liên quan đến matplotlib. Theo tôi, tài liệu subplot matplotlib ít rõ ràng hơn.
DaveTM

7
Tài liệu MATLAB đã được chuyển .
dotancohen

20

Giải pháp của tôi là

fig = plt.figure()
fig.add_subplot(1, 2, 1)   #top and bottom left
fig.add_subplot(2, 2, 2)   #top right
fig.add_subplot(2, 2, 4)   #bottom right 
plt.show()

Lưới 2x2 với hợp nhất 1 và 3


15

nhập mô tả hình ảnh ở đây

import matplotlib.pyplot as plt
plt.figure(figsize=(8,8))
plt.subplot(3,2,1)
plt.subplot(3,2,3)
plt.subplot(3,2,5)
plt.subplot(2,2,2)
plt.subplot(2,2,4)

Mã đầu tiên tạo ra ô phụ đầu tiên trong bố cục có 3 hàng và 2 cột.

Ba biểu đồ trong cột đầu tiên biểu thị 3 hàng. Cốt truyện thứ hai xuất hiện ngay dưới âm mưu đầu tiên trong cùng một cột và cứ thế.

Hai ô cuối cùng có các đối số (2, 2)biểu thị rằng cột thứ hai chỉ có hai hàng, các tham số vị trí di chuyển hàng khôn ngoan.


10

fig.add_subplot(ROW,COLUMN,POSITION)

  • ROW = số lượng hàng
  • COLUMN = số cột
  • VỊ TRÍ = vị trí của đồ thị bạn đang vẽ

Ví dụ

`fig.add_subplot(111)` #There is only one subplot or graph  
`fig.add_subplot(211)`  *and*  `fig.add_subplot(212)` 

Có tổng số 2 hàng, 1 cột do đó có thể vẽ 2 sơ đồ con. Vị trí của nó là 1. Có tổng số 2 hàng, 1 cột do đó có thể vẽ 2 sơ đồ con. Vị trí của nó là thứ 2


2

Phương thức add_subplot () có một số chữ ký cuộc gọi:

  1. add_subplot(nrows, ncols, index, **kwargs)
  2. add_subplot(pos, **kwargs)
  3. add_subplot(ax)
  4. add_subplot() <- kể từ 3.1.0

Gọi 1 và 2:

Các cuộc gọi 1 và 2 đạt được điều tương tự như nhau (tối đa đến giới hạn, được giải thích bên dưới). Hãy nghĩ về chúng như lần đầu tiên chỉ định bố cục lưới với 2 số đầu tiên của chúng (2x2, 1x8, 3x4, v.v.), ví dụ:

f.add_subplot(3,4,1) 
# is equivalent to:
f.add_subplot(341)

Cả hai đều tạo ra sự sắp xếp các ô con của (3 x 4 = 12) các ô con trong 3 hàng và 4 cột. Số thứ ba trong mỗi cuộc gọi cho biết đối tượng trục nào sẽ trả về, bắt đầu từ 1 ở trên cùng bên trái, tăng dần sang phải .

Mã này minh họa các hạn chế của việc sử dụng cuộc gọi 2:

#!/usr/bin/env python3
import matplotlib.pyplot as plt

def plot_and_text(axis, text):
  '''Simple function to add a straight line
  and text to an axis object'''
  axis.plot([0,1],[0,1])
  axis.text(0.02, 0.9, text)

f = plt.figure()
f2 = plt.figure()

_max = 12
for i in range(_max):
  axis = f.add_subplot(3,4,i+1, fc=(0,0,0,i/(_max*2)), xticks=[], yticks=[])
  plot_and_text(axis,chr(i+97) + ') ' + '3,4,' +str(i+1))

  # If this check isn't in place, a 
  # ValueError: num must be 1 <= num <= 15, not 0 is raised
  if i < 9:
    axis = f2.add_subplot(341+i, fc=(0,0,0,i/(_max*2)), xticks=[], yticks=[])
    plot_and_text(axis,chr(i+97) + ') ' + str(341+i))

f.tight_layout()
f2.tight_layout()
plt.show()

các ô phụ

Bạn có thể thấy với cuộc gọi 1 trên LHS, bạn có thể trả về bất kỳ đối tượng trục nào, tuy nhiên với cuộc gọi 2 trên RHS, bạn chỉ có thể quay lại chỉ mục = 9 kết xuất các biểu đồ con j), k) và l) không thể truy cập bằng cách sử dụng cuộc gọi này.

Tức là nó minh họa điểm này từ tài liệu:

pos là một số nguyên có ba chữ số, trong đó chữ số đầu tiên là số hàng, số thứ hai là số cột và thứ ba là chỉ số của ô phụ. tức là fig.add_subplot (235) giống như fig.add_subplot (2, 3, 5). Lưu ý rằng tất cả các số nguyên phải nhỏ hơn 10 để biểu mẫu này hoạt động .


Gọi 3

Trong các trường hợp hiếm hoi, add_subplot có thể được gọi với một đối số duy nhất, một đối tượng trục con phụ đã được tạo trong hình hiện tại nhưng không có trong danh sách các trục của hình.


Gọi 4 (kể từ 3.1.0):

Nếu không có đối số vị trí nào được thông qua, mặc định là (1, 1, 1).

tức là tái tạo cuộc gọi fig.add_subplot(111)trong câu hỏi.

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.