01ภาพรวมของกราฟนี้
Stacked area chart คือ stacked bar ที่แกนนอนเป็นเวลาต่อเนื่อง ขอบบนสุดบอกยอดรวมและแต่ละชั้นบอกส่วนประกอบ ข้อจำกัดเหมือนกันคือมีเพียงชั้นล่างสุดที่วางบนเส้นฐานเรียบ ชั้นบน ๆ ต้องขึ้นลงตามชั้นล่างจนอ่านรูปร่างของตัวเองยาก
เปรียบเทียบให้เห็นภาพ
เหมือนดูภาพตัดขวางของชั้นหินที่ทับถมตามเวลา ชั้นล่างสุดวางบนพื้นเรียบจึงอ่านความหนาได้ง่าย ส่วนชั้นบนต้องขึ้นลงตามพื้นผิวของชั้นล่าง
ใช้ที่ไหนบ้าง — ยอดขายรวมรายเดือนแยกตามสินค้า จำนวนผู้ใช้รวมแยกตามแพลตฟอร์ม หรือการใช้พลังงานรวมแยกตามแหล่ง
สร้างอย่างไร
- ขั้นที่ 1ตรวจว่าค่าบวกกันได้จริง
- ขั้นที่ 2กำหนดลำดับการซ้อนให้คงที่
- ขั้นที่ 3วางอนุกรมที่นิ่งที่สุดไว้ชั้นล่าง
- ขั้นที่ 4ใส่ legend เรียงตามลำดับการซ้อน
ตัวอย่างคลาสสิก · องค์ประกอบการผลิตไฟฟ้าตามแหล่งพลังงานในรอบยี่สิบปี
กราฟพื้นที่ซ้อนกลายเป็นรูปแบบมาตรฐานของข้อมูลพลังงาน เพราะผู้อ่านสนใจทั้งกำลังผลิตรวมที่โตขึ้นและสัดส่วนของพลังงานหมุนเวียนที่เพิ่มขึ้น และเพราะหน่วยเป็นกิโลวัตต์ชั่วโมงซึ่งบวกกันได้จริง การซ้อนจึงมีความหมาย
02อธิบายภาษาคนเข้าใจง่าย ๆ
เมื่ออยากรู้ทั้งยอดรวมตามเวลาและว่าใครประกอบอยู่ข้างใน การซ้อนพื้นที่ต่อกันตอบได้ทั้งสองอย่าง ขอบบนสุดคือยอดรวม และความหนาของแต่ละชั้นคือส่วนแบ่ง
ปัญหาที่เกิดขึ้นเสมอคือ ชั้นที่อยู่บนต้องลอยตามชั้นล่าง ถ้าชั้นล่างขึ้นลงแรง ชั้นบนจะดูเหมือนขึ้นลงตามทั้งที่ค่าของมันเองอาจนิ่งสนิท คนอ่านจะตีความผิดได้ง่ายมาก
ทางแก้เชิงปฏิบัติคือวางอนุกรมที่นิ่งที่สุดหรือใหญ่ที่สุดไว้ชั้นล่าง และวางอนุกรมที่เราอยากให้คนอ่านรูปร่างได้ชัดไว้ชั้นล่างสุดเช่นกัน
ข้อบังคับที่เหมือนกับพื้นที่ปกติคือค่าต้องบวกกันได้จริง ถ้าเป็นอัตราส่วนหรือเปอร์เซ็นต์ของคนละฐาน การซ้อนจะไม่มีความหมายทางคณิตศาสตร์เลย
ถ้าคำถามคือสัดส่วนไม่ใช่ยอดรวม ให้เปลี่ยนไปใช้แบบ 100% ซ้อน ซึ่งขอบบนจะแบนเรียบและอ่านสัดส่วนได้ตรง
03ข้อมูลที่ต้องใช้
คอลัมน์ที่ต้องเตรียม
| คอลัมน์ | ทำหน้าที่ | ชนิด | เข้ารหัสด้วย | จำนวนค่าที่เหมาะ | หมายเหตุ |
|---|---|---|---|---|---|
date | เวลา | เวลา | x | 10–150 จุด | ทุกอนุกรมต้องมีจุดเวลาตรงกัน |
series | อนุกรมที่ซ้อน | หมวดหมู่ | color | 2–5 ชั้น | เกิน 5 ชั้นจะบางจนอ่านไม่ออก |
value | ปริมาณ | ตัวเลขต่อเนื่อง | y | บวกเท่านั้น | ต้องเป็นค่าที่บวกกันได้จริง ไม่ใช่อัตราส่วนคนละฐาน |
ต้องเตรียมข้อมูลอย่างไรก่อนวาด
- ตรวจว่าทุกอนุกรมมีจุดเวลาครบตรงกัน
- กำหนดลำดับการซ้อนโดยวางอนุกรมที่นิ่งไว้ล่างสุด
- รวมอนุกรมเล็กเป็น "อื่น ๆ"
ค่าที่หายไป — ถ้าอนุกรมใดขาดข้อมูลในช่วงหนึ่ง ยอดรวมจะต่ำกว่าความจริงโดยที่ภาพยังดูปกติ ต้องทำเครื่องหมายช่วงนั้นให้ชัด
สเกลของแกน — linear เริ่มที่ศูนย์ เพราะการซ้อนอาศัยสมบัติการบวก
กราฟจะเริ่มพังเมื่อไร
เกิน 6 ชั้น ชั้นบางจะหายไป และถ้าชั้นล่างผันผวนแรงชั้นบนจะอ่านไม่ได้เลย
หน้าตาไฟล์ที่ต้องเตรียม
date,series,value
…04อ่านแล้วเห็นอะไร
สิ่งที่เห็นได้จากภาพ
- ยอดรวมเปลี่ยนไปอย่างไรตามเวลา จากขอบบนสุด
- ชั้นล่างสุดเปลี่ยนอย่างไร ซึ่งเป็นชั้นเดียวที่อ่านรูปร่างได้ตรง
- ชั้นไหนหนาขึ้นหรือบางลงตามเวลา
สิ่งที่กราฟนี้ตอบไม่ได้
- ★ อ่านรูปร่างของชั้นที่ไม่ใช่ชั้นล่างสุดได้ยากมาก เพราะมันลอยตามชั้นล่าง
- ไม่บอกสัดส่วนโดยตรง ต้องใช้แบบ 100% ซ้อน
อ่านตามลำดับนี้
- ดูขอบบนสุดก่อนเพื่ออ่านยอดรวม
- ดูชั้นล่างสุดซึ่งอ่านได้ตรง
- ดูความหนาของชั้นอื่นที่จุดเวลาเดียวกัน ไม่ใช่ดูรูปร่างของมัน
คำถามที่ตอบได้
- ยอดรวมโตขึ้นไหม
- การเติบโตมาจากอนุกรมไหน
- มีอนุกรมไหนที่หดตัวลง
สัญญาณว่ามีอะไรผิด
- ชั้นล่างผันผวนแรงจนชั้นบนดูเหมือนผันผวนตาม
- ชั้นบางจำนวนมากที่มองไม่เห็น
- ซ้อนค่าที่บวกกันไม่ได้
05เหมาะกับการนำเสนอแบบไหน
ทำอย่างไรให้คนอ่านได้ข้อสรุปโดยไม่ต้องบรรยาย
- ติดชื่ออนุกรมไว้กลางชั้นที่หนาพอ
- เขียนยอดรวมล่าสุดไว้ปลายขอบบน
- ถ้าต้องการให้คนอ่านรูปร่างของอนุกรมหนึ่ง ให้แยกออกมาเป็นกราฟเล็กข้าง ๆ
รูปแบบชื่อกราฟที่ควรใช้
ยอดรวมโตจาก <ค่า> เป็น <ค่า> โดยการเติบโตมาจาก <อนุกรม> เป็นหลัก
06เอาไปใช้ต่อ
โค้ดทุกชิ้นอ่านไฟล์ stacked-area-sample.csv ชุดเดียวกับที่ Playground ใช้ และตัวเลขในโค้ดเปลี่ยนตามค่าที่คุณปรับด้านล่าง
# ติดตั้ง: pip install "matplotlib==3.10.*" "pandas==2.*"
# ดาวน์โหลด stacked-area-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("stacked-area-sample.csv")
df["value"] = pd.to_numeric(df["value"], errors="coerce")
NOTE = "middle" # ← ค่าจาก Playground
fig, ax = plt.subplots(figsize=(7.6, 4.2), facecolor=SURFACE)
ax.set_facecolor(SURFACE)
df["date"] = pd.to_datetime(df["date"])
pivot = df.pivot_table(index="date", columns="series", values="value", aggfunc="sum").fillna(0)
ax.stackplot(pivot.index, *[pivot[c] for c in pivot.columns], labels=list(pivot.columns),
colors=[C1, C2, C3][: len(pivot.columns)], edgecolor=SURFACE, linewidth=1.2)
ax.set_ylim(0, None) # การซ้อนอาศัยสมบัติการบวก จึงต้องเริ่มที่ศูนย์
ax.legend(frameon=False, ncols=3, loc="upper left")
fig.autofmt_xdate()
ax.spines[["top", "right"]].set_visible(False) # ลดเส้นที่ไม่ได้ให้ข้อมูล
fig.tight_layout()
fig.savefig("stacked-area.png", dpi=160)
print("เขียน stacked-area.png แล้ว ·", len(df), "แถว")07ลองเล่นเพื่อเข้าใจ
ดูข้อมูลเป็นตาราง (26 แถว)
| วันที่ | หน้าร้าน | เว็บไซต์ | แอป |
|---|---|---|---|
| 1/1/2568 | 70.7 | 53.4 | 31.7 |
| 8/1/2568 | 71.3 | 56.1 | 31.8 |
| 15/1/2568 | 68.6 | 58.6 | 31.6 |
| 22/1/2568 | 69.3 | 57.8 | 35.5 |
| 29/1/2568 | 64.7 | 60.9 | 41.4 |
| 5/2/2568 | 64.9 | 65.0 | 40.1 |
| 12/2/2568 | 62.2 | 67.2 | 40.9 |
| 19/2/2568 | 64.4 | 67.5 | 44.3 |
| 26/2/2568 | 63.0 | 65.4 | 48.8 |
| 5/3/2568 | 62.4 | 65.7 | 52.9 |
| 12/3/2568 | 62.3 | 68.5 | 51.8 |
| 19/3/2568 | 63.3 | 72.2 | 51.1 |
| 26/3/2568 | 63.3 | 72.4 | 50.1 |
| 2/4/2568 | 60.2 | 70.8 | 52.2 |
| 9/4/2568 | 56.1 | 73.0 | 56.5 |
| 16/4/2568 | 59.6 | 77.2 | 61.7 |
| 23/4/2568 | 60.1 | 78.0 | 66.8 |
| 30/4/2568 | 58.7 | 80.2 | 67.6 |
| 7/5/2568 | 59.6 | 81.7 | 70.1 |
| 14/5/2568 | 61.8 | 80.9 | 73.8 |
| 21/5/2568 | 60.8 | 78.4 | 73.7 |
| 28/5/2568 | 60.1 | 80.1 | 75.3 |
| 4/6/2568 | 57.9 | 82.6 | 77.7 |
| 11/6/2568 | 56.0 | 83.7 | 78.3 |
| 18/6/2568 | 57.0 | 86.8 | 79.8 |
| 25/6/2568 | 58.3 | 83.5 | 84.4 |
ลองแล้วจะเห็นอะไร
- สังเกตอะไร: ลองตอบว่าชั้นกลางโตขึ้นหรือไม่โดยดูจากภาพ แล้วเปิดตารางเช็ค จะพบว่าการลอยตามชั้นล่างทำให้ประเมินผิดได้ง่ายมาก
ข้อควรระวัง
- ให้คนอ่านรูปร่างของชั้นที่ไม่ใช่ชั้นล่างสุด ซึ่งบิดเพราะลอยตามชั้นล่าง
- ซ้อนค่าที่บวกกันไม่ได้ เช่น อัตราส่วนคนละฐาน
- ใส่ชั้นเกิน 5 ชั้นจนชั้นบางหายไป
- สลับลำดับการซ้อนกลางกราฟ ทำให้ตามชั้นเดิมไม่ได้
เมื่อไหร่ไม่ควรใช้กราฟนี้
- ต้องอ่านรูปร่างของแต่ละอนุกรมให้ตรง→ใช้แทน: small-multiples หรือ multi-line-chart
- สนใจสัดส่วนมากกว่ายอดรวม→ใช้แทน: percent-stacked-bar หรือ streamgraph
- ค่าบวกกันไม่ได้→ใช้แทน: multi-line-chart