01ภาพรวมของกราฟนี้
Line chart เชื่อมค่าที่เรียงตามเวลาเข้าด้วยกัน สิ่งที่เราอ่านจริง ๆ ไม่ใช่ตำแหน่งของจุดแต่ละจุด แต่คือ "ความชัน" ซึ่งบอกอัตราการเปลี่ยนแปลง เส้นที่เชื่อมยังสื่อด้วยว่าค่าระหว่างจุดมีอยู่จริงและต่อเนื่อง จึงใช้ได้เฉพาะกับข้อมูลที่ต่อเนื่องจริง
เปรียบเทียบให้เห็นภาพ
เหมือนเส้นทางเดินป่าบนแผนที่ระดับความสูง เราไม่ได้สนใจว่าแต่ละหมุดสูงเท่าไร แต่สนใจว่าทางช่วงไหนชันขึ้น ช่วงไหนลงเขา
ใช้ที่ไหนบ้าง — ยอดขายรายเดือน จำนวนผู้ใช้รายวัน ราคาหุ้น อุณหภูมิ หรือทุกอย่างที่วัดซ้ำตามเวลา
สร้างอย่างไร
- ขั้นที่ 1เรียงข้อมูลตามเวลา
- ขั้นที่ 2ตรวจว่าช่วงห่างระหว่างจุดสม่ำเสมอ
- ขั้นที่ 3วาดเส้นเชื่อมจุด
- ขั้นที่ 4ติดป้ายเฉพาะจุดที่จะพูดถึง
ตัวอย่างคลาสสิก · กราฟเส้นเศรษฐกิจของ William Playfair ปี 1786
Playfair วาดมูลค่าการนำเข้าและส่งออกของอังกฤษตามปีเป็นเส้นสองเส้น แล้วระบายพื้นที่ระหว่างเส้นเพื่อแสดงดุลการค้า นี่เป็นครั้งแรกที่มีคนใช้แกนนอนแทนเวลาอย่างเป็นระบบ และเป็นรูปแบบที่เรายังใช้เหมือนเดิมทุกวันนี้
02อธิบายภาษาคนเข้าใจง่าย ๆ
กราฟเส้นต่างจากกราฟแท่งตรงที่มันไม่ได้ให้เราอ่านค่าทีละค่า แต่ให้เราอ่าน "รูปร่างของการเปลี่ยนแปลง" ทั้งเส้นพร้อมกัน สมองเราจับความชันได้เร็วกว่าการเทียบตัวเลขทีละคู่มาก
เพราะเส้นเชื่อมจุด มันจึงบอกโดยนัยว่า "ระหว่างสองจุดนี้มีค่าอยู่จริงและไหลต่อเนื่อง" ข้อนี้สำคัญ ถ้าข้อมูลเป็นหมวดหมู่ที่ไม่ต่อเนื่อง เช่น ยอดขายรายจังหวัด การลากเส้นเชื่อมจะเป็นการโกหก
ช่วงห่างของเวลาต้องสม่ำเสมอ ถ้าข้อมูลบางช่วงเก็บทุกวันแต่บางช่วงเก็บทุกเดือน แล้ววาดจุดห่างเท่ากันหมด ความชันจะผิดทั้งกราฟ ต้องวางตำแหน่งตามเวลาจริงเสมอ
ต่างจากกราฟแท่ง กราฟเส้นไม่จำเป็นต้องเริ่มที่ศูนย์ เพราะเราอ่านความชันไม่ได้อ่านความยาว การซูมเข้าไปที่ช่วงที่ข้อมูลอยู่จริงมักทำให้เห็นรูปแบบได้ชัดกว่า แต่ต้องเขียนบอกว่าแกนเริ่มที่เท่าไร
สิ่งที่ต้องระวังคือการทำให้เส้นเรียบเกินไป การใช้ค่าเฉลี่ยเคลื่อนที่ช่วยลดสัญญาณรบกวนได้จริง แต่ก็ลบจุดหักเหและค่าผิดปกติที่อาจเป็นเรื่องสำคัญที่สุดออกไปด้วย
03ข้อมูลที่ต้องใช้
คอลัมน์ที่ต้องเตรียม
| คอลัมน์ | ทำหน้าที่ | ชนิด | เข้ารหัสด้วย | จำนวนค่าที่เหมาะ | หมายเหตุ |
|---|---|---|---|---|---|
date | เวลา | เวลา | x | 10–500 จุด | ต้องเรียงลำดับและมีช่วงห่างสม่ำเสมอ ถ้าไม่สม่ำเสมอต้องวางตามเวลาจริง ไม่ใช่เรียงเท่า ๆ กัน |
value | ค่าที่วัดได้ | ตัวเลขต่อเนื่อง | y | ต่อเนื่อง | ต้องเป็นสิ่งเดียวกันตลอดช่วงเวลา ถ้านิยามเปลี่ยนกลางทางต้องทำเครื่องหมาย |
ต้องเตรียมข้อมูลอย่างไรก่อนวาด
- เรียงตามเวลา
- ตรวจช่องว่างของเวลาที่หายไป
- ตัดสินใจว่าจะเติมค่าที่หายหรือทิ้งช่องว่างไว้
- ตรวจว่านิยามของตัวชี้วัดไม่เปลี่ยนกลางทาง
ค่าที่หายไป — ★ ห้ามลากเส้นข้ามช่วงที่ไม่มีข้อมูล ต้องหักเส้นให้เห็นช่องว่าง เพราะการลากข้ามคือการอ้างว่ารู้ค่าที่ไม่ได้วัด
สเกลของแกน — linear เป็นค่าเริ่มต้น ใช้ log เมื่อสนใจอัตราการเติบโตเป็นเปอร์เซ็นต์ เพราะบนสเกล log ความชันเท่ากันแปลว่าเติบโตเท่ากันเป็นสัดส่วน
กราฟจะเริ่มพังเมื่อไร
เกิน 1,000 จุด เส้นจะกลายเป็นแถบทึบ — ลดความละเอียดลงหรือใช้ค่าเฉลี่ยเคลื่อนที่
หน้าตาไฟล์ที่ต้องเตรียม
date,value
…04อ่านแล้วเห็นอะไร
สิ่งที่เห็นได้จากภาพ
- ทิศทางโดยรวมว่าขึ้น ลง หรือทรงตัว
- จุดหักเหที่แนวโน้มเปลี่ยน
- อัตราเร็วของการเปลี่ยนแปลงจากความชัน
- ความผันผวนว่าเส้นเรียบหรือหยัก
สิ่งที่กราฟนี้ตอบไม่ได้
- ไม่บอกสาเหตุของการเปลี่ยนแปลง แม้จุดหักเหจะตรงกับเหตุการณ์ใดก็ตาม
- ไม่บอกว่าค่าระหว่างสองจุดที่วัดจริงเป็นเท่าไร — เส้นเป็นการเชื่อม ไม่ใช่การวัด
อ่านตามลำดับนี้
- ดูทิศทางรวมจากซ้ายไปขวาก่อน
- หาจุดที่ความชันเปลี่ยนอย่างชัดเจน
- ดูช่วงที่เส้นหยักมากซึ่งแปลว่าผันผวน
- ตรวจว่าแกนตั้งเริ่มที่เท่าไร
คำถามที่ตอบได้
- แนวโน้มกำลังไปทางไหน
- อะไรเปลี่ยนตั้งแต่เมื่อไร
- ตอนนี้เทียบกับช่วงเดียวกันปีก่อนเป็นอย่างไร
สัญญาณว่ามีอะไรผิด
- เส้นลากข้ามช่วงที่ไม่มีข้อมูล
- ช่วงห่างของแกนเวลาไม่เท่ากันแต่วาดเท่ากัน
- แกนตั้งถูกบีบจนความผันผวนปกติดูเหมือนวิกฤต
05เหมาะกับการนำเสนอแบบไหน
ทำอย่างไรให้คนอ่านได้ข้อสรุปโดยไม่ต้องบรรยาย
- ทำเครื่องหมายเหตุการณ์สำคัญด้วยเส้นแนวตั้งพร้อมป้าย
- ติดค่าล่าสุดไว้ปลายเส้นเสมอ
- ระบายพื้นหลังจาง ๆ ในช่วงที่ต้องการชี้ให้ดู
รูปแบบชื่อกราฟที่ควรใช้
<ตัวชี้วัด> <เพิ่ม/ลด> <ปริมาณ> ตั้งแต่ <เวลา> โดยเปลี่ยนทิศที่ <จุดหักเห>
06เอาไปใช้ต่อ
โค้ดทุกชิ้นอ่านไฟล์ line-chart-sample.csv ชุดเดียวกับที่ Playground ใช้ และตัวเลขในโค้ดเปลี่ยนตามค่าที่คุณปรับด้านล่าง
# ติดตั้ง: pip install "matplotlib==3.10.*" "pandas==2.*"
# ดาวน์โหลด line-chart-sample.csv จากหน้านี้ แล้ววางไว้ข้างสคริปต์
import matplotlib
matplotlib.use("Agg") # รันแบบไม่มีหน้าจอ ถ้ารันในเครื่องตัวเองลบบรรทัดนี้ได้
import matplotlib.pyplot as plt
import pandas as pd
C1, C2, C3 = "#2a78d6", "#eb6834", "#1baf7a" # palette ของคลัง เปลี่ยนเป็นสีองค์กรได้
INK, SURFACE = "#0b0b0b", "#fcfcfb"
df = pd.read_csv("line-chart-sample.csv")
df["value"] = pd.to_numeric(df["value"], errors="coerce")
SMOOTH = 1
ZEROBASELINE = "no" # ← ค่าจาก Playground
fig, ax = plt.subplots(figsize=(7.6, 4.2), facecolor=SURFACE)
ax.set_facecolor(SURFACE)
df["date"] = pd.to_datetime(df["date"])
d = df.sort_values("date")
y = d["value"].rolling(SMOOTH).mean() if SMOOTH > 1 else d["value"]
ax.plot(d["date"], y, color=C1, linewidth=2)
ax.scatter(d["date"].iloc[-1], y.iloc[-1], color=C1, zorder=3, s=40)
ax.annotate(f"{y.iloc[-1]:,.1f}", (d["date"].iloc[-1], y.iloc[-1]), xytext=(-8, 10),
textcoords="offset points", ha="right", fontsize=10)
ax.set_ylabel("ค่าที่วัดได้"); ax.grid(axis="y", alpha=0.25); ax.set_axisbelow(True)
fig.autofmt_xdate()
ax.spines[["top", "right"]].set_visible(False) # ลดเส้นที่ไม่ได้ให้ข้อมูล
fig.tight_layout()
fig.savefig("line-chart.png", dpi=160)
print("เขียน line-chart.png แล้ว ·", len(df), "แถว")07ลองเล่นเพื่อเข้าใจ
ดูข้อมูลเป็นตาราง (40 แถว)
| วันที่ | ค่า |
|---|---|
| 1/1/2568 | 101 |
| 8/1/2568 | 101 |
| 15/1/2568 | 100 |
| 22/1/2568 | 102 |
| 29/1/2568 | 103 |
| 5/2/2568 | 104 |
| 12/2/2568 | 107 |
| 19/2/2568 | 109 |
| 26/2/2568 | 109 |
| 5/3/2568 | 112 |
| 12/3/2568 | 116 |
| 19/3/2568 | 121 |
| 26/3/2568 | 118 |
| 2/4/2568 | 117 |
| 9/4/2568 | 114 |
| 16/4/2568 | 113 |
| 23/4/2568 | 114 |
| 30/4/2568 | 119 |
| 7/5/2568 | 123 |
| 14/5/2568 | 118 |
| 21/5/2568 | 113 |
| 28/5/2568 | 113 |
| 4/6/2568 | 113 |
| 11/6/2568 | 112 |
| 18/6/2568 | 113 |
| 25/6/2568 | 116 |
| 2/7/2568 | 117 |
| 9/7/2568 | 116 |
| 16/7/2568 | 114 |
| 23/7/2568 | 108 |
| 30/7/2568 | 107 |
| 6/8/2568 | 101 |
| 13/8/2568 | 103 |
| 20/8/2568 | 103 |
| 27/8/2568 | 102 |
| 3/9/2568 | 103 |
| 10/9/2568 | 107 |
| 17/9/2568 | 113 |
| 24/9/2568 | 111 |
| 1/10/2568 | 112 |
ลองแล้วจะเห็นอะไร
- หน้าต่างค่าเฉลี่ยเคลื่อนที่: เพิ่มขึ้นเรื่อย ๆ จะเห็นเส้นเรียบขึ้นและแนวโน้มชัดขึ้น แต่จุดสูงสุดและจุดหักเหจะค่อย ๆ หายไปด้วย
- เริ่มแกนที่ศูนย์: เปิดการเริ่มที่ศูนย์แล้วจะเห็นว่าความผันผวนที่ดูรุนแรงกลายเป็นเส้นเกือบแบน — ทั้งสองภาพมาจากข้อมูลเดียวกัน
ข้อควรระวัง
- ★ ลากเส้นข้ามช่วงที่ไม่มีข้อมูล ซึ่งเป็นการอ้างว่ารู้ค่าที่ไม่เคยวัด
- ใช้กราฟเส้นกับหมวดหมู่ที่ไม่ต่อเนื่อง เช่น ลากเส้นเชื่อมยอดขายรายจังหวัด
- วางจุดเวลาห่างเท่ากันทั้งที่ช่วงเวลาจริงไม่เท่ากัน
- ทำให้เส้นเรียบด้วยค่าเฉลี่ยเคลื่อนที่โดยไม่บอก ทำให้ผู้อ่านคิดว่าข้อมูลจริงนิ่งกว่าที่เป็น
- บีบแกนตั้งจนความผันผวนปกติดูเหมือนวิกฤต
เมื่อไหร่ไม่ควรใช้กราฟนี้
- แกนนอนเป็นหมวดหมู่ที่ไม่ต่อเนื่อง→ใช้แทน: bar-chart
- ค่าเปลี่ยนเป็นครั้ง ๆ ไม่ได้ไหลต่อเนื่อง เช่น ราคาที่ปรับเป็นขั้น→ใช้แทน: step-chart
- สนใจปริมาณสะสมมากกว่าทิศทาง→ใช้แทน: area-chart
- มีหลายอนุกรมที่ต้องเทียบกัน→ใช้แทน: multi-line-chart หรือ small-multiples