อะไรคือความแตกต่างระหว่างการวาดพล็อตโดยใช้พล็อตแกนหรือรูปใน matplotlib?


101

ฉันสับสนว่าเกิดอะไรขึ้นที่แบ็กเอนด์เมื่อฉันวาดพล็อตใน matplotlib, tbh ฉันไม่ชัดเจนกับลำดับชั้นของพล็อตแกนและรูป ฉันอ่านเอกสารแล้วมันมีประโยชน์ แต่ฉันก็ยังสับสน ...

โค้ดด้านล่างวาดพล็อตเดียวกันด้วยสามวิธีที่แตกต่างกัน -

#creating the arrays for testing
x = np.arange(1, 100)
y = np.sqrt(x)
#1st way
plt.plot(x, y)
#2nd way
ax = plt.subplot()
ax.plot(x, y)
#3rd way
figure = plt.figure()
new_plot = figure.add_subplot(111)
new_plot.plot(x, y)

ตอนนี้คำถามของฉันคือ -

  1. อะไรคือความแตกต่างระหว่างทั้งสามฉันหมายถึงสิ่งที่เกิดขึ้นภายใต้ประทุนเมื่อมีการเรียกใช้วิธีใดใน 3 วิธี

  2. วิธีใดที่ควรใช้เมื่อใดและข้อดีข้อเสียของการใช้วิธีใดบ้าง


8
ฉันอ่านแล้ว แต่ฉันไม่พบคำตอบที่น่าพอใจเลย มันอธิบายลำดับชั้น แต่ก็ทำให้เกิดความสับสนว่าทำไมถึงไม่มีวิธีธรรมดาทำไมวัตถุรูปนั้นถึงเปิดออก?
hashcode55

ฉันไม่แน่ใจว่าคุณอ้างถึงเอกสารนี้หรือไม่matplotlib.org/users/artists.html สิ่งนี้ตอบคำถามของคุณว่าทำไมถึงเปิดเผยตัวเลข โดยส่วนตัวแล้วนี่เป็นคำอธิบายที่ดีที่สุดของ matplotlib ที่ฉันพบ ออบเจ็กต์ฟิกเกอร์ช่วยให้คุณสามารถเพิ่มศิลปินของคุณเองได้โดยตรงโดยไม่ต้องใช้แกนแม้ว่าจะไม่ค่อยมีการใช้งานเว้นแต่คุณต้องการปรับแต่ง "แพทช์" ของฟิกเกอร์เองเป็นต้นโปรดทราบว่าฟิกเกอร์เป็นคอนเทนเนอร์หลักและโฮสต์แกนและศิลปิน
Sandeep

คำตอบ:


55

วิธีที่ 1

plt.plot(x, y)

วิธีนี้ช่วยให้คุณสามารถพล็อตตัวเลขเพียงรูปเดียวด้วยพิกัด (x, y) หากคุณต้องการรับกราฟิกเพียงภาพเดียวคุณสามารถใช้วิธีนี้ได้

วิธีที่ 2

ax = plt.subplot()
ax.plot(x, y)

วิธีนี้ช่วยให้คุณพล็อตรูปหนึ่งหรือหลายรูปในหน้าต่างเดียวกัน ในขณะที่คุณเขียนคุณจะพล็อตเพียงรูปเดียว แต่คุณสามารถสร้างสิ่งนี้ได้:

fig1, ((ax1, ax2), (ax3, ax4)) = plt.subplots(2, 2)

คุณจะพล็อตตัวเลข 4 ตัวซึ่งมีชื่อว่า ax1, ax2, ax3 และ ax4 แต่ละตัว แต่อยู่ในหน้าต่างเดียวกัน หน้าต่างนี้จะแบ่งออกเป็น 4 ส่วนด้วยตัวอย่างของฉัน

วิธีที่ 3

fig = plt.figure()
new_plot = fig.add_subplot(111)
new_plot.plot(x, y)

ฉันไม่ได้ใช้มัน แต่คุณสามารถหาเอกสารได้

ตัวอย่าง:

import numpy as np
import matplotlib.pyplot as plt

# Method 1 #

x = np.random.rand(10)
y = np.random.rand(10)

figure1 = plt.plot(x,y)

# Method 2 #

x1 = np.random.rand(10)
x2 = np.random.rand(10)
x3 = np.random.rand(10)
x4 = np.random.rand(10)
y1 = np.random.rand(10)
y2 = np.random.rand(10)
y3 = np.random.rand(10)
y4 = np.random.rand(10)

figure2, ((ax1, ax2), (ax3, ax4)) = plt.subplots(2, 2)
ax1.plot(x1,y1)
ax2.plot(x2,y2)
ax3.plot(x3,y3)
ax4.plot(x4,y4)

plt.show()

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

ตัวอย่างอื่น ๆ :

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


@ hashcode55 แต่ละรูปเป็นอิสระ ฉันจะแสดงตัวอย่าง
Essex

1
@ hashcode55 ฉันจะแก้ไขด้วยตัวอย่าง (แค่รูปจากงานวิจัยของฉันใน Astrophysics สคริปต์ยาวเกินไป (1300 บรรทัด));) แต่ละร่างเป็นอิสระ;)
Essex

3
ฉันรู้ว่านี่คือ nitpicky แต่ฉันทำเพราะmatplotlibภาษาทำให้ฉันสับสนและคำถามนี้จะปรากฏขึ้นเมื่อค้นหาเกี่ยวกับ "แกนเทียบกับตัวเลขใน matplotlib" สำหรับ noobs อื่น ๆคำถามนี้ช่วยตอบได้ ผมคิดว่าการใช้ถ้อยคำที่นี่จะมีความชัดเจนมากขึ้นว่าsubplots()จะกลับวัตถุที่เดียวAxes figure
Hendy

35

ชื่อของวัตถุ

Matplotlib เป็นวัตถุที่มุ่งเน้นอย่างมากและวัตถุหลักคือรูปและแกน (ฉันพบว่าชื่อaxesทำให้เข้าใจผิดเล็กน้อย แต่อาจเป็นเพียงฉัน)

คุณสามารถคิดว่ารูปเป็นผืนผ้าใบซึ่งโดยทั่วไปคุณจะระบุขนาดและอาจจะเป็นเช่นสีพื้นหลัง ฯลฯ เป็นต้นคุณใช้ผืนผ้าใบเป็นรูปเป็นหลักในสองวิธีโดยวางวัตถุอื่นไว้บนนั้น (ส่วนใหญ่เป็นแกนแต่ นอกจากนี้ยังมีข้อความป้าย ฯลฯ ) savefigและบันทึกเนื้อหาของมันด้วย

คุณสามารถคิดของแกนเป็นประเภทของมีดสวิสกองทัพเป็นวัตถุที่มีประโยชน์ที่เสนอเครื่องมือ (เช่น.plot, .scatter, .histฯลฯ ) สำหรับทุกอย่างส่วนใหญ่ คุณสามารถวางแกนหนึ่ง, สอง, ... หลายแกนในรูปได้โดยใช้หนึ่งในหลาย ๆ วิธี

pltอินเตอร์เฟซ

PLTอินเตอร์เฟซขั้นตอนถูกพัฒนามาเพื่อเลียนแบบ MATLAB ™อินเตอร์เฟซ แต่ไม่ได้จริงๆที่แตกต่างกันจากอินเตอร์เฟซเชิงวัตถุแม้ว่าคุณจะไม่ได้ทำตรงที่อ้างอิงกับวัตถุหลัก (เช่นรูปและแกน ) วัตถุเหล่านี้เป็น instantiated โดยอัตโนมัติและแต่ละPLTวิธีการที่เป็นหลักแปลต่อการเรียกร้องของหนึ่งในวิธีการของวัตถุที่อยู่ภายใต้พื้นฐานที่: e กรัมplt.plot()เป็นhidden_axes.plotและเป็นplt.savefighidden_figure.savefig

ในทุกช่วงเวลาคุณสามารถจัดการกับวัตถุที่ซ่อนอยู่เหล่านี้ได้โดยใช้plt.gcfและplt.gcaบางครั้งสิ่งนี้จำเป็นเมื่อวิธีการวัตถุอย่างใดอย่างหนึ่งไม่ได้ถูกย้ายไปยังเมธอดในเนมสเปซplt

ฉันต้องการเพิ่มว่าเนมสเปซpltยังมีวิธีอำนวยความสะดวกมากมายในการสร้างอินสแตนซ์รูปและแกนในรูปแบบต่างๆ

ตัวอย่างของคุณ

วิธีที่ 1

plt.plot(x, y)

ที่นี่คุณใช้เฉพาะอินเทอร์เฟซpltคุณสามารถใช้แกนเดียวในแต่ละรูปได้ แต่นี่คือสิ่งที่คุณต้องการเมื่อคุณทำการสำรวจข้อมูลของคุณซึ่งเป็นสูตรอาหารอย่างรวดเร็วที่ทำให้งานสำเร็จ ...

วิธีที่ 2

ax = plt.subplot()
ax.plot(x, y)

ที่นี่คุณใช้วิธีการที่สะดวกสบายในPLT namespace ที่จะให้ชื่อ (และการจัดการ) ที่คุณแกนวัตถุ แต่ BTW นอกจากนี้ยังมีซ่อนตัวเลข คุณสามารถใช้อ็อบเจกต์แกนเพื่อพล็อตสร้างฮิสโตแกรมและอื่น ๆ ในภายหลังได้ทุกสิ่งที่คุณสามารถทำได้ด้วยอินเทอร์เฟซpltแต่คุณยังสามารถเข้าถึงแอตทริบิวต์ทั้งหมดและแก้ไขได้อย่างอิสระมากขึ้น

วิธีที่ 3

figure = plt.figure()
new_plot = figure.add_subplot(111)
new_plot.plot(x, y)

ที่นี่คุณเริ่มสร้างอินสแตนซ์รูปโดยใช้วิธีอำนวยความสะดวกในplt namespace และหลังจากนั้นคุณใช้เฉพาะอินเทอร์เฟซเชิงวัตถุ

เป็นไปได้ที่จะข้ามวิธีการอำนวยความสะดวกplt ( matplotlib.figure.Figure) แต่จากนั้นคุณต้องปรับแต่งรูปเพื่อประสบการณ์การโต้ตอบที่ดีขึ้น (หลังจากนั้นก็เป็นวิธีที่สะดวก )

คำแนะนำส่วนบุคคล

ผมขอแนะนำให้เปลือยplt.plot, plt.scatterในบริบทของเซสชั่นแบบโต้ตอบที่อาจจะใช้IPythonกับ%matplotlibคำสั่งมายากลและยังอยู่ในบริบทของการสำรวจโน้ตบุ๊ค Jupyter

ในทางกลับกันแนวทางเชิงวัตถุและวิธีการplt อำนวยความสะดวกบางอย่างเป็นวิธีที่จะไป

  • หากคุณมีปัญหาถาวรที่ต้องแก้ไขครั้งเดียวสำหรับทุกคนด้วยการจัดเรียงแผนย่อยที่ปรับแต่งอย่างละเอียด
  • หากคุณต้องการฝัง Matplotlib ใน UI ของโปรแกรมที่คุณเขียน

มีพื้นที่สีเทาขนาดใหญ่ระหว่างความสุดขั้วเหล่านี้และถ้าคุณถามฉันว่าจะทำอย่างไรฉันจะบอกว่า"มันขึ้นอยู่กับ" ...


2
"ฉันคิดว่าชื่อแกนทำให้เข้าใจผิดไปหน่อย แต่น่าจะเป็นแค่ฉัน" - ไม่ฉันเองก็เช่นกัน ไม่สามารถเปลี่ยนแปลงได้
Laryx Decidua

1
อีกอย่างที่ฉันไม่เข้าใจว่าทำไมผู้คนถึงใช้fig, ax = plt.subplot()สำนวนเมื่อพวกเขาไม่ต้องการเรื่องยิบย่อย ในกรณีเช่นนี้ฉันพบว่ารูปแบบ "ขั้นตอน" ง่ายกว่า "แต่คงเป็นแค่ฉัน ... " :-)
Laryx Decidua

@LaryxDecidua ฉันเห็นเหตุผลที่ดีสองประการในทันที① "Explicit ดีกว่าโดยนัย" ②คุณต้องการใช้วิธีการของ Figure หรือ Axes ที่ไม่มีใน API ขั้นตอน - แต่อาจมีอื่น ๆ ...
gboffi

ใช่ฉันสมัครเต็ม 1) Re 2): ส่วนใหญ่แล้วขั้นตอน API ก็เพียงพอแล้ว ในตอนท้ายของวันฉันคิดว่ามันขึ้นอยู่กับความชอบส่วนตัว - สิ่งที่ไม่ควรเถียงเกี่ยวกับ :-)
Laryx Decidua
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.