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

กราฟพื้นที่Area Chart

เน้นปริมาณสะสม ไม่ใช่แค่ทิศทาง

2
ต่อยอดโดยตรงควรรู้ก่อน · อ่านกราฟเส้นเป็น
ลองเล่น

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

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

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

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

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

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

  1. ขั้นที่ 1ตรวจว่าค่ามีศูนย์ที่มีความหมาย
  2. ขั้นที่ 2วาดเส้นตามเวลา
  3. ขั้นที่ 3ระบายพื้นที่ลงถึงเส้นศูนย์
  4. ขั้นที่ 4ใช้สีอ่อนเพื่อไม่ให้พื้นที่กลบเส้น

ตัวอย่างคลาสสิก · กราฟดุลการค้าของ Playfair ที่ระบายพื้นที่ระหว่างสองเส้น

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

Wikipedia · William Playfair

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

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

เมื่อมีพื้นที่ทึบ ตาจะไปจับที่ "ขนาดของก้อน" ก่อนความชัน นี่คือเหตุผลที่กราฟพื้นที่เหมาะกับปริมาณที่สะสมได้จริง เช่น ยอดขายหรือจำนวนคน

ข้อบังคับที่ตามมาคือแกนต้องเริ่มที่ศูนย์ เพราะพื้นที่ที่ระบายคือระยะจากเส้นฐาน ถ้าเส้นฐานไม่ใช่ศูนย์ ขนาดของพื้นที่จะไม่มีความหมายใด ๆ

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

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

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

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

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

คอลัมน์ทำหน้าที่ชนิดเข้ารหัสด้วยจำนวนค่าที่เหมาะหมายเหตุ
dateเวลาเวลาx10–200 จุดต้องเรียงและช่วงห่างสม่ำเสมอ
valueปริมาณตัวเลขต่อเนื่องyบวกและมีศูนย์ที่มีความหมาย★ ถ้าศูนย์ไม่มีความหมาย เช่น อุณหภูมิ ห้ามใช้กราฟพื้นที่

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

  1. ตรวจว่าค่ามีศูนย์ที่มีความหมาย
  2. เรียงตามเวลา
  3. ตรวจค่าติดลบซึ่งทำให้พื้นที่กลับด้าน

ค่าที่หายไป — หักพื้นที่ตรงช่วงที่ไม่มีข้อมูล ห้ามระบายต่อเนื่องข้ามช่องว่างเพราะจะดูเหมือนมีปริมาณอยู่จริง

สเกลของแกน — linear เริ่มที่ศูนย์เท่านั้น สเกล log ทำให้พื้นที่ไม่มีความหมาย

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

ถ้าข้อมูลผันผวนรุนแรงมาก พื้นที่จะกลายเป็นหยักทึบที่อ่านไม่ออก

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

date,value

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

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

  • ขนาดของปริมาณในแต่ละช่วงเวลา
  • ทิศทางของแนวโน้มจากขอบบนของพื้นที่
  • ช่วงที่ปริมาณสูงต่อเนื่องซึ่งเห็นเป็นก้อนหนา

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

  • อ่านค่าที่จุดเดียวได้ยากกว่ากราฟเส้น เพราะตาถูกดึงไปที่ก้อนสี
  • ไม่เหมาะกับการเทียบสองอนุกรมซ้อนทับกันเพราะพื้นที่จะบังกัน

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

  1. ดูขอบบนของพื้นที่เพื่ออ่านแนวโน้ม
  2. ดูความหนาของก้อนเพื่อรู้สึกถึงปริมาณ
  3. ตรวจว่าแกนเริ่มที่ศูนย์

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

  • ปริมาณรวมในช่วงนี้มากแค่ไหน
  • ช่วงไหนที่ปริมาณสูงต่อเนื่อง

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

  • แกนไม่เริ่มที่ศูนย์ ทำให้พื้นที่โกหก
  • ใช้กับข้อมูลที่ศูนย์ไม่มีความหมาย
  • สีทึบจนเส้นขอบบนมองไม่เห็น

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

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

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

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

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

ปริมาณ <ตัวชี้วัด> เพิ่มขึ้นต่อเนื่องตั้งแต่ <เวลา> จนถึง <ค่า>

06เอาไปใช้ต่อ

โค้ดทุกชิ้นอ่านไฟล์ area-chart-sample.csv ชุดเดียวกับที่ Playground ใช้ และตัวเลขในโค้ดเปลี่ยนตามค่าที่คุณปรับด้านล่าง

# ติดตั้ง: pip install "matplotlib==3.10.*" "pandas==2.*"
# ดาวน์โหลด area-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("area-chart-sample.csv")
df["value"] = pd.to_numeric(df["value"], errors="coerce")
ZEROBASELINE = "yes"   # ← ค่าจาก 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")
ax.fill_between(d["date"], d["value"], color="#9ec5f4", alpha=0.7)   # สีอ่อนเพื่อไม่กลบเส้น
ax.plot(d["date"], d["value"], color=C1, linewidth=2)
ax.set_ylim(0, None)     # กราฟพื้นที่ต้องเริ่มที่ศูนย์เสมอ
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("area-chart.png", dpi=160)
print("เขียน area-chart.png แล้ว ·", len(df), "แถว")

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

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

ข้อมูลตัวอย่าง · 40 แถว · seed 17● คำนวณใหม่ในเบราว์เซอร์ทันทีที่ปรับค่า
สลับเพื่อเห็นว่าทำไมกราฟพื้นที่ต้องเริ่มที่ศูนย์
0.0050.0100150ก.พ. 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. ใช้สีทึบจนเส้นขอบบนที่เป็นข้อมูลจริงมองไม่เห็น

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

  • ศูนย์ไม่มีความหมายสำหรับตัวชี้วัดนี้ใช้แทน: line-chart
  • ต้องเทียบหลายอนุกรมใช้แทน: multi-line-chart หรือ stacked-area ถ้าสนใจยอดรวม
  • ต้องอ่านค่าที่จุดใดจุดหนึ่งให้แม่นใช้แทน: line-chart

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

เทคนิคถัดไป · กราฟพื้นที่ซ้อน