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

วิธีจัดการอสิมโทต/จุดไม่ต่อเนื่องใน Matplotlib

เมื่อพลอตฟังก์ชันที่มีจุดไม่ต่อเนื่อง (discontinuity) หรืออสิมโทต (asymptote) เช่น y = 1/x ที่ x=0 Matplotlib จะเชื่อมเส้นข้ามจุดไม่ต่อเนื่อง ทำให้กราฟผิดปกติ วิธีแก้คือปิดการแสดงแกนมาตรฐาน และวาดเส้นแกนเองด้วย axhline และ axvline

ขั้นตอนการทำงาน

  1. นำเข้า numpy และ matplotlib.pyplot
  2. สร้างข้อมูล X ด้วย np.linspace() (หลีกเลี่ยง x=0 ได้โดยใช้จุดมากพอ)
  3. คำนวณ Y = 1/X (จะได้ค่า inf ที่ x=0)
  4. ปิดแกนมาตรฐานด้วย plt.axis('off')
  5. พลอตกราฟด้วย plt.plot(x, y, label='y=1/x')
  6. วาดเส้นแกน X=0 และ Y=0 ด้วย plt.axvline(x=0, c='red') และ plt.axhline(y=0, c='red')
  7. เพิ่ม Legend ด้วย plt.legend()
  8. แสดงผลด้วย plt.show()

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

import numpy as np
from matplotlib import pyplot as plt

plt.rcParams["figure.figsize"] = [7.00, 3.50]
plt.rcParams["figure.autolayout"] = True

x = np.linspace(-1, 1, 100)
y = 1 / x

plt.axis('off')
plt.plot(x, y, label='y=1/x')
plt.axhline(y=0, c='red')
plt.axvline(x=0, c='red')
plt.legend(loc='upper left')
plt.show()

วิธีแก้ไขที่ดีกว่า: แยกข้อมูลก่อนและหลังจุดไม่ต่อเนื่อง


# แยกข้อมูล 2 ส่วน: x < 0 และ x > 0
x_neg = np.linspace(-1, -0.01, 50)
x_pos = np.linspace(0.01, 1, 50)

plt.plot(x_neg, 1/x_neg, 'b-', label='y=1/x')
plt.plot(x_pos, 1/x_pos, 'b-')
plt.axhline(0, color='red', linestyle='--')
plt.axvline(0, color='red', linestyle='--')
plt.legend()
plt.show()

เทคนิคขั้นสูง: ใช้ Masked Array


import numpy.ma as ma

x = np.linspace(-1, 1, 1000)
y = 1 / x
y_masked = ma.masked_where(np.abs(y) > 50, y)  # ซ่อนค่าที่ใหญ่เกินไป

plt.plot(x, y_masked)
plt.axhline(0, color='red')
plt.axvline(0, color='red')
plt.ylim(-10, 10)  # จำกัดแกน Y
plt.show()

การประยุกต์ใช้

เหมาะสำหรับฟังก์ชันตรรกยะ (rational functions) ฟังก์ชันทริโกณมิติเช่น tan(x) sec(x) หรือข้อมูลที่มีค่าข้ามเกณฑ์ (outliers) ที่ต้องการแสดงลักษณะจริงของฟังก์ชัน