เทคนิคที่ 015 · PYTHON / JAVASCRIPT

กราฟเส้นLine Chart

ให้ความชันเล่าเรื่องว่าอะไรกำลังเกิดขึ้น

1
พื้นฐานควรรู้ก่อน · ไม่ต้องมีพื้นฐานมาก่อน
ลองเล่น

01ภาพรวมของกราฟนี้

Line chart เชื่อมค่าที่เรียงตามเวลาเข้าด้วยกัน สิ่งที่เราอ่านจริง ๆ ไม่ใช่ตำแหน่งของจุดแต่ละจุด แต่คือ "ความชัน" ซึ่งบอกอัตราการเปลี่ยนแปลง เส้นที่เชื่อมยังสื่อด้วยว่าค่าระหว่างจุดมีอยู่จริงและต่อเนื่อง จึงใช้ได้เฉพาะกับข้อมูลที่ต่อเนื่องจริง

เปรียบเทียบให้เห็นภาพ

เหมือนเส้นทางเดินป่าบนแผนที่ระดับความสูง เราไม่ได้สนใจว่าแต่ละหมุดสูงเท่าไร แต่สนใจว่าทางช่วงไหนชันขึ้น ช่วงไหนลงเขา

ใช้ที่ไหนบ้าง — ยอดขายรายเดือน จำนวนผู้ใช้รายวัน ราคาหุ้น อุณหภูมิ หรือทุกอย่างที่วัดซ้ำตามเวลา

สร้างอย่างไร

  1. ขั้นที่ 1เรียงข้อมูลตามเวลา
  2. ขั้นที่ 2ตรวจว่าช่วงห่างระหว่างจุดสม่ำเสมอ
  3. ขั้นที่ 3วาดเส้นเชื่อมจุด
  4. ขั้นที่ 4ติดป้ายเฉพาะจุดที่จะพูดถึง

ตัวอย่างคลาสสิก · กราฟเส้นเศรษฐกิจของ William Playfair ปี 1786

Playfair วาดมูลค่าการนำเข้าและส่งออกของอังกฤษตามปีเป็นเส้นสองเส้น แล้วระบายพื้นที่ระหว่างเส้นเพื่อแสดงดุลการค้า นี่เป็นครั้งแรกที่มีคนใช้แกนนอนแทนเวลาอย่างเป็นระบบ และเป็นรูปแบบที่เรายังใช้เหมือนเดิมทุกวันนี้

Wikipedia · William Playfair

02อธิบายภาษาคนเข้าใจง่าย ๆ

กราฟเส้นต่างจากกราฟแท่งตรงที่มันไม่ได้ให้เราอ่านค่าทีละค่า แต่ให้เราอ่าน "รูปร่างของการเปลี่ยนแปลง" ทั้งเส้นพร้อมกัน สมองเราจับความชันได้เร็วกว่าการเทียบตัวเลขทีละคู่มาก

เพราะเส้นเชื่อมจุด มันจึงบอกโดยนัยว่า "ระหว่างสองจุดนี้มีค่าอยู่จริงและไหลต่อเนื่อง" ข้อนี้สำคัญ ถ้าข้อมูลเป็นหมวดหมู่ที่ไม่ต่อเนื่อง เช่น ยอดขายรายจังหวัด การลากเส้นเชื่อมจะเป็นการโกหก

ช่วงห่างของเวลาต้องสม่ำเสมอ ถ้าข้อมูลบางช่วงเก็บทุกวันแต่บางช่วงเก็บทุกเดือน แล้ววาดจุดห่างเท่ากันหมด ความชันจะผิดทั้งกราฟ ต้องวางตำแหน่งตามเวลาจริงเสมอ

ต่างจากกราฟแท่ง กราฟเส้นไม่จำเป็นต้องเริ่มที่ศูนย์ เพราะเราอ่านความชันไม่ได้อ่านความยาว การซูมเข้าไปที่ช่วงที่ข้อมูลอยู่จริงมักทำให้เห็นรูปแบบได้ชัดกว่า แต่ต้องเขียนบอกว่าแกนเริ่มที่เท่าไร

สิ่งที่ต้องระวังคือการทำให้เส้นเรียบเกินไป การใช้ค่าเฉลี่ยเคลื่อนที่ช่วยลดสัญญาณรบกวนได้จริง แต่ก็ลบจุดหักเหและค่าผิดปกติที่อาจเป็นเรื่องสำคัญที่สุดออกไปด้วย

03ข้อมูลที่ต้องใช้

รูปทรงของข้อมูลอนุกรมเวลา
จำนวนมิติที่เข้ารหัสได้2 มิติ
จำนวนแถวที่เหมาะ20–200 จุดเวลาขั้นต่ำ 5 แถว
เส้นฐานศูนย์เลือกได้อ่านจากความชัน ไม่ใช่ความยาวจากศูนย์ การซูมเข้าช่วงที่มีข้อมูลจึงทำได้ แต่ต้องระบุว่าแกนไม่ได้เริ่มที่ศูนย์

คอลัมน์ที่ต้องเตรียม

คอลัมน์ทำหน้าที่ชนิดเข้ารหัสด้วยจำนวนค่าที่เหมาะหมายเหตุ
dateเวลาเวลาx10–500 จุดต้องเรียงลำดับและมีช่วงห่างสม่ำเสมอ ถ้าไม่สม่ำเสมอต้องวางตามเวลาจริง ไม่ใช่เรียงเท่า ๆ กัน
valueค่าที่วัดได้ตัวเลขต่อเนื่องyต่อเนื่องต้องเป็นสิ่งเดียวกันตลอดช่วงเวลา ถ้านิยามเปลี่ยนกลางทางต้องทำเครื่องหมาย

ต้องเตรียมข้อมูลอย่างไรก่อนวาด

  1. เรียงตามเวลา
  2. ตรวจช่องว่างของเวลาที่หายไป
  3. ตัดสินใจว่าจะเติมค่าที่หายหรือทิ้งช่องว่างไว้
  4. ตรวจว่านิยามของตัวชี้วัดไม่เปลี่ยนกลางทาง

ค่าที่หายไป — ★ ห้ามลากเส้นข้ามช่วงที่ไม่มีข้อมูล ต้องหักเส้นให้เห็นช่องว่าง เพราะการลากข้ามคือการอ้างว่ารู้ค่าที่ไม่ได้วัด

สเกลของแกน — linear เป็นค่าเริ่มต้น ใช้ log เมื่อสนใจอัตราการเติบโตเป็นเปอร์เซ็นต์ เพราะบนสเกล log ความชันเท่ากันแปลว่าเติบโตเท่ากันเป็นสัดส่วน

กราฟจะเริ่มพังเมื่อไร

เกิน 1,000 จุด เส้นจะกลายเป็นแถบทึบ — ลดความละเอียดลงหรือใช้ค่าเฉลี่ยเคลื่อนที่

หน้าตาไฟล์ที่ต้องเตรียม

date,value

04อ่านแล้วเห็นอะไร

สิ่งที่เห็นได้จากภาพ

  • ทิศทางโดยรวมว่าขึ้น ลง หรือทรงตัว
  • จุดหักเหที่แนวโน้มเปลี่ยน
  • อัตราเร็วของการเปลี่ยนแปลงจากความชัน
  • ความผันผวนว่าเส้นเรียบหรือหยัก

สิ่งที่กราฟนี้ตอบไม่ได้

  • ไม่บอกสาเหตุของการเปลี่ยนแปลง แม้จุดหักเหจะตรงกับเหตุการณ์ใดก็ตาม
  • ไม่บอกว่าค่าระหว่างสองจุดที่วัดจริงเป็นเท่าไร — เส้นเป็นการเชื่อม ไม่ใช่การวัด

อ่านตามลำดับนี้

  1. ดูทิศทางรวมจากซ้ายไปขวาก่อน
  2. หาจุดที่ความชันเปลี่ยนอย่างชัดเจน
  3. ดูช่วงที่เส้นหยักมากซึ่งแปลว่าผันผวน
  4. ตรวจว่าแกนตั้งเริ่มที่เท่าไร

คำถามที่ตอบได้

  • แนวโน้มกำลังไปทางไหน
  • อะไรเปลี่ยนตั้งแต่เมื่อไร
  • ตอนนี้เทียบกับช่วงเดียวกันปีก่อนเป็นอย่างไร

สัญญาณว่ามีอะไรผิด

  • เส้นลากข้ามช่วงที่ไม่มีข้อมูล
  • ช่วงห่างของแกนเวลาไม่เท่ากันแต่วาดเท่ากัน
  • แกนตั้งถูกบีบจนความผันผวนปกติดูเหมือนวิกฤต

05เหมาะกับการนำเสนอแบบไหน

ผู้ชมที่เหมาะทุกคน กราฟเส้นเป็นรูปแบบที่คนคุ้นเคยที่สุดรองจากกราฟแท่ง
เวลาที่ผู้ชมต้องใช้ทันที
ขนาดเล็กสุดที่ยังอ่านได้320×200 px
สไลด์ผู้บริหาร
รายงานเชิงวิเคราะห์
dashboard ที่อัปเดตตลอด
สิ่งพิมพ์
สื่อสารกับคนทั่วไป
มือถือถ้าจุดเวลาเยอะ เส้นจะบีบจนอ่านจุดหักเหไม่ออก ให้ลดช่วงเวลาที่แสดง

ทำอย่างไรให้คนอ่านได้ข้อสรุปโดยไม่ต้องบรรยาย

  1. ทำเครื่องหมายเหตุการณ์สำคัญด้วยเส้นแนวตั้งพร้อมป้าย
  2. ติดค่าล่าสุดไว้ปลายเส้นเสมอ
  3. ระบายพื้นหลังจาง ๆ ในช่วงที่ต้องการชี้ให้ดู

รูปแบบชื่อกราฟที่ควรใช้

<ตัวชี้วัด> <เพิ่ม/ลด> <ปริมาณ> ตั้งแต่ <เวลา> โดยเปลี่ยนทิศที่ <จุดหักเห>

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), "แถว")

ติดตั้ง: pip install "matplotlib==3.10.*" "pandas==2.*" · ทดสอบกับเวอร์ชัน 3.10

07ลองเล่นเพื่อเข้าใจ

ข้อมูลตัวอย่าง · 40 แถว · seed 17● คำนวณใหม่ในเบราว์เซอร์ทันทีที่ปรับค่า
จำนวนจุดที่นำมาเฉลี่ย
สลับดูผลของการเลือกช่วงแกน
100105110115120125ก.พ. 68เม.ย. 68มิ.ย. 68ส.ค. 681/1/2568 · 1018/1/2568 · 10115/1/2568 · 10022/1/2568 · 10229/1/2568 · 1035/2/2568 · 10412/2/2568 · 10719/2/2568 · 10926/2/2568 · 1095/3/2568 · 11212/3/2568 · 11619/3/2568 · 12126/3/2568 · 1182/4/2568 · 1179/4/2568 · 11416/4/2568 · 11323/4/2568 · 11430/4/2568 · 1197/5/2568 · 12314/5/2568 · 11821/5/2568 · 11328/5/2568 · 1134/6/2568 · 11311/6/2568 · 11218/6/2568 · 11325/6/2568 · 1162/7/2568 · 1179/7/2568 · 11616/7/2568 · 11423/7/2568 · 10830/7/2568 · 1076/8/2568 · 10113/8/2568 · 10320/8/2568 · 10327/8/2568 · 1023/9/2568 · 10310/9/2568 · 10717/9/2568 · 11324/9/2568 · 1111/10/2568 · 112112
เปลี่ยนจากจุดเริ่ม+10.9%
จุดสูงสุด123 · 7/5/2568
ค่าเฉลี่ย110
ดูข้อมูลเป็นตาราง (40 แถว)
กราฟเส้น 40 จุดเวลา เปลี่ยนแปลง 10.9% จากจุดเริ่ม
วันที่ค่า
1/1/2568101
8/1/2568101
15/1/2568100
22/1/2568102
29/1/2568103
5/2/2568104
12/2/2568107
19/2/2568109
26/2/2568109
5/3/2568112
12/3/2568116
19/3/2568121
26/3/2568118
2/4/2568117
9/4/2568114
16/4/2568113
23/4/2568114
30/4/2568119
7/5/2568123
14/5/2568118
21/5/2568113
28/5/2568113
4/6/2568113
11/6/2568112
18/6/2568113
25/6/2568116
2/7/2568117
9/7/2568116
16/7/2568114
23/7/2568108
30/7/2568107
6/8/2568101
13/8/2568103
20/8/2568103
27/8/2568102
3/9/2568103
10/9/2568107
17/9/2568113
24/9/2568111
1/10/2568112

ลองแล้วจะเห็นอะไร

  • หน้าต่างค่าเฉลี่ยเคลื่อนที่: เพิ่มขึ้นเรื่อย ๆ จะเห็นเส้นเรียบขึ้นและแนวโน้มชัดขึ้น แต่จุดสูงสุดและจุดหักเหจะค่อย ๆ หายไปด้วย
  • เริ่มแกนที่ศูนย์: เปิดการเริ่มที่ศูนย์แล้วจะเห็นว่าความผันผวนที่ดูรุนแรงกลายเป็นเส้นเกือบแบน — ทั้งสองภาพมาจากข้อมูลเดียวกัน

ข้อควรระวัง

  1. ★ ลากเส้นข้ามช่วงที่ไม่มีข้อมูล ซึ่งเป็นการอ้างว่ารู้ค่าที่ไม่เคยวัด
  2. ใช้กราฟเส้นกับหมวดหมู่ที่ไม่ต่อเนื่อง เช่น ลากเส้นเชื่อมยอดขายรายจังหวัด
  3. วางจุดเวลาห่างเท่ากันทั้งที่ช่วงเวลาจริงไม่เท่ากัน
  4. ทำให้เส้นเรียบด้วยค่าเฉลี่ยเคลื่อนที่โดยไม่บอก ทำให้ผู้อ่านคิดว่าข้อมูลจริงนิ่งกว่าที่เป็น
  5. บีบแกนตั้งจนความผันผวนปกติดูเหมือนวิกฤต

เมื่อไหร่ไม่ควรใช้กราฟนี้

  • แกนนอนเป็นหมวดหมู่ที่ไม่ต่อเนื่องใช้แทน: bar-chart
  • ค่าเปลี่ยนเป็นครั้ง ๆ ไม่ได้ไหลต่อเนื่อง เช่น ราคาที่ปรับเป็นขั้นใช้แทน: step-chart
  • สนใจปริมาณสะสมมากกว่าทิศทางใช้แทน: area-chart
  • มีหลายอนุกรมที่ต้องเทียบกันใช้แทน: multi-line-chart หรือ small-multiples

กราฟที่เกี่ยวข้อง

เทคนิคถัดไป · กราฟหลายเส้น