01ภาพรวมของกราฟนี้
Radial bar chart เอาแกนหมวดของกราฟแท่งมาดัดเป็นวงกลม แท่งจึงยื่นออกจากศูนย์กลาง ข้อดีคือสื่อความเป็นรอบของข้อมูลได้ตรง ข้อเสียคือแท่งที่อยู่วงนอกมีพื้นที่มากกว่าแท่งวงในที่ค่าเท่ากัน ทำให้อ่านเทียบกันได้ไม่แม่น
เปรียบเทียบให้เห็นภาพ
เหมือนนาฬิกาที่แต่ละชั่วโมงมีเข็มยาวไม่เท่ากันตามปริมาณงาน เราเห็นจังหวะของทั้งวันได้ในภาพเดียว แต่ถ้าจะเทียบว่าชั่วโมง 3 กับชั่วโมง 9 อันไหนมากกว่ากันจะยากกว่าดูแท่งเรียงตรง ๆ
ใช้ที่ไหนบ้าง — ปริมาณการใช้งานรายชั่วโมงในหนึ่งวัน ยอดขายรายเดือนที่ต้องการสื่อว่าวนซ้ำทุกปี หรือทิศทางลม
สร้างอย่างไร
- ขั้นที่ 1ตรวจว่าข้อมูลวนเป็นรอบจริง
- ขั้นที่ 2กำหนดจุดเริ่มของวงให้มีความหมาย
- ขั้นที่ 3วาดแท่งยื่นจากรัศมีชั้นใน
- ขั้นที่ 4ติดป้ายรอบวงให้อ่านได้
ตัวอย่างคลาสสิก · Coxcomb ของ Florence Nightingale ปี 1858
Nightingale วาดสาเหตุการเสียชีวิตของทหารอังกฤษในสงครามไครเมียเป็นแผนภาพรัศมี โดยแต่ละกลีบคือหนึ่งเดือน เธอเลือกรูปแบบวงเพราะข้อมูลวนครบสองปีพอดีและเธอต้องการให้เห็นว่าฤดูกาลเกี่ยวข้อง ภาพนี้ช่วยผลักดันการปฏิรูปสุขอนามัยของกองทัพได้จริง
02อธิบายภาษาคนเข้าใจง่าย ๆ
ข้อมูลบางชนิดวนเป็นรอบโดยธรรมชาติ เช่น ชั่วโมงในหนึ่งวัน เดือนในหนึ่งปี หรือทิศทางลม สิ่งเหล่านี้มีคุณสมบัติที่กราฟแท่งตรงสื่อไม่ได้ คือ "ปลายทางเชื่อมกลับไปหาจุดเริ่ม"
ในกราฟแท่งตรง เดือนธันวาคมอยู่ขวาสุดและมกราคมอยู่ซ้ายสุด ดูเหมือนอยู่คนละฟากโลก ทั้งที่จริงมันติดกัน กราฟรัศมีแก้ข้อนี้ได้เพราะธันวาคมกับมกราคมมาอยู่ติดกันจริง ๆ
ราคาที่ต้องจ่ายหนักกว่าที่หลายคนคิด แท่งที่อยู่ไกลจากศูนย์กลางมีเส้นรอบวงยาวกว่า พื้นที่จึงมากกว่าแท่งใกล้ศูนย์กลางที่ค่าเท่ากัน ตาเราอ่านพื้นที่ไปด้วยโดยไม่รู้ตัว ค่าที่เท่ากันจึงดูไม่เท่ากัน
นอกจากนี้ความยาวของแท่งยังวัดจากเส้นโค้ง ไม่ใช่เส้นตรง การเทียบความยาวสองแท่งที่อยู่คนละมุมจึงยากกว่าการเทียบแท่งที่วางเรียงกันบนเส้นฐานเดียวกันอย่างชัดเจน
สรุปคือใช้กราฟนี้ต่อเมื่อความเป็นรอบสำคัญกว่าความแม่นในการอ่านค่า ถ้าคำถามคือ "เดือนไหนมากที่สุด" ให้ใช้แท่งตรง แต่ถ้าคำถามคือ "จังหวะของทั้งรอบเป็นอย่างไร" กราฟรัศมีจะเล่าได้ดีกว่า
03ข้อมูลที่ต้องใช้
คอลัมน์ที่ต้องเตรียม
| คอลัมน์ | ทำหน้าที่ | ชนิด | เข้ารหัสด้วย | จำนวนค่าที่เหมาะ | หมายเหตุ |
|---|---|---|---|---|---|
category | หมวดที่วนเป็นรอบ | มีลำดับ | angle | 6–24 หมวด | ต้องเป็นหมวดที่มีลำดับและวนกลับมาที่จุดเริ่ม ถ้าไม่วนก็ไม่ควรใช้กราฟนี้ |
value | ปริมาณ | ตัวเลขต่อเนื่อง | length | บวกเท่านั้น | ค่าติดลบวาดในรัศมีไม่ได้ |
ต้องเตรียมข้อมูลอย่างไรก่อนวาด
- ตรวจว่าหมวดวนเป็นรอบจริง
- เรียงตามลำดับของรอบ ห้ามเรียงตามค่า
- กำหนดจุดเริ่มของวงที่มีความหมาย เช่น เที่ยงคืนหรือมกราคม
ค่าที่หายไป — หมวดที่ไม่มีข้อมูลต้องเว้นช่องว่างไว้ในวง ห้ามข้าม เพราะตำแหน่งบนวงคือตัวบอกว่าเป็นหมวดไหน
สเกลของแกน — linear จากรัศมีชั้นในออกไปชั้นนอก และควรเว้นรูตรงกลางไว้ เพราะรัศมีใกล้ศูนย์บีบจนอ่านไม่ได้
กราฟจะเริ่มพังเมื่อไร
น้อยกว่า 6 หมวด วงจะโล่งจนดูไม่เป็นวง และเกิน 24 หมวดแท่งจะบางจนอ่านไม่ออก
หน้าตาไฟล์ที่ต้องเตรียม
category,value
…04อ่านแล้วเห็นอะไร
สิ่งที่เห็นได้จากภาพ
- จังหวะของทั้งรอบ เช่น ช่วงไหนของวันที่คึกคักที่สุด
- ช่วงที่ต่อเนื่องกันซึ่งเห็นเป็นกลุ่มบนวง
- หมวดที่โดดออกจากรูปแบบของรอบ
- ความสมมาตรของรอบ
สิ่งที่กราฟนี้ตอบไม่ได้
- เทียบค่าระหว่างหมวดที่อยู่คนละมุมได้ไม่แม่น เพราะพื้นที่และความโค้งรบกวน
- ไม่บอกค่าที่แน่นอนโดยไม่มีตัวเลขกำกับ
- ไม่รองรับค่าติดลบ
อ่านตามลำดับนี้
- หาจุดเริ่มของวงและทิศทางการอ่าน
- มองภาพรวมว่าส่วนไหนของวงหนากว่า
- ดูตัวเลขกำกับเมื่อจะเทียบค่าจริง
- อย่าเทียบความยาวข้ามมุมด้วยสายตาเพียงอย่างเดียว
คำถามที่ตอบได้
- จังหวะของรอบนี้เป็นอย่างไร
- ช่วงไหนของรอบที่สูงต่อเนื่องกัน
- รูปแบบซ้ำเดิมทุกรอบหรือไม่
สัญญาณว่ามีอะไรผิด
- ใช้กับหมวดที่ไม่ได้วนเป็นรอบ เช่น ชื่อจังหวัด
- ไม่มีรูตรงกลาง ทำให้แท่งที่ค่าน้อยหายไป
- ไม่บอกว่าวงเริ่มที่ไหน
05เหมาะกับการนำเสนอแบบไหน
ทำอย่างไรให้คนอ่านได้ข้อสรุปโดยไม่ต้องบรรยาย
- ติดตัวเลขที่ปลายแท่งทุกแท่ง เพราะอ่านจากรัศมีไม่แม่น
- เขียนชัดว่าวงเริ่มที่ไหนและอ่านตามเข็มหรือทวนเข็ม
- วาดวงประของค่าอ้างอิงเช่นค่าเฉลี่ย
รูปแบบชื่อกราฟที่ควรใช้
จังหวะของ <รอบ> สูงสุดที่ <หมวด> และต่ำสุดที่ <หมวด>
06เอาไปใช้ต่อ
โค้ดทุกชิ้นอ่านไฟล์ radial-bar-sample.csv ชุดเดียวกับที่ Playground ใช้ และตัวเลขในโค้ดเปลี่ยนตามค่าที่คุณปรับด้านล่าง
# ติดตั้ง: pip install "matplotlib==3.10.*" "pandas==2.*"
# ดาวน์โหลด radial-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("radial-bar-sample.csv")
df["value"] = pd.to_numeric(df["value"], errors="coerce")
NOTE = "radial" # ← ค่าจาก Playground
fig, ax = plt.subplots(figsize=(7.6, 4.2), facecolor=SURFACE)
ax.set_facecolor(SURFACE)
fig.clf()
ax = fig.add_subplot(projection="polar") # ต้องใช้แกนเชิงขั้ว
d = df.head(8)
angles = np.linspace(0, 2 * np.pi, len(d), endpoint=False)
width = 2 * np.pi / len(d) * 0.88
ax.bar(angles, d["value"], width=width, bottom=d["value"].max() * 0.3, color=C1) # bottom = รูตรงกลาง
ax.set_xticks(angles); ax.set_xticklabels(d["category"], fontsize=8)
ax.set_yticklabels([])
ax.set_title("ปริมาณตามรอบ", loc="left")
ax.spines[["top", "right"]].set_visible(False) # ลดเส้นที่ไม่ได้ให้ข้อมูล
fig.tight_layout()
fig.savefig("radial-bar.png", dpi=160)
print("เขียน radial-bar.png แล้ว ·", len(df), "แถว")07ลองเล่นเพื่อเข้าใจ
แท่งวงนอกยาวกว่าแท่งวงในที่ค่าเท่ากัน — อ่านค่าเทียบกันไม่แม่นเท่าแท่งตรง
ดูข้อมูลเป็นตาราง (8 แถว)
| หมวด | ค่า |
|---|---|
| กรุงเทพฯ | 366 |
| ชลบุรี | 328 |
| ขอนแก่น | 321 |
| เชียงใหม่ | 319 |
| ภูเก็ต | 283 |
| สงขลา | 227 |
| นครราชสีมา | 208 |
| อุดรธานี | 131 |
ลองแล้วจะเห็นอะไร
- เทียบกับกราฟแท่งตรง: เปิดหน้า bar-chart คู่กันแล้วเทียบข้อมูลชุดเดียวกัน จะเห็นว่าแบบรัศมีทำให้จัดอันดับยากขึ้นชัดเจน
ข้อควรระวัง
- ใช้กับหมวดที่ไม่ได้วนเป็นรอบ ซึ่งทำให้เสียความแม่นโดยไม่ได้อะไรกลับมา
- ไม่เว้นรูตรงกลาง ทำให้แท่งที่ค่าน้อยบีบจนหายไป
- เรียงตามค่าแทนที่จะเรียงตามลำดับของรอบ ซึ่งทำลายเหตุผลเดียวที่ใช้กราฟนี้
- ไม่ติดตัวเลขกำกับ ทำให้คนอ่านต้องเดาค่าจากรัศมีที่อ่านไม่แม่น
เมื่อไหร่ไม่ควรใช้กราฟนี้
- หมวดไม่ได้วนเป็นรอบ→ใช้แทน: bar-chart หรือ horizontal-bar
- ต้องการจัดอันดับให้แม่น→ใช้แทน: bar-chart
- ข้อมูลรายชั่วโมงหลายวัน→ใช้แทน: calendar-heatmap หรือ heatmap-matrix