ใน Matplotlib อาร์กิวเมนต์หมายความว่าอะไรใน fig.add_subplot (111)


472

บางครั้งฉันเจอรหัสเช่นนี้

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

ซึ่งผลิต:

ตัวอย่างพล็อตที่ผลิตโดยรหัสรวม

ฉันอ่านเอกสารอย่างบ้าคลั่งแล้ว แต่ไม่สามารถหาคำอธิบาย111ได้ 212บางครั้งผมเห็น

อะไรคือข้อโต้แย้งของfig.add_subplot()ค่าเฉลี่ย?

คำตอบ:


470

เหล่านี้คือพารามิเตอร์กริดของพล็อตย่อยที่เข้ารหัสเป็นจำนวนเต็มเดียว ตัวอย่างเช่น "111" หมายถึง "1x1 กริด, แผนย่อยครั้งแรก" และ "234" หมายถึง "2x3 กริด, แผนย่อยที่ 4"

รูปแบบทางเลือกสำหรับการมีadd_subplot(111)add_subplot(1, 1, 1)


18
มีเอกสารรายละเอียดเกี่ยวกับเรื่องนี้หรือไม่? อะไรคือความแตกต่างระหว่าง 1x1 grid และ 2x3 grid ในบริบทนี้
donatello

19
ตาราง 1x1 = 1 แถว 1 คอลัมน์ ตาราง 2x3 = 2 แถว, 3 คอลัมน์ หมายเลขที่สามเริ่มต้นจาก 1 และเพิ่มแถวแรก ดูเอกสารประกอบของแผนย่อย () สำหรับข้อมูลเพิ่มเติม
Christian Alis

18
ดังที่คนอื่น ๆ อธิบาย (มากกว่าสองปีที่แล้ว) นี่เป็นมรดกจาก matlab แต่เพื่อประโยชน์ของผู้อ่านในอนาคตคุณควรรู้ว่ามีทางเลือกที่ดีกว่าในรูปแบบของsubplots()วิธีการ
jarondl

26
เอกสารของมรดกsubplot()คือที่นี่และsubplots()เป็นที่นี่
crayzeewulf

511

ฉันคิดว่านี่จะอธิบายได้ดีที่สุดโดยภาพต่อไปนี้:

ป้อนคำอธิบายรูปภาพที่นี่

ในการเริ่มต้นข้างต้นหนึ่งจะพิมพ์:

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
ฉันคิดว่ารุ่นที่มีเครื่องหมายจุลภาคนั้นใช้งานง่ายและอ่านได้ง่ายกว่ารุ่นที่มีตัวเลข 3 หลัก
endolith

นี่เป็นสิ่งที่ยอดเยี่ยมมากที่แสดงให้เห็นถึงวิธีการ "วางตำแหน่งย่อยในตาราง" ให้เป็นตาราง 2x2 เช่นตัวอย่างที่แสดงไว้ด้านบนหรือตารางของกราฟ 4x4 เป็นต้น แต่บางคนสามารถอธิบายสิ่งที่กำหนดขนาดของกราฟที่แสดงได้ ค่าเริ่มต้นสำหรับ (2,2,1) ฉันพบว่ามีขนาดเล็กมากฉันต้องการมันอาจเป็นสองเท่าของขนาดนั้นหรือมากกว่านั้น
yoshiserry

7
สิ่งนี้มีประโยชน์มาก รูปนี้จะดีกว่านี้ถ้ามันไม่ได้เป็นรูปสี่เหลี่ยมจัตุรัส (2x2) แต่มีประโยชน์มาก
TravisJ

@ TravisJ ว้าวช่างเป็นเรื่องบังเอิญ! ฉันกำลังคิดแบบเดียวกันแน่นอนเกี่ยวกับชั่วโมงก่อนที่คุณจะเขียนว่า! ฉันจะเปลี่ยนมันเร็ว ๆ นี้ :)
SaiyanGirl

7
คำตอบที่เป็นประโยชน์มาก! แม้ว่าฉันคิดว่าการแก้ไขนั้นไม่ถูกต้อง พฤติกรรมที่จะขยายพื้นที่ย่อยด้วยคำสั่งเช่น 1: 2 หรือ [1 3] ไม่รองรับโดย Matplotlib (อย่างน้อยไม่ได้อยู่ใน1.5.0) และดูเหมือนว่าจะเป็น Matlab เท่านั้น (โปรดทราบว่ามีตัวเลือกอื่น ๆ ใน Matplotlib เพื่อให้บรรลุพฤติกรรมเช่นgridspec )
ห้องปฏิบัติการ

39

คำตอบจากคอนสแตนตินเป็นจุดที่ แต่สำหรับพื้นหลังเพิ่มเติมพฤติกรรมนี้ได้รับมาจาก Matlab

คำอธิบายพฤติกรรมของ Matlab ในส่วนการตั้งค่ารูป - การแสดงหลายแปลงต่อรูปของเอกสารประกอบ Matlab

รูปแบบย่อย (m, n, i) แบ่งหน้าต่างรูปเป็นเมทริกซ์ m-by-n ของรูปแบบย่อยขนาดเล็กและเลือกรูปแบบย่อย ithe สำหรับพล็อตปัจจุบัน พล็อตจะถูกกำหนดหมายเลขตามแถวด้านบนของหน้าต่างรูปจากนั้นแถวที่สองและอื่น ๆ


2
นี่คือ matplotlib ไม่ใช่ matlab
dom0

45
พฤติกรรมส่วนใหญ่ของ matplotlibs นั้นสืบทอดมาจาก Matlab เนื่องจากเอกสาร Matlab ดีกว่าฉันคิดว่ามันอาจช่วยอธิบายว่าการเรียกใช้ฟังก์ชันเฉพาะนี้ทำงานอย่างไร ใช่ของคุณถูกต้องคำถามนี้เกี่ยวกับ matplotlib เอกสาร matplotlib แผนน้อยที่ชัดเจนในความคิดของฉัน
DaveTM

7
เอกสารประกอบของ MATLAB ได้ย้ายแล้ว
dotancohen

20

ทางออกของฉันคือ

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

ตาราง 2x2 พร้อมการรวม 1 และ 3


15

ป้อนคำอธิบายรูปภาพที่นี่

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)

รหัสแรกสร้างแผนย่อยแรกในโครงร่างที่มี 3 แถวและ 2 คอลัมน์

กราฟสามกราฟในคอลัมน์แรกแสดงถึง 3 แถว พล็อตที่สองนั้นอยู่ใต้พล็อตแรกในคอลัมน์เดียวกันและต่อ ๆ ไป

สองแปลงสุดท้ายมีอาร์กิวเมนต์(2, 2)แสดงว่าคอลัมน์ที่สองมีเพียงสองแถวพารามิเตอร์ตำแหน่งย้ายแถวที่ชาญฉลาด


10

fig.add_subplot(ROW,COLUMN,POSITION)

  • ROW = จำนวนแถว
  • COLUMN = จำนวนคอลัมน์
  • POSITION = ตำแหน่งของกราฟที่คุณกำลังวางแผน

ตัวอย่าง

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

มีทั้งหมด 2 แถว 1 คอลัมน์ดังนั้น 2 กราฟย่อยสามารถลงจุดได้ ที่ตั้งของมันคือที่ 1 มีทั้งหมด 2 แถว 1 คอลัมน์ดังนั้น 2 กราฟย่อยสามารถลงจุดได้ตำแหน่งของมันคือที่ 2


2

add_subplot ()วิธีการที่มีลายเซ็นโทรหลาย

  1. add_subplot(nrows, ncols, index, **kwargs)
  2. add_subplot(pos, **kwargs)
  3. add_subplot(ax)
  4. add_subplot() <- ตั้งแต่ 3.1.0

โทร 1 และ 2:

การโทร 1 และ 2 ทำสิ่งเดียวกันให้เหมือนกัน (สูงสุดถึงขีด จำกัด อธิบายด้านล่าง) คิดว่าพวกเขาเป็นคนแรกที่ระบุเค้าโครงตารางที่มี2 หมายเลขแรกของพวกเขา(2x2, 1x8, 3x4 ฯลฯ ) เช่น:

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

ทั้งสองสร้างการจัดเรียงย่อยของ (3 x 4 = 12) แผนการย่อยใน 3 แถวและ 4 คอลัมน์ ตัวเลขที่สามในการโทรแต่ละครั้งแสดงให้เห็นวัตถุที่แกนการกลับมาเริ่มต้นจาก1 ที่ด้านบนซ้ายเพิ่มขึ้นไปทางด้านขวา

รหัสนี้แสดงข้อ จำกัด ของการใช้การโทร 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()

ย่อย

คุณสามารถดูได้ด้วยการโทร 1 บน LHSคุณสามารถส่งคืนวัตถุแกนใด ๆ ได้ แต่ด้วยการโทร 2 บน RHSคุณสามารถส่งกลับได้ถึงดัชนี = 9 การแสดงผลย่อยย่อย j), k) และ l) ไม่สามารถเข้าถึงได้โดยใช้การโทรนี้

คือมันแสดงให้เห็นถึงจุดนี้จากเอกสาร:

pos เป็นจำนวนเต็มสามหลักโดยตัวเลขตัวแรกคือจำนวนแถวที่สองคือจำนวนคอลัมน์และอันดับที่สามของดัชนีย่อย ie fig.add_subplot (235) เหมือนกับ fig.add_subplot (2, 3, 5) โปรดทราบว่าจำนวนเต็มทั้งหมดต้องน้อยกว่า 10 เพื่อให้แบบฟอร์มนี้ใช้งานได้


โทร 3

ในสถานการณ์ที่หายาก add_subplot อาจถูกเรียกด้วยอาร์กิวเมนต์เดียวอินสแตนซ์แกนย่อยของพล็อตที่สร้างขึ้นแล้วในรูปปัจจุบัน แต่ไม่อยู่ในรายการของแกน


โทร 4 (ตั้งแต่ 3.1.0):

หากไม่มีการส่งผ่านข้อโต้แย้งตำแหน่งให้ใช้ค่าเริ่มต้นเป็น (1, 1, 1)

เช่นการทำซ้ำการโทรfig.add_subplot(111)ในคำถาม

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.