Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Python

วิธีบังคับให้ Error Bars วาดทีหลังสุดใน Matplotlib

ใน Matplotlib ลำดับการวาด (Drawing Order / Z-order) กำหนดว่าออบเจ็กต์ไหนอยู่บนหรือใต้ โดยปกติ Object ที่ Plot ทีหลังจะอยู่ด้านบน หากต้องการให้ Error Bars อยู่ด้านบนสุด (วาดทีหลังสุด) ให้ Plot Error Bars หลังจาก Plot ข้อมูลอื่นๆ เสร็จแล้ว

วิธีการ

เรียก ax.errorbar() หลังจาก Plot เส้น/จุดข้อมูลอื่นๆ ทั้งหมด เนื่องจาก Matplotlib ใช้ Painter's Algorithm (วาดทีหลังทับทีหน้า)

ตัวอย่างโค้ด

import numpy as np
import matplotlib.pyplot as plt

plt.rcParams["figure.figsize"] = [10, 6]
plt.rcParams["figure.autolayout"] = True

fig, ax = plt.subplots()

# 1. Plot เส้นพื้นหลังหลายเส้นก่อน
for i in range(10):
    ax.plot(np.random.rand(10), alpha=0.5, linewidth=1, color='gray')

# 2. Plot ข้อมูลหลัก
x = np.arange(10)
y_main = 2 * np.sin(x * 0.5) + 5
ax.plot(x, y_main, 'bo-', linewidth=2.5, markersize=8, label='Main Data', zorder=10)

# 3. Plot Error Bars ทีหลังสุด (อยู่บนสุด)
y_err = 0.3 * np.random.rand(10) + 0.2
ax.errorbar(x, y_main, yerr=y_err, 
            fmt='ro',           # แสดงจุดสีแดงที่ตำแหน่งข้อมูล
            ecolor='red',       # สี Error Bar
            elinewidth=2,       # ความหนาเส้น Error Bar
            capsize=5,          # ขนาด Cap
            capthick=2,         # ความหนา Cap
            label='Error Bars',
            zorder=20)          # zorder สูงสุด เพื่อความแน่ใจ

ax.set_xlabel('X', fontsize=12)
ax.set_ylabel('Y', fontsize=12)
ax.set_title('Error Bars Rendered Last (Topmost)', fontsize=14)
ax.legend()
ax.grid(True, alpha=0.3)

plt.show()

ผลลัพธ์

Error Bars (สีแดงพร้อม Cap) จะแสดงอยู่ด้านบนสุด ทับเส้นสีเทาและเส้นสีน้ำเงิน ชัดเจนและมองเห็นได้ชัด

เทคนิคเพิ่มเติม: ใช้ zorder ควบคุมลำดับชั้น

# กำหนด zorder โดยตรง (ค่ามาก = อยู่บน)
ax.plot(x, y1, zorder=1)      # ชั้นล่าง
ax.fill_between(x, y1, y2, zorder=2)  # ชั้นกลาง
ax.errorbar(x, y, yerr=err, zorder=3) # ชั้นบนสุด
ax.scatter(x, y, zorder=4)    # ชั้นบนสุดมาก (ถ้าต้องการจุดอยู่บน Error Bar)

คำแนะนำ

  • วิธีง่ายที่สุด: เรียก errorbar() ทีหลังสุดในโค้ด
  • วิธีแน่ใจที่สุด: กำหนด zorder ให้ Error Bar สูงกว่าอื่นๆ
  • fmt='none' ใน errorbar จะซ่อนจุดข้อมูล แสดงเฉพาะ Error Bar
  • ใช้ capsize=0 หากไม่ต้องการ Cap ที่ปลาย Error Bar