สถาปัตยกรรม Figure และ Axes
ทำความเข้าใจลำดับชั้น Figure-Axes-Artist สร้างกราฟด้วย plt.subplots() และแยกความแตกต่างระหว่าง API แบบไร้สถานะกับแบบเชิงวัตถุ
สถาปัตยกรรม Figure และ Axes เป็นบทเรียน Pandas & NumPy Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Pandas & NumPy Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Pandas & NumPy Academy มีบทเรียนทั้งหมด 4 บทเรียน
เหตุใดจึงควรเรียนรู้สถาปัตยกรรมของ Matplotlib
Pandas และ Seaborn ต่างก็ใช้ Matplotlib ภายใน การเข้าใจลำดับชั้นของออบเจ็กต์ใน Matplotlib ช่วยให้คุณควบคุมทุกส่วนของแผนภูมิได้ ตั้งแต่พื้นที่แสดงผลโดยรวมไปจนถึงเครื่องหมายขีดแต่ละรายการ และยังช่วยให้รวมแผนภูมิหลายรายการไว้ใน Figure เดียวได้ หากไม่เข้าใจโมเดล Figure-Axes การปรับแต่งแผนภูมิจะกลายเป็นการคาดเดาอย่างน่าหงุดหงิดว่าควรเรียกใช้ฟังก์ชันใด
Figure: พื้นที่แสดงผล
Figure คือคอนเทนเนอร์ชั้นนอกสุด ซึ่งครอบคลุมหน้าต่างหรือไฟล์รูปภาพทั้งหมด ภายในประกอบด้วยออบเจ็กต์ Axes อย่างน้อยหนึ่งรายการ (พื้นที่แสดงแผนภูมิจริง) รวมถึงชื่อเรื่อง คำอธิบายที่ใช้ร่วมกัน และพื้นที่ว่าง คุณสร้าง Figure ด้วย plt.figure() หรือสร้างโดยอ้อมผ่าน plt.subplots() คุณสมบัติส่วนใหญ่ที่กำหนดบน Figure จะมีผลต่อพื้นที่แสดงผลทั้งหมด เช่น ขนาด สีพื้นหลัง และชื่อเรื่องโดยรวม
import matplotlib.pyplot as plt
import numpy as np
# Create a Figure with a specific size
fig = plt.figure(figsize=(8, 4)) # width=8 inches, height=4 inches
print(type(fig)) # matplotlib.figure.Figure
print('Figure size:', fig.get_size_inches())
plt.close() # close to avoid display in scriptsAxes: พื้นที่สำหรับสร้างแผนภูมิ
ออบเจ็กต์ Axes คือพื้นที่แสดงแผนภูมิหนึ่งแห่งภายใน Figure โดยประกอบด้วยแกน x แกน y เครื่องหมายขีด เส้นตาราง และองค์ประกอบภาพทั้งหมด (เส้น แท่ง และจุดกระจาย) คำสั่งสร้างแผนภูมิส่วนใหญ่เป็นเมธอดของออบเจ็กต์ Axes เช่น ax.plot(), ax.bar(), ax.scatter() Figure หนึ่งรายการสามารถมี Axes หลายรายการ ซึ่งจัดเรียงเป็นตารางของแผนภูมิย่อยได้
fig, ax = plt.subplots() # Creates Figure + one Axes
print(type(ax)) # matplotlib.axes.Axes
x = np.linspace(0, 10, 100)
ax.plot(x, np.sin(x)) # plot on the Axes
plt.tight_layout()
# plt.show()
plt.close()plt.subplots(): สร้าง Figure และ Axes พร้อมกัน
plt.subplots(nrows, ncols) เป็นวิธีที่แนะนำสำหรับสร้าง Figure ที่มี Axes อย่างน้อยหนึ่งรายการในรูปแบบตาราง ฟังก์ชันนี้คืนค่าทูเพิล (fig, ax) (หรือ (fig, axes_array) เมื่อมีแผนภูมิย่อยหลายรายการ) พารามิเตอร์ figsize ใช้กำหนดขนาดพื้นที่แสดงผลทั้งหมดเป็นหน่วยนิ้ว ควรแยกค่าผลลัพธ์ออกเป็นตัวแปรที่มีชื่อเสมอเพื่อให้อ่านเข้าใจได้ชัดเจน
# Single plot
fig, ax = plt.subplots(figsize=(6, 4))
# 2 rows, 1 column
fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(6, 8))
# 2 rows, 2 columns
fig, axes = plt.subplots(2, 2, figsize=(10, 8))
ax_top_left = axes[0, 0]
ax_top_right = axes[0, 1]
print('axes shape:', axes.shape) # (2, 2)
plt.close('all')API แบบออบเจ็กต์เทียบกับ API แบบมีสถานะ
Matplotlib มีรูปแบบการใช้งานสองแบบ API แบบมีสถานะ (pyplot) ใช้ plt.plot(), plt.xlabel() และอื่น ๆ และทำงานกับ Axes 'ปัจจุบัน' จึงเหมาะสำหรับการสำรวจแบบโต้ตอบอย่างรวดเร็ว ส่วน API แบบออบเจ็กต์ (OO) จะเรียกใช้เมธอดบนออบเจ็กต์ ax อย่างชัดเจน เช่น ax.plot(), ax.set_xlabel() โดยทั่วไปควรเลือกใช้ API แบบ OO สำหรับโค้ดที่ใช้งานจริงและ Figure หลายแผง เพราะระบุได้อย่างชัดเจนว่ากำลังแก้ไข Axes ใด
x = [1, 2, 3, 4]
y = [1, 4, 9, 16]
# Stateful API (convenient but fragile)
# plt.plot(x, y)
# plt.xlabel('x')
# plt.title('Squares')
# Object-oriented API (preferred)
fig, ax = plt.subplots()
ax.plot(x, y)
ax.set_xlabel('x')
ax.set_title('Squares')
plt.close()Artists: องค์ประกอบพื้นฐาน
ทุกสิ่งที่มองเห็นได้ในพล็อตของ Matplotlib คือ องค์ประกอบกราฟิก ได้แก่ Figure, Axes, เส้น ข้อความ แพตช์ (สี่เหลี่ยมผืนผ้าสำหรับแท่งกราฟ) และเครื่องหมายต่าง ๆ ลำดับชั้น Figure-Axes-Artist ไล่จากคอนเทนเนอร์ชั้นนอกสุดลงไปจนถึงองค์ประกอบภาพที่เล็กที่สุด การเข้าใจลำดับชั้นนี้ช่วยให้คุณค้นหาและแก้ไของค์ประกอบใด ๆ ด้วยโปรแกรมได้ เช่น เปลี่ยนสีของแท่งกราฟบางแท่งหลังจากวาดกราฟแล้ว
fig, ax = plt.subplots()
line, = ax.plot([1, 2, 3], [1, 4, 9], color='blue', linewidth=2)
# Introspect the hierarchy
print('Figure:', type(fig))
print('Axes:', type(ax))
print('Line Artist:', type(line))
print('Line color:', line.get_color())
plt.close()อ็อบเจ็กต์แกน: XAxis และ YAxis
แต่ละ Axes ประกอบด้วยอ็อบเจ็กต์ Axis สองตัว (อย่าสับสนกับ Axes) ได้แก่ ax.xaxis และ ax.yaxis อ็อบเจ็กต์เหล่านี้ควบคุมขีดแบ่ง ป้ายกำกับขีดแบ่ง และเส้นขอบ (เส้นที่มองเห็นได้) คุณสามารถกำหนดขอบเขตแกนด้วย ax.set_xlim() และ ax.set_ylim() ควบคุมความถี่ของขีดแบ่งด้วย ax.set_xticks() และจัดรูปแบบป้ายกำกับด้วย ax.xaxis.set_major_formatter()
fig, ax = plt.subplots()
ax.plot([1, 2, 3, 4], [10, 40, 30, 70])
ax.set_xlim(0, 5)
ax.set_ylim(0, 80)
ax.set_xticks([1, 2, 3, 4])
ax.set_xticklabels(['Q1', 'Q2', 'Q3', 'Q4'])
ax.set_xlabel('Quarter')
ax.set_ylabel('Revenue')
plt.close()แกนร่วมสำหรับพล็อตหลายแผง
เมื่อสร้างตารางของพล็อตย่อย ให้ส่ง sharex=True หรือ sharey=True ไปยัง plt.subplots() เพื่อเชื่อมสเกลของแกนระหว่างแผงต่าง ๆ ซึ่งหมายความว่าเมื่อซูมหรือเลื่อนพล็อตย่อยหนึ่ง แผงทั้งหมดที่ใช้แกนนั้นร่วมกันจะอัปเดตโดยอัตโนมัติ วิธีนี้จำเป็นสำหรับการเปรียบเทียบอนุกรมเวลาจากหลายกลุ่มที่ควรแสดงช่วงแกน x เดียวกันในทุกแผง
import numpy as np
x = np.arange(10)
fig, (ax1, ax2) = plt.subplots(2, 1, sharex=True, figsize=(6, 5))
ax1.plot(x, x**2, color='blue')
ax1.set_title('Squares')
ax2.plot(x, x**3, color='red')
ax2.set_title('Cubes')
fig.suptitle('Powers of x') # shared figure title
plt.tight_layout()
plt.close()การจัดระยะห่างด้วย tight_layout()
plt.tight_layout() (หรือ fig.tight_layout()) จะปรับพารามิเตอร์ของพล็อตย่อยโดยอัตโนมัติ เพื่อลดการซ้อนทับระหว่างป้ายกำกับ ชื่อเรื่อง และเครื่องหมายขีดแบ่ง เรียกใช้ก่อน plt.show() หรือ fig.savefig() สำหรับการควบคุมอย่างละเอียด ให้ใช้ plt.subplots_adjust(hspace=, wspace=) เพื่อกำหนดระยะห่างแนวตั้งและแนวนอนระหว่างพล็อตย่อยด้วยตนเอง
fig, axes = plt.subplots(2, 2, figsize=(10, 8))
for i, ax in enumerate(axes.flat):
ax.plot([1, 2, 3], [i, i+1, i+2])
ax.set_title(f'Panel {i+1}')
ax.set_xlabel('x axis label')
ax.set_ylabel('y axis label')
fig.suptitle('Grid of Plots', y=1.02)
plt.tight_layout() # prevents overlapping labels
plt.close()การเข้าถึง Axes จาก subplots()
เมื่อ plt.subplots(nrows, ncols) คืนค่าแกนหลายตัว แกนเหล่านั้นจะถูกจัดเก็บในอาร์เรย์ NumPy ที่มีรูปร่างเป็น (nrows, ncols) ให้ระบุดัชนีเช่นเดียวกับอาร์เรย์ 2 มิติทั่วไป: axes[0, 1] หมายถึงแถวแรก คอลัมน์ที่สอง ใช้ axes.flat เพื่อวนซ้ำแกนทั้งหมดตามลำดับแถว โดยไม่ขึ้นกับรูปร่างของตาราง ซึ่งสะดวกมากเมื่อต้องใช้การจัดรูปแบบเดียวกันกับทุกแผง
fig, axes = plt.subplots(2, 3, figsize=(12, 6))
# Access by row, column
axes[0, 0].set_title('Top Left')
axes[1, 2].set_title('Bottom Right')
# Iterate over all axes
for ax in axes.flat:
ax.set_xlabel('Time')
ax.set_ylabel('Value')
plt.tight_layout()
plt.close()การนำ Axes ที่ไม่ได้ใช้ออก
เมื่อสร้างตารางของพล็อตย่อยแต่ไม่ได้ใช้ทุกแผง แกนว่างก็ยังแสดงเส้นกรอบอยู่ ให้เรียกใช้ ax.set_visible(False) หรือ fig.delaxes(ax) เพื่อซ่อนหรือลบแกนที่ไม่ได้ใช้ รูปแบบที่พบได้บ่อยคือวนซ้ำผ่าน axes.flat แล้วซ่อนแผงทั้งหมดที่เกินจำนวนชุดข้อมูลที่กำลังพล็อต เพื่อให้รูปภาพดูสะอาดตา
fig, axes = plt.subplots(2, 3, figsize=(12, 6))
data_panels = 4 # only 4 plots needed in a 2x3 grid
for i, ax in enumerate(axes.flat):
if i < data_panels:
ax.plot([1, 2, 3], [i, i+1, i+2])
ax.set_title(f'Panel {i+1}')
else:
ax.set_visible(False) # hide extra panels
plt.tight_layout()
plt.close()ตรวจสอบความเข้าใจ
ทดสอบความเข้าใจเกี่ยวกับสถาปัตยกรรม Figure และ Axes ของ Matplotlib จากบทเรียนนี้
สรุปบทเรียน
ในบทเรียนนี้ คุณได้เรียนรู้ว่า Figure คือพื้นที่ภาพทั้งหมด และ Axes คือพื้นที่พล็อตหนึ่งส่วนภายในนั้น; plt.subplots() สร้างทั้งสองอย่างพร้อมกันและคืนค่าเป็น (fig, ax); API เชิงอ็อบเจ็กต์ (ax.plot(), ax.set_xlabel()) เป็นรูปแบบที่แนะนำมากกว่า API ของ pyplot ที่อาศัยสถานะ; และ tight_layout() ช่วยป้องกันป้ายกำกับซ้อนทับกันในรูปภาพหลายแผง ต่อไปเราจะสร้างพล็อตเส้นและพล็อตกระจาย โดยควบคุมรูปแบบได้อย่างเต็มที่
คำถามที่พบบ่อย
บทเรียน “สถาปัตยกรรม Figure และ Axes” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “สถาปัตยกรรม Figure และ Axes” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Pandas & NumPy Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Pandas & NumPy Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “สถาปัตยกรรม Figure และ Axes”
ทำความเข้าใจลำดับชั้น Figure-Axes-Artist สร้างกราฟด้วย plt.subplots() และแยกความแตกต่างระหว่าง API แบบไร้สถานะกับแบบเชิงวัตถุ คุณปฏิบัติ Pandas & NumPy Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Pandas & NumPy Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน Pandas & NumPy Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน
บทเรียน “สถาปัตยกรรม Figure และ Axes” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน Pandas & NumPy Academy นี้ได้ไหม
ได้ บทเรียน Pandas & NumPy Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- สถาปัตยกรรม Figure และ Axes
- กราฟเส้นและกราฟกระจาย
- กราฟแท่งและฮิสโตแกรม
- ป้ายกำกับ ชื่อเรื่อง และการบันทึกภาพ