เมื่อพลอตฟังก์ชันที่มีจุดไม่ต่อเนื่อง (discontinuity) หรืออสิมโทต (asymptote) เช่น y = 1/x ที่ x=0 Matplotlib จะเชื่อมเส้นข้ามจุดไม่ต่อเนื่อง ทำให้กราฟผิดปกติ วิธีแก้คือปิดการแสดงแกนมาตรฐาน และวาดเส้นแกนเองด้วย axhline และ axvline
ขั้นตอนการทำงาน
- นำเข้า
numpyและmatplotlib.pyplot - สร้างข้อมูล X ด้วย
np.linspace()(หลีกเลี่ยง x=0 ได้โดยใช้จุดมากพอ) - คำนวณ Y = 1/X (จะได้ค่า inf ที่ x=0)
- ปิดแกนมาตรฐานด้วย
plt.axis('off') - พลอตกราฟด้วย
plt.plot(x, y, label='y=1/x') - วาดเส้นแกน X=0 และ Y=0 ด้วย
plt.axvline(x=0, c='red')และplt.axhline(y=0, c='red') - เพิ่ม Legend ด้วย
plt.legend() - แสดงผลด้วย
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) ที่ต้องการแสดงลักษณะจริงของฟังก์ชัน