01ภาพรวมของกราฟนี้
Area chart คือกราฟเส้นที่ระบายพื้นที่ใต้เส้น การระบายเปลี่ยนสิ่งที่ตาเน้นจาก "ความชัน" ไปเป็น "ปริมาณ" จึงเหมาะกับค่าที่มีศูนย์ที่มีความหมายและสะสมได้ เช่น ยอดขายหรือจำนวนคน แต่ไม่เหมาะกับอุณหภูมิหรือดัชนี
เปรียบเทียบให้เห็นภาพ
เหมือนดูปริมาณน้ำในอ่างตามเวลา เราสนใจว่ามีน้ำอยู่เท่าไร ไม่ได้สนใจแค่ว่าระดับกำลังขึ้นหรือลง
ใช้ที่ไหนบ้าง — ยอดขายรวมตามเวลา จำนวนผู้ใช้สะสม ปริมาณการใช้พลังงาน หรือค่าที่ต้องการเน้นขนาดไม่ใช่แค่ทิศทาง
สร้างอย่างไร
- ขั้นที่ 1ตรวจว่าค่ามีศูนย์ที่มีความหมาย
- ขั้นที่ 2วาดเส้นตามเวลา
- ขั้นที่ 3ระบายพื้นที่ลงถึงเส้นศูนย์
- ขั้นที่ 4ใช้สีอ่อนเพื่อไม่ให้พื้นที่กลบเส้น
ตัวอย่างคลาสสิก · กราฟดุลการค้าของ Playfair ที่ระบายพื้นที่ระหว่างสองเส้น
Playfair ระบายช่องว่างระหว่างเส้นนำเข้าและส่งออกเพื่อให้เห็นว่าอังกฤษขาดดุลหรือเกินดุลอยู่เท่าไร นี่คือการใช้พื้นที่เพื่อแทนปริมาณสะสมเป็นครั้งแรก และยังเป็นเหตุผลเดียวกับที่เราใช้กราฟพื้นที่ในวันนี้
02อธิบายภาษาคนเข้าใจง่าย ๆ
กราฟพื้นที่กับกราฟเส้นใช้ข้อมูลชุดเดียวกัน ต่างกันแค่ว่าอันหนึ่งระบายพื้นที่ใต้เส้น แต่การระบายนั้นเปลี่ยนสิ่งที่ผู้อ่านเห็นเป็นอันดับแรกไปเลย
เมื่อมีพื้นที่ทึบ ตาจะไปจับที่ "ขนาดของก้อน" ก่อนความชัน นี่คือเหตุผลที่กราฟพื้นที่เหมาะกับปริมาณที่สะสมได้จริง เช่น ยอดขายหรือจำนวนคน
ข้อบังคับที่ตามมาคือแกนต้องเริ่มที่ศูนย์ เพราะพื้นที่ที่ระบายคือระยะจากเส้นฐาน ถ้าเส้นฐานไม่ใช่ศูนย์ ขนาดของพื้นที่จะไม่มีความหมายใด ๆ
ในทางกลับกัน ถ้าข้อมูลไม่มีศูนย์ที่มีความหมาย เช่น อุณหภูมิเป็นองศาเซลเซียส หรือดัชนีหุ้น การระบายพื้นที่จะสื่อสิ่งที่ไม่จริง เพราะ "พื้นที่ใต้เส้นอุณหภูมิ" ไม่ได้แทนอะไร
ข้อควรระวังสุดท้ายคือสีต้องอ่อนพอที่เส้นขอบบนยังเห็นชัด ไม่อย่างนั้นความชันซึ่งยังเป็นข้อมูลสำคัญจะถูกกลบด้วยก้อนสี
03ข้อมูลที่ต้องใช้
คอลัมน์ที่ต้องเตรียม
| คอลัมน์ | ทำหน้าที่ | ชนิด | เข้ารหัสด้วย | จำนวนค่าที่เหมาะ | หมายเหตุ |
|---|---|---|---|---|---|
date | เวลา | เวลา | x | 10–200 จุด | ต้องเรียงและช่วงห่างสม่ำเสมอ |
value | ปริมาณ | ตัวเลขต่อเนื่อง | y | บวกและมีศูนย์ที่มีความหมาย | ★ ถ้าศูนย์ไม่มีความหมาย เช่น อุณหภูมิ ห้ามใช้กราฟพื้นที่ |
ต้องเตรียมข้อมูลอย่างไรก่อนวาด
- ตรวจว่าค่ามีศูนย์ที่มีความหมาย
- เรียงตามเวลา
- ตรวจค่าติดลบซึ่งทำให้พื้นที่กลับด้าน
ค่าที่หายไป — หักพื้นที่ตรงช่วงที่ไม่มีข้อมูล ห้ามระบายต่อเนื่องข้ามช่องว่างเพราะจะดูเหมือนมีปริมาณอยู่จริง
สเกลของแกน — linear เริ่มที่ศูนย์เท่านั้น สเกล log ทำให้พื้นที่ไม่มีความหมาย
กราฟจะเริ่มพังเมื่อไร
ถ้าข้อมูลผันผวนรุนแรงมาก พื้นที่จะกลายเป็นหยักทึบที่อ่านไม่ออก
หน้าตาไฟล์ที่ต้องเตรียม
date,value
…04อ่านแล้วเห็นอะไร
สิ่งที่เห็นได้จากภาพ
- ขนาดของปริมาณในแต่ละช่วงเวลา
- ทิศทางของแนวโน้มจากขอบบนของพื้นที่
- ช่วงที่ปริมาณสูงต่อเนื่องซึ่งเห็นเป็นก้อนหนา
สิ่งที่กราฟนี้ตอบไม่ได้
- อ่านค่าที่จุดเดียวได้ยากกว่ากราฟเส้น เพราะตาถูกดึงไปที่ก้อนสี
- ไม่เหมาะกับการเทียบสองอนุกรมซ้อนทับกันเพราะพื้นที่จะบังกัน
อ่านตามลำดับนี้
- ดูขอบบนของพื้นที่เพื่ออ่านแนวโน้ม
- ดูความหนาของก้อนเพื่อรู้สึกถึงปริมาณ
- ตรวจว่าแกนเริ่มที่ศูนย์
คำถามที่ตอบได้
- ปริมาณรวมในช่วงนี้มากแค่ไหน
- ช่วงไหนที่ปริมาณสูงต่อเนื่อง
สัญญาณว่ามีอะไรผิด
- แกนไม่เริ่มที่ศูนย์ ทำให้พื้นที่โกหก
- ใช้กับข้อมูลที่ศูนย์ไม่มีความหมาย
- สีทึบจนเส้นขอบบนมองไม่เห็น
05เหมาะกับการนำเสนอแบบไหน
ทำอย่างไรให้คนอ่านได้ข้อสรุปโดยไม่ต้องบรรยาย
- ติดค่าล่าสุดไว้ปลายพื้นที่
- ใช้สีอ่อนสำหรับพื้นที่และสีเข้มสำหรับเส้นขอบบน
- ทำเครื่องหมายช่วงที่ต้องการชี้ให้ดู
รูปแบบชื่อกราฟที่ควรใช้
ปริมาณ <ตัวชี้วัด> เพิ่มขึ้นต่อเนื่องตั้งแต่ <เวลา> จนถึง <ค่า>
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), "แถว")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 |
ลองแล้วจะเห็นอะไร
- เริ่มแกนที่ศูนย์: ปิดการเริ่มที่ศูนย์แล้วสังเกตว่า "ก้อนสี" ที่เห็นไม่ได้แทนปริมาณอะไรอีกต่อไป ทั้งที่ภาพยังดูน่าเชื่อถือ
ข้อควรระวัง
- ใช้กับข้อมูลที่ศูนย์ไม่มีความหมาย เช่น อุณหภูมิหรือดัชนี
- ตัดแกนไม่ให้เริ่มที่ศูนย์ ทำให้พื้นที่ไม่แทนปริมาณอีกต่อไป
- ซ้อนพื้นที่ของสองอนุกรมทับกันจนบังกัน
- ใช้สีทึบจนเส้นขอบบนที่เป็นข้อมูลจริงมองไม่เห็น
เมื่อไหร่ไม่ควรใช้กราฟนี้
- ศูนย์ไม่มีความหมายสำหรับตัวชี้วัดนี้→ใช้แทน: line-chart
- ต้องเทียบหลายอนุกรม→ใช้แทน: multi-line-chart หรือ stacked-area ถ้าสนใจยอดรวม
- ต้องอ่านค่าที่จุดใดจุดหนึ่งให้แม่น→ใช้แทน: line-chart