01ภาพรวมของกราฟนี้
Grouped bar chart แบ่งข้อมูลด้วยสองตัวแปรหมวดหมู่พร้อมกัน ตัวหนึ่งกำหนดกลุ่มบนแกน อีกตัวกำหนดสีของแท่งที่วางเรียงกันในกลุ่ม ทำให้เทียบ "ภายในกลุ่มเดียวกัน" ได้แม่นที่สุด เพราะแท่งเริ่มจากเส้นฐานเดียวกันและอยู่ติดกัน
เปรียบเทียบให้เห็นภาพ
เหมือนวัดส่วนสูงของพี่น้องแต่ละบ้าน โดยให้พี่น้องบ้านเดียวกันยืนติดกัน เราจึงเทียบภายในบ้านได้ง่าย แต่ถ้าจะเทียบน้องคนเล็กของบ้านหนึ่งกับอีกบ้านที่อยู่ไกลออกไป จะเริ่มยาก
ใช้ที่ไหนบ้าง — เทียบยอดขายรายช่องทางในแต่ละภูมิภาค คะแนนก่อนและหลังของแต่ละห้อง หรือผลสำรวจแยกตามเพศในแต่ละช่วงอายุ
สร้างอย่างไร
- ขั้นที่ 1เลือกตัวแปรหมวดสองตัว
- ขั้นที่ 2ตัดสินใจว่าตัวไหนอยู่แกน ตัวไหนเป็นสี
- ขั้นที่ 3วาดแท่งเรียงกันภายในกลุ่ม
- ขั้นที่ 4ใส่ legend และป้ายกำกับ
ตัวอย่างคลาสสิก · ผลสำรวจที่แยกตามเพศในแต่ละช่วงอายุ
รูปแบบมาตรฐานของงานสำรวจคือมีทั้งตัวแปรที่สนใจและตัวแปรแบ่งกลุ่ม การวางแท่งของชายและหญิงไว้ติดกันในแต่ละช่วงอายุ ทำให้เห็นทันทีว่าช่องว่างระหว่างเพศกว้างขึ้นหรือแคบลงเมื่ออายุเปลี่ยน ซึ่งเป็นคำถามที่กราฟแท่งเดี่ยวตอบไม่ได้
02อธิบายภาษาคนเข้าใจง่าย ๆ
บางครั้งข้อมูลมีสองมิติที่เป็นหมวดหมู่ เช่น ยอดขายที่แยกทั้งตามภูมิภาคและตามช่องทาง ถ้าวาดกราฟแท่งธรรมดาเราต้องเลือกดูแค่มิติเดียว แต่ grouped bar ให้เห็นทั้งสองพร้อมกัน
วิธีทำคือเอาภูมิภาคเป็นกลุ่มบนแกนนอน แล้วภายในแต่ละภูมิภาคก็วางแท่งของแต่ละช่องทางเรียงติดกัน แท่งของช่องทางเดียวกันใช้สีเดียวกันทุกกลุ่ม คนอ่านจึงตามสีไปได้ตลอดกราฟ
สิ่งที่ต้องตัดสินใจและสำคัญกว่าที่คิดคือ ตัวแปรไหนควรอยู่แกนและตัวไหนควรเป็นสี กฎง่าย ๆ คือ ให้ตัวแปรที่คุณอยากให้คนเทียบกันมากที่สุดอยู่ "ติดกัน" เพราะของที่วางติดกันเทียบได้แม่นกว่าของที่อยู่ห่างกัน
ข้อจำกัดที่หนีไม่พ้นคือจำนวนแท่ง ถ้ามี 6 ภูมิภาค × 5 ช่องทาง จะได้ 30 แท่งเบียดกันจนบางและอ่านไม่ออก ในทางปฏิบัติควรคุมไว้ที่ประมาณ 4 กลุ่ม × 3-4 หมวดย่อย ถ้าเกินนี้ให้แยกเป็นกราฟย่อยหลายอันแทน
ถ้าคำถามคือ "ยอดรวมของแต่ละภูมิภาคเป็นเท่าไร" กราฟแบบนี้ตอบไม่ได้เพราะไม่มีแท่งรวม ต้องเปลี่ยนไปใช้แท่งซ้อน ภาพจำคือ แท่งกลุ่มตอบเรื่อง "เทียบส่วนย่อย" ส่วนแท่งซ้อนตอบเรื่อง "ยอดรวม"
03ข้อมูลที่ต้องใช้
คอลัมน์ที่ต้องเตรียม
| คอลัมน์ | ทำหน้าที่ | ชนิด | เข้ารหัสด้วย | จำนวนค่าที่เหมาะ | หมายเหตุ |
|---|---|---|---|---|---|
category | กลุ่มหลัก | หมวดหมู่ | x | 2–6 กลุ่ม | ตัวแปรที่จะวางเป็นกลุ่มบนแกน |
group | หมวดย่อยในกลุ่ม | หมวดหมู่ | color | 2–4 หมวด | เกิน 4 หมวดแท่งจะบางจนอ่านยาก และต้อง direct label ทุกแท่ง |
value | ปริมาณ | ตัวเลขต่อเนื่อง | y | ต่อเนื่อง | ต้องเป็นหน่วยเดียวกันทุกแท่ง |
ต้องเตรียมข้อมูลอย่างไรก่อนวาด
- ทำให้ทุกคู่กลุ่ม×หมวดย่อยมีค่าครบ เติมศูนย์หรือทำเครื่องหมายว่าไม่มีข้อมูล
- ตัดสินใจว่าตัวแปรไหนอยู่แกน ตัวไหนเป็นสี ตามสิ่งที่อยากให้เทียบ
- กำหนดลำดับของหมวดย่อยให้คงที่ทุกกลุ่ม
ค่าที่หายไป — คู่ที่ไม่มีข้อมูลต้องเว้นที่ว่างไว้ ไม่ใช่เลื่อนแท่งอื่นมาแทน เพราะตำแหน่งของแท่งในกลุ่มคือตัวบอกว่าเป็นหมวดย่อยไหน
สเกลของแกน — linear เริ่มที่ศูนย์เท่านั้น ห้ามใช้ log
กราฟจะเริ่มพังเมื่อไร
เกิน 24 แท่ง (เช่น 6×4) แท่งจะบางจนเทียบไม่ได้ — แยกเป็น small-multiples แทน
หน้าตาไฟล์ที่ต้องเตรียม
category,group,value
เหนือ,หน้าร้าน,91
เหนือ,เว็บไซต์,93
…04อ่านแล้วเห็นอะไร
สิ่งที่เห็นได้จากภาพ
- ภายในแต่ละกลุ่ม หมวดย่อยไหนมากที่สุด
- รูปแบบภายในกลุ่มเหมือนกันทุกกลุ่มหรือกลับด้านในบางกลุ่ม
- หมวดย่อยไหนเด่นสม่ำเสมอทุกกลุ่ม
- กลุ่มที่มีรูปแบบผิดจากกลุ่มอื่น ซึ่งมักเป็นจุดที่น่าสนใจที่สุด
สิ่งที่กราฟนี้ตอบไม่ได้
- ไม่บอกยอดรวมของแต่ละกลุ่ม ต้องใช้ stacked-bar
- เทียบหมวดย่อยเดียวกันข้ามกลุ่มที่อยู่ไกลกันได้ยาก เพราะไม่ได้อยู่ติดกัน
- ไม่บอกสัดส่วนภายในกลุ่ม ต้องใช้ percent-stacked-bar
อ่านตามลำดับนี้
- ดูทีละกลุ่มก่อน ว่าภายในกลุ่มเรียงลำดับอย่างไร
- เทียบรูปแบบระหว่างกลุ่มว่าเหมือนหรือต่าง
- หากลุ่มที่รูปแบบกลับด้านจากกลุ่มอื่น
- ใช้ legend ยืนยันว่าสีไหนคือหมวดย่อยไหน
คำถามที่ตอบได้
- ในภูมิภาคนี้ ช่องทางไหนขายดีที่สุด
- ช่องทางนี้เด่นทุกภูมิภาคหรือเด่นเฉพาะบางที่
- มีภูมิภาคไหนที่รูปแบบต่างจากที่อื่นไหม
สัญญาณว่ามีอะไรผิด
- แท่งบางจนแยกกลุ่มไม่ออก แปลว่าหมวดเยอะเกินไป
- ลำดับของหมวดย่อยไม่เหมือนกันในแต่ละกลุ่ม ทำให้เทียบไม่ได้
- ไม่มี legend หรือ legend อยู่ไกลจากกราฟ
05เหมาะกับการนำเสนอแบบไหน
ทำอย่างไรให้คนอ่านได้ข้อสรุปโดยไม่ต้องบรรยาย
- ใช้ direct label บนแท่งเมื่อมีหมวดย่อยตั้งแต่ 4 ขึ้นไป เพราะสีอย่างเดียวไม่พอ
- เน้นกลุ่มที่รูปแบบผิดปกติด้วยกรอบหรือลูกศร
- เรียงกลุ่มบนแกนตามค่ารวมเพื่อให้เห็นแนวโน้ม
รูปแบบชื่อกราฟที่ควรใช้
<หมวดย่อย> นำในเกือบทุก <กลุ่ม> ยกเว้น <ข้อยกเว้น>
06เอาไปใช้ต่อ
โค้ดทุกชิ้นอ่านไฟล์ grouped-bar-sample.csv ชุดเดียวกับที่ Playground ใช้ และตัวเลขในโค้ดเปลี่ยนตามค่าที่คุณปรับด้านล่าง
# ติดตั้ง: pip install "matplotlib==3.10.*" "pandas==2.*"
# ดาวน์โหลด grouped-bar-sample.csv จากหน้านี้ แล้ววางไว้ข้างสคริปต์
import matplotlib
matplotlib.use("Agg") # รันแบบไม่มีหน้าจอ ถ้ารันในเครื่องตัวเองลบบรรทัดนี้ได้
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
C1, C2, C3 = "#2a78d6", "#eb6834", "#1baf7a" # palette ของคลัง เปลี่ยนเป็นสีองค์กรได้
INK, SURFACE = "#0b0b0b", "#fcfcfb"
df = pd.read_csv("grouped-bar-sample.csv")
df["value"] = pd.to_numeric(df["value"], errors="coerce")
NOTE = "on" # ← ค่าจาก Playground
fig, ax = plt.subplots(figsize=(7.6, 4.2), facecolor=SURFACE)
ax.set_facecolor(SURFACE)
pivot = df.pivot_table(index="category", columns="group", values="value", aggfunc="sum")
n = len(pivot.columns)
xs = np.arange(len(pivot.index))
width = 0.8 / n
for i, col in enumerate(pivot.columns):
ax.bar(xs + i * width - 0.4 + width / 2, pivot[col], width * 0.92,
label=col, color=[C1, C2, C3][i % 3])
ax.set_xticks(xs); ax.set_xticklabels(pivot.index)
ax.set_ylim(0, None)
ax.legend(frameon=False, ncols=n) # legend จำเป็นเสมอเมื่อมีตั้งแต่ 2 ชุดขึ้นไป
ax.grid(axis="y", alpha=0.25); ax.set_axisbelow(True)
ax.spines[["top", "right"]].set_visible(False) # ลดเส้นที่ไม่ได้ให้ข้อมูล
fig.tight_layout()
fig.savefig("grouped-bar.png", dpi=160)
print("เขียน grouped-bar.png แล้ว ·", len(df), "แถว")07ลองเล่นเพื่อเข้าใจ
ดูข้อมูลเป็นตาราง (6 แถว)
| หมวด | หน้าร้าน | เว็บไซต์ | แอป | รวม |
|---|---|---|---|---|
| เหนือ | 91.0 | 93.0 | 94.0 | 278 |
| อีสาน | 120 | 84.0 | 154 | 358 |
| กลาง | 88.0 | 73.0 | 130 | 291 |
| ตะวันออก | 82.0 | 47.0 | 134 | 263 |
| ตะวันตก | 92.0 | 70.0 | 136 | 298 |
| ใต้ | 86.0 | 94.0 | 129 | 309 |
ลองแล้วจะเห็นอะไร
- ดูตารางข้อมูลใต้กราฟ: ลองอ่านจากภาพก่อนว่าช่องทางไหนนำในแต่ละภูมิภาค แล้วเปิดตารางเช็ค จะเห็นว่าคู่ที่ค่าใกล้กันมากนั้นตาแยกไม่ออก
ข้อควรระวัง
- ใส่หมวดย่อยเกิน 4 หมวด ทำให้แท่งบางและสีแยกยากสำหรับคนตาบอดสี
- สลับลำดับหมวดย่อยในแต่ละกลุ่ม ทำให้เทียบข้ามกลุ่มไม่ได้
- ใช้กราฟนี้ตอบคำถามเรื่องยอดรวม ซึ่งต้องใช้แท่งซ้อนแทน
- เลือกตัวแปรผิดข้าง — เอาสิ่งที่อยากให้เทียบไปไว้คนละกลุ่มจนอยู่ห่างกัน
- ไม่มี legend หรือใช้สีอย่างเดียวโดยไม่มีป้ายกำกับ
เมื่อไหร่ไม่ควรใช้กราฟนี้
- คำถามคือยอดรวมของแต่ละกลุ่ม→ใช้แทน: stacked-bar
- คำถามคือสัดส่วนภายในกลุ่ม→ใช้แทน: percent-stacked-bar
- มีมากกว่า 4 หมวดย่อย→ใช้แทน: small-multiples หรือ heatmap-matrix
- ตัวแปรที่สองคือเวลา→ใช้แทน: multi-line-chart ที่แสดงแนวโน้มได้ดีกว่า