01ภาพรวมของกราฟนี้
Bar chart วางหมวดหมู่ไว้แกนหนึ่งและปริมาณไว้อีกแกนหนึ่ง แล้ววาดแท่งยาวตามค่า เพราะทุกแท่งเริ่มจากเส้นฐานเดียวกัน สายตาจึงเทียบความยาวได้ตรงไปตรงมาโดยไม่ต้องคำนวณ นี่คือเหตุผลที่มันชนะกราฟวงกลมในเกือบทุกสถานการณ์
เปรียบเทียบให้เห็นภาพ
เหมือนให้นักเรียนยืนเรียงแถวติดกำแพงเดียวกันแล้ววัดส่วนสูง ทุกคนเริ่มจากพื้นเดียวกัน เราจึงชี้ได้ทันทีว่าใครสูงกว่าใครและสูงกว่าประมาณเท่าไร
ใช้ที่ไหนบ้าง — เทียบยอดขายรายสาขา จำนวนผู้ใช้รายช่องทาง คะแนนรายวิชา หรือใช้เป็นกราฟแรกที่วาดเสมอก่อนตัดสินใจว่าจะใช้อะไรที่ซับซ้อนกว่า
สร้างอย่างไร
- ขั้นที่ 1เลือกคอลัมน์หมวดและคอลัมน์ค่า
- ขั้นที่ 2ตัดสินใจลำดับการเรียง
- ขั้นที่ 3วาดแท่งจากเส้นฐานศูนย์
- ขั้นที่ 4ติดป้ายเฉพาะแท่งที่จะพูดถึง
ตัวอย่างคลาสสิก · แผนภูมิแท่งของ William Playfair ปี 1786 — กราฟแท่งชิ้นแรกของโลก
Playfair ต้องการแสดงมูลค่าการค้าของสกอตแลนด์กับ 17 ประเทศในปีเดียว แต่เขาไม่มีข้อมูลรายปีที่จะวาดเป็นเส้น จึงคิดกราฟแท่งขึ้นมาเพื่อเทียบปริมาณข้ามหมวดโดยไม่มีมิติเวลา เหตุผลที่เขาคิดมันขึ้นมาในวันนั้นยังเป็นเหตุผลเดียวกับที่เราใช้มันในวันนี้
02อธิบายภาษาคนเข้าใจง่าย ๆ
สมมติเรามีตารางยอดขายของ 10 สาขา ถ้าอ่านเป็นตัวเลขเรียงกัน 10 ตัว สมองต้องจำและเทียบทีละคู่ ซึ่งช้าและพลาดง่าย แต่ถ้าเปลี่ยนตัวเลขแต่ละตัวเป็นแท่งที่ยาวตามค่า เราจะเห็นคำตอบทันทีโดยไม่ต้องคิด
เหตุผลที่กราฟแท่งอ่านง่ายเป็นพิเศษคือมันใช้ "ความยาวบนเส้นฐานเดียวกัน" ซึ่งเป็นสิ่งที่สายตามนุษย์อ่านได้แม่นที่สุด แม่นกว่ามุมของกราฟวงกลม แม่นกว่าขนาดพื้นที่ของวงกลม และแม่นกว่าความเข้มของสี
ข้อบังคับที่ห้ามละเมิดคือแกนค่าต้องเริ่มที่ศูนย์ เพราะเรากำลังให้คนอ่านค่าจากความยาว ถ้าตัดแกนให้เริ่มที่ 90 แท่งที่ค่า 100 กับ 95 จะดูต่างกันเท่าตัวทั้งที่จริงต่างกันแค่ 5%
การเรียงลำดับเป็นเครื่องมือที่คนมักมองข้าม ถ้าหมวดไม่มีลำดับตามธรรมชาติ เช่น ชื่อจังหวัด ให้เรียงตามค่าจากมากไปน้อยเสมอ เพราะจะทำให้อ่านอันดับได้ทันที แต่ถ้าหมวดมีลำดับอยู่แล้ว เช่น ช่วงอายุหรือเดือน ห้ามเรียงตามค่า เพราะจะทำลายความหมายของลำดับ
เมื่อชื่อหมวดยาวหรือมีหมวดเกินประมาณ 8 หมวด ให้เปลี่ยนไปใช้แท่งแนวนอนแทน ชื่อจะได้อ่านตรง ๆ ไม่ต้องเอียงหัวอ่าน ภาพจำคือ แท่งตั้งเหมาะกับหมวดน้อยและชื่อสั้น ส่วนแท่งนอนเหมาะกับการจัดอันดับที่มีหลายรายการ
03ข้อมูลที่ต้องใช้
คอลัมน์ที่ต้องเตรียม
| คอลัมน์ | ทำหน้าที่ | ชนิด | เข้ารหัสด้วย | จำนวนค่าที่เหมาะ | หมายเหตุ |
|---|---|---|---|---|---|
category | หมวดที่ต้องการเทียบ | หมวดหมู่ | x | 2–12 หมวด | ถ้าเกิน 12 หมวด ให้รวมตัวเล็กเป็น "อื่น ๆ" หรือเปลี่ยนไปใช้แท่งแนวนอน |
value | ปริมาณ | ตัวเลขต่อเนื่อง | y | ต่อเนื่อง | ต้องเป็นค่าที่บวกกันได้และมีศูนย์ที่มีความหมาย ไม่ใช่ค่าดัชนีหรืออุณหภูมิ |
ต้องเตรียมข้อมูลอย่างไรก่อนวาด
- รวมแถวซ้ำของหมวดเดียวกันก่อน
- ตัดสินใจลำดับการเรียงและเขียนเหตุผลไว้ใน caption
- รวมหมวดที่เล็กกว่า 2% เป็น "อื่น ๆ" ถ้าหมวดเยอะ
ค่าที่หายไป — หมวดที่ไม่มีข้อมูลต้องแสดงเป็นช่องว่างพร้อมป้าย "ไม่มีข้อมูล" ห้ามวาดเป็นแท่งศูนย์ เพราะศูนย์กับไม่มีข้อมูลคนละความหมาย
สเกลของแกน — แกนค่าใช้ linear เท่านั้น ห้ามใช้ log เพราะความยาวของแท่งจะไม่แปรตามค่าอีกต่อไป ถ้าข้อมูลกินหลาย order of magnitude ให้ใช้ dot-plot บนสเกล log แทน
กราฟจะเริ่มพังเมื่อไร
เกิน 15 หมวด แท่งจะบางจนป้ายชนกัน — เปลี่ยนไปใช้ horizontal-bar หรือ lollipop-chart
หน้าตาไฟล์ที่ต้องเตรียม
category,value
กรุงเทพฯ,434
เชียงใหม่,387
…04อ่านแล้วเห็นอะไร
สิ่งที่เห็นได้จากภาพ
- หมวดไหนมากที่สุดและน้อยที่สุด
- ช่องว่างระหว่างอันดับหนึ่งกับอันดับสองกว้างแค่ไหน
- มีหมวดที่โดดออกจากกลุ่มหรือไม่
- การกระจายของค่าเรียบหรือมีไม่กี่หมวดที่กินส่วนแบ่งเกือบทั้งหมด
สิ่งที่กราฟนี้ตอบไม่ได้
- ไม่บอกว่าแต่ละหมวดเปลี่ยนแปลงอย่างไรตามเวลา ต้องใช้กราฟเส้นหรือ small multiples
- ไม่บอกการกระจายภายในหมวด — แท่งเดียวอาจมาจากค่าที่กระจุกหรือกระจายมากก็ได้
- ไม่บอกว่าความต่างที่เห็นมีนัยสำคัญทางสถิติหรือเป็นแค่ความบังเอิญ ต้องใช้ bar-with-error
อ่านตามลำดับนี้
- ดูแท่งที่ยาวที่สุดก่อน
- ดูช่องว่างระหว่างแท่งแรกกับแท่งถัดไป
- กวาดสายตาลงไปหาจุดที่ความยาวเริ่มลดฮวบ
- ตรวจว่าแกนเริ่มที่ศูนย์จริง
คำถามที่ตอบได้
- หมวดไหนมากที่สุด
- อันดับหนึ่งนำอันดับสองอยู่เท่าไร
- หมวดนี้อยู่อันดับที่เท่าไรเมื่อเทียบกับทั้งหมด
สัญญาณว่ามีอะไรผิด
- แกนไม่เริ่มที่ศูนย์ — ความต่างที่เห็นถูกขยายเกินจริง
- หมวดเรียงแบบไม่มีเหตุผล มักแปลว่าคนทำเลือกลำดับที่เข้าทางข้อสรุปที่ต้องการ
- หน่วยไม่ระบุ ทำให้เทียบกับอย่างอื่นไม่ได้
05เหมาะกับการนำเสนอแบบไหน
ทำอย่างไรให้คนอ่านได้ข้อสรุปโดยไม่ต้องบรรยาย
- ระบายสีเน้นแท่งเดียวที่จะพูดถึง แล้วให้แท่งที่เหลือเป็นสีเทา
- ติดตัวเลขเฉพาะแท่งที่เน้น ไม่ใช่ทุกแท่ง
- ถ้ามีเป้าหมาย ให้ลากเส้นแนวนอนของเป้าพาดผ่าน
- เขียนหน่วยไว้ที่ชื่อแกน ไม่ใช่ทุก tick
รูปแบบชื่อกราฟที่ควรใช้
<หมวดอันดับ 1> นำ <หมวดอันดับ 2> อยู่ <ส่วนต่าง> <หน่วย>
06เอาไปใช้ต่อ
โค้ดทุกชิ้นอ่านไฟล์ bar-chart-sample.csv ชุดเดียวกับที่ Playground ใช้ และตัวเลขในโค้ดเปลี่ยนตามค่าที่คุณปรับด้านล่าง
# ติดตั้ง: pip install "matplotlib==3.10.*" "pandas==2.*"
# ดาวน์โหลด bar-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("bar-chart-sample.csv")
df["value"] = pd.to_numeric(df["value"], errors="coerce")
SORT = "value-desc"
LIMIT = 10
ZEROBASELINE = "yes" # ← ค่าจาก Playground
fig, ax = plt.subplots(figsize=(7.6, 4.2), facecolor=SURFACE)
ax.set_facecolor(SURFACE)
d = df.sort_values("value", ascending=False).head(LIMIT)
bars = ax.bar(d["category"], d["value"], color=C1, width=0.72)
bars[0].set_color("#eb6834") # เน้นแท่งที่จะพูดถึง แท่งอื่นเป็นสีเดียวกันหมด
ax.bar_label(bars, fmt="%.0f", padding=3, fontsize=9, color=INK)
ax.set_ylim(0, None) # เริ่มที่ศูนย์เสมอ ห้ามตัดแกน
ax.set_ylabel("ยอดขาย (ล้านบาท)")
ax.set_title("ยอดขายรายจังหวัด", loc="left")
ax.grid(axis="y", alpha=0.25); ax.set_axisbelow(True)
plt.setp(ax.get_xticklabels(), rotation=35, ha="right")
ax.spines[["top", "right"]].set_visible(False) # ลดเส้นที่ไม่ได้ให้ข้อมูล
fig.tight_layout()
fig.savefig("bar-chart.png", dpi=160)
print("เขียน bar-chart.png แล้ว ·", len(df), "แถว")07ลองเล่นเพื่อเข้าใจ
ดูข้อมูลเป็นตาราง (10 แถว)
| หมวด | ค่า |
|---|---|
| กรุงเทพฯ | 434 |
| ชลบุรี | 396 |
| ขอนแก่น | 389 |
| เชียงใหม่ | 387 |
| ภูเก็ต | 351 |
| สงขลา | 295 |
| นครราชสีมา | 276 |
| สุราษฎร์ธานี | 207 |
| อุดรธานี | 199 |
| พิษณุโลก | 148 |
ลองแล้วจะเห็นอะไร
- การเรียงลำดับ: ลองสลับไปมาแล้วสังเกตว่า "ตามตัวอักษร" ทำให้หาอันดับได้ยากขึ้นแค่ไหน ทั้งที่ข้อมูลไม่เปลี่ยนเลย
- จำนวนหมวดที่แสดง: ลดเหลือ 3–5 หมวดแล้วดูว่าภาพอ่านง่ายขึ้นมาก แต่ก็ซ่อนหางยาวของข้อมูลไปด้วย
- เริ่มแกนที่ศูนย์: ปิดการเริ่มที่ศูนย์แล้วดูว่าความต่างที่แท้จริงเพียงไม่กี่เปอร์เซ็นต์ กลายเป็นภาพที่ดูต่างกันหลายเท่า
ข้อควรระวัง
- ตัดแกนค่าไม่ให้เริ่มที่ศูนย์ — เป็นความผิดพลาดที่พบบ่อยที่สุดและบิดภาพมากที่สุด
- เรียงหมวดตามตัวอักษรทั้งที่ไม่มีเหตุผล ทำให้คนอ่านต้องกวาดสายตาหาอันดับเอง
- ใส่ตัวเลขบนทุกแท่ง จนตัวเลขแย่งความสนใจไปจากรูปร่างของข้อมูล
- ใช้สีต่างกันทุกแท่งทั้งที่ไม่มีความหมาย — สีควรบอกอะไรบางอย่าง ไม่ใช่แค่ทำให้ดูมีสีสัน
- เอาค่าที่เป็นอัตราหรือดัชนีมาวาดแท่ง ทั้งที่ค่าเหล่านั้นไม่มีศูนย์ที่มีความหมาย
- ใช้กราฟแท่งกับข้อมูลที่แกนนอนเป็นค่าต่อเนื่อง ซึ่งควรเป็น histogram และแท่งต้องชิดกัน
เมื่อไหร่ไม่ควรใช้กราฟนี้
- หมวดมีมากกว่า 15 หมวด→ใช้แทน: horizontal-bar หรือ lollipop-chart ที่ชื่ออ่านง่ายกว่า
- แกนนอนเป็นค่าต่อเนื่องไม่ใช่หมวดหมู่→ใช้แทน: histogram ซึ่งแท่งต้องชิดกัน
- ต้องการดูการเปลี่ยนแปลงตามเวลา→ใช้แทน: line-chart ที่แสดงความชันได้
- ต้องการดูการกระจายภายในแต่ละกลุ่ม→ใช้แทน: box-plot หรือ strip-plot