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

วิธีวางจุดกำเนิด (Origin) ไว้กลางเส้นโค้ง Cosine ใน Matplotlib

โดยปกติ 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}$'