โดยปกติ Axes ของ Matplotlib จะอยู่ที่มุมซ้ายล่าง สามารถย้าย Spines (ขอบกราฟ) ให้จุดกำเนิด (0,0) อยู่กลางกราฟได้ เพื่อแสดงฟังก์ชันคณิตศาสตร์อย่างชัดเจน
หลักการ: การปรับ Spines
Spines คือ 4 ขอบของ Axes: top, bottom, left, right ใช้ set_position('zero') ย้ายไปที่ 0 และ set_color('none') ซ่อน Spines ที่ไม่ต้องการ
ตัวอย่างโค้ด
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams["figure.figsize"] = [10, 8]
plt.rcParams["figure.autolayout"] = True
# ข้อมูล
x = np.linspace(-2*np.pi, 2*np.pi, 400)
y = np.cos(x)
fig, ax = plt.subplots()
# === ปรับ Spines ให้ Origin อยู่กลาง ===
# ซ่อน Top และ Right Spines
ax.spines['top'].set_color('none')
ax.spines['right'].set_color('none')
# ย้าย Bottom Spine ไปที่ y=0 (แกน X)
ax.spines['bottom'].set_position('zero')
ax.spines['bottom'].set_linewidth(1.5)
ax.spines['bottom'].set_color('black')
# ย้าย Left Spine ไปที่ x=0 (แกน Y)
ax.spines['left'].set_position('zero')
ax.spines['left'].set_linewidth(1.5)
ax.spines['left'].set_color('black')
# ตั้ง Ticks ให้อยู่ด้านนอก Spines
ax.xaxis.set_ticks_position('bottom')
ax.yaxis.set_ticks_position('left')
# กำหนด Ticks ให้สวยงามสำหรับ Pi
ax.set_xticks([-2*np.pi, -3*np.pi/2, -np.pi, -np.pi/2, 0, np.pi/2, np.pi, 3*np.pi/2, 2*np.pi])
ax.set_xticklabels([r'$-2\pi$', r'$-\frac{3\pi}{2}$', r'$-\pi$', r'$-\frac{\pi}{2}$',
r'$0$', r'$\frac{\pi}{2}$', r'$\pi$', r'$\frac{3\pi}{2}$', r'$2\pi$'])
ax.set_yticks([-1, -0.5, 0, 0.5, 1])
# วาดกราฟ
ax.plot(x, y, 'b-', linewidth=2.5, label=r'$y = \cos(x)$')
ax.legend(loc='upper right', fontsize=12)
# เพิ่ม Label ใกล้ Origin
ax.text(0.05, 0.05, 'O', transform=ax.transAxes, fontsize=12, fontweight='bold')
ax.set_title(r'$\bf{Origin\ at\ Center:\ y = \cos(x)}$', fontsize=16, pad=20)
ax.grid(True, alpha=0.2, linestyle='--')
plt.show()
ผลลัพธ์
กราฟ Cosine แสดงแกน X และ Y ตัดกันที่จุดกำเนิด (0,0) อยู่กลางภาพ พร้อม Ticks แสดงค่า Pi และ Grid Lines
ตัวเลือกตำแหน่ง Spines
| คำสั่ง | ผลลัพธ์ |
|---|---|
spine.set_position('zero') | ย้าย Spine ไปที่ 0 ของแกนตั้งฉาก |
spine.set_position(('data', 0)) | เหมือน 'zero' (Data Coordinate = 0) |
spine.set_position(('axes', 0.5)) | ย้ายไปกลาง Axes (50%) |
spine.set_position(('outward', 10)) | เลื่อนออกนอก 10 Points |
spine.set_color('none') | ซ่อน Spine |
ฟังก์ชันสำเร็จรูป: make_origin_center()
def make_origin_center(ax, hide_top_right=True, spine_width=1.5):
"""ย้าย Spines ให้ Origin (0,0) อยู่กลาง Axes"""
if hide_top_right:
ax.spines['top'].set_color('none')
ax.spines['right'].set_color('none')
ax.spines['bottom'].set_position('zero')
ax.spines['left'].set_position('zero')
ax.spines['bottom'].set_linewidth(spine_width)
ax.spines['left'].set_linewidth(spine_width)
ax.xaxis.set_ticks_position('bottom')
ax.yaxis.set_ticks_position('left')
return ax
# ใช้งาน
fig, ax = plt.subplots()
make_origin_center(ax)
ax.plot(x, y)
คำแนะนำ
- ใช้
ax.spines['bottom'].set_position('zero')และax.spines['left'].set_position('zero')คู่กัน - ซ่อน Top/Right Spines ให้ดูสะอาดตา
- ตั้ง Ticks ให้ตรงกับ Spines ด้วย
set_ticks_position() - ใช้ Mathtext สำหรับ Label Pi:
r'$\pi$',r'$\frac{\pi}{2}$'