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

การเติมสีพื้นที่ใต้เส้นโค้งบนมาตราสเกล Log Scale ใน Matplotlib

การเติมสีพื้นที่ระหว่างเส้นโค้งสองเส้น (Fill Between) บนมาตราสเกล Logarithmic Scale ใน Matplotlib ต้องระวังเรื่องค่าศูนย์และค่าลบ เนื่องจาก Log Scale ไม่รองรับค่า ≤ 0

ขั้นตอนและข้อควรระวัง

  1. สร้างข้อมูล x, y1, y2 ที่เป็นค่าบวกทั้งหมด (Log Scale ต้องการค่า > 0)
  2. ใช้ plt.fill_between() เติมสีระหว่างโค้ง
  3. ตั้งค่า Scale ด้วย plt.xscale('log') และ plt.yscale('log')
  4. เพิ่ม Legend และ Label ให้ครบถ้วน

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

import numpy as np
import matplotlib.pyplot as plt

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

# สร้างข้อมูล: x ต้องเป็นบวกทั้งหมดสำหรับ Log Scale
x = np.logspace(-1, 2, 200)  # 0.1 ถึง 100 (Log scale)
y1 = np.exp(-x / 10) * 100   # Exponential decay - ค่าบวกเสมอ
y2 = np.exp(-x / 20) * 50    # เส้นที่สอง

# วาดกราฟ
plt.plot(x, y1, 'b-', linewidth=2, label='y1 = 100·exp(-x/10)')
plt.plot(x, y2, 'r-', linewidth=2, label='y2 = 50·exp(-x/20)')

# เติมสีระหว่างโค้ง
plt.fill_between(x, y1, y2, color='purple', alpha=0.3, label='Area between curves')

# ตั้งค่า Log Scale
plt.xscale('log')
plt.yscale('log')

# ปรับแต่ง
plt.xlabel('X (Log Scale)', fontsize=12)
plt.ylabel('Y (Log Scale)', fontsize=12)
plt.title('Fill Between Curves on Log-Log Scale', fontsize=14, pad=15)
plt.legend(loc='lower left', fontsize=11)
plt.grid(True, which='both', alpha=0.3)  # Grid ทั้ง Major และ Minor

plt.show()

ผลลัพธ์

กราฟแสดงพื้นที่ระหว่างเส้นโค้งสองเส้นบนมาตราสเกล Log-Log ทั้งแกน X และ Y พร้อม Grid Lines แบบ Logarithmic

⚠️ ข้อควรระวังสำคัญ

  • Log Scale ไม่รองรับค่า 0 หรือติดลบ - จะเกิด Warning และไม่แสดงผล
  • ใช้ np.logspace() สร้าง x แทน linspace() เพื่อกระจายจุดสม่ำเสมอใน Log Scale
  • หากข้อมูลมีค่า 0 ให้บวกค่าคงที่เล็กน้อย (เช่น +1e-10) หรือใช้ symlog Scale แทน
  • fill_between ทำงานได้ปกติบน Log Scale ตราบใดที่ข้อมูลทั้งหมดเป็นบวก

ตัวอย่างใช้ Symlog (รองรับค่า 0 และลบได้)

x = np.linspace(-10, 10, 200)
y1 = np.sin(x) + 2    # ค่าอยู่ระหว่าง 1-3 (บวก)
y2 = np.cos(x) + 2    # ค่าอยู่ระหว่าง 1-3 (บวก)

plt.plot(x, y1, label='sin(x)+2')
plt.plot(x, y2, label='cos(x)+2')
plt.fill_between(x, y1, y2, alpha=0.3)

plt.yscale('symlog', linthresh=0.1)  # Symlog: Linear ใกล้ 0, Log ไกล 0
plt.xscale('symlog', linthresh=1)
plt.grid(True, which='both')
plt.show()