01ภาพรวมของกราฟนี้
Gradient band ไล่ความเข้มของสีตามความน่าจะเป็นแทนการวาดขอบคม แก้ปัญหาที่ผู้อ่านมองขอบของแถบความเชื่อมั่นเป็นเส้นแบ่งระหว่างเป็นไปได้กับเป็นไปไม่ได้ แลกกับการที่อ่านค่าที่ระดับใดระดับหนึ่งได้ยากกว่า
เปรียบเทียบให้เห็นภาพ
เหมือนเงาที่จางหายไปเรื่อย ๆ แทนที่จะเป็นเส้นขอบคม ซึ่งตรงกับความจริงมากกว่าเพราะไม่มีจุดไหนที่ความเป็นไปได้หยุดกะทันหัน
ใช้ที่ไหนบ้าง — พยากรณ์ที่ต้องเลี่ยงการตีความว่ามีขอบเขตแน่นอน การสื่อสารความเสี่ยงกับสาธารณะ หรือการแสดงการกระจายของค่าประมาณ
สร้างอย่างไร
- ขั้นที่ 1คำนวณความหนาแน่นของความน่าจะเป็นในแต่ละระดับ
- ขั้นที่ 2แปลงความหนาแน่นเป็นความทึบของสี
- ขั้นที่ 3วาดเป็นชั้นบาง ๆ จำนวนมากแทนขอบคม
- ขั้นที่ 4ระบุในคำอธิบายว่าความเข้มแทนอะไร
ตัวอย่างคลาสสิก · Density strip ในการสื่อสารความไม่แน่นอนทางสถิติ
Jackson เสนอ density strip ในปี 2008 โดยชี้ว่าแถบความเชื่อมั่นแบบมีขอบทำให้ผู้อ่านตีความว่าค่าในช่วงเป็นไปได้เท่ากันหมดและค่านอกช่วงเป็นไปไม่ได้ ซึ่งผิดทั้งสองข้อ การไล่ความเข้มตามความหนาแน่นจึงตรงกับสิ่งที่สถิติบอกมากกว่า
02อธิบายภาษาคนเข้าใจง่าย ๆ
แถบความเชื่อมั่นแบบมีขอบคมสร้างปัญหาการตีความที่ละเอียดอ่อน คือผู้อ่านมักมองขอบว่าเป็นเส้นแบ่ง ข้างในคือเป็นไปได้ ข้างนอกคือเป็นไปไม่ได้
ความจริงไม่ใช่แบบนั้นเลย ค่าที่อยู่นอกขอบเล็กน้อยก็ยังเป็นไปได้ เพียงแต่โอกาสน้อยลง และไม่มีจุดไหนที่ความเป็นไปได้หยุดกะทันหัน
Gradient band แก้ด้วยการลบขอบออก แล้วใช้ความเข้มของสีแทนความน่าจะเป็น เข้มตรงกลางที่โอกาสสูง และจางลงเรื่อย ๆ จนกลืนกับพื้นหลัง
ผลคือภาพที่ตรงกับความจริงทางสถิติมากกว่า และไม่เชิญชวนให้ผู้อ่านคิดว่ามีเส้นแบ่งที่ไม่มีอยู่จริง
ราคาที่จ่ายคืออ่านค่าที่ระดับความเชื่อมั่นใดระดับหนึ่งได้ยาก ถ้าต้องการรู้ว่าช่วงเก้าสิบห้าเปอร์เซ็นต์คือเท่าไร แถบแบบมีขอบตอบได้ตรงกว่ามาก
จึงเป็นการแลกระหว่างความซื่อสัตย์ต่อธรรมชาติของความไม่แน่นอน กับความสะดวกในการอ่านตัวเลข ซึ่งเลือกตามว่าผู้อ่านต้องทำอะไรกับภาพนั้น
03ข้อมูลที่ต้องใช้
คอลัมน์ที่ต้องเตรียม
| คอลัมน์ | ทำหน้าที่ | ชนิด | เข้ารหัสด้วย | จำนวนค่าที่เหมาะ | หมายเหตุ |
|---|---|---|---|---|---|
date | เวลา | เวลา | x | 10–300 จุด | เรียงตามเวลา |
value | ค่ากลาง | ตัวเลขต่อเนื่อง | y | ต่อเนื่อง | บริเวณที่เข้มที่สุด |
low | ขอบล่างอ้างอิง | ช่วงค่า | opacity | ใช้กำหนดการไล่ระดับ | ไม่ได้วาดเป็นเส้น |
high | ขอบบนอ้างอิง | ช่วงค่า | opacity | ใช้กำหนดการไล่ระดับ | ไม่ได้วาดเป็นเส้น |
ต้องเตรียมข้อมูลอย่างไรก่อนวาด
- คำนวณการกระจายของความน่าจะเป็นในแต่ละจุดเวลา
- เลือกจำนวนชั้นให้มากพอจนดูเรียบ
- ทดสอบว่าพิมพ์ขาวดำแล้วยังอ่านได้
ค่าที่หายไป — ช่วงที่ไม่มีข้อมูลต้องเว้นว่าง ซึ่งอ่านง่ายเพราะไม่มีสีเลย
สเกลของแกน — ความทึบแปรตามความหนาแน่นของความน่าจะเป็น และต้องอธิบายในคำอธิบายว่าเข้มแปลว่าอะไร
กราฟจะเริ่มพังเมื่อไร
ซ้อนมากกว่า 2 แถบ ความเข้มจะบวกกันจนอ่านผิด
หน้าตาไฟล์ที่ต้องเตรียม
date,value,low,high,kind
2025-01-01,100.9,97.7,104.1,ข้อมูลจริง
2025-01-31,102.3,99.1,105.5,ข้อมูลจริง
…04อ่านแล้วเห็นอะไร
สิ่งที่เห็นได้จากภาพ
- บริเวณที่ค่ามีโอกาสมากที่สุด
- การบานของความไม่แน่นอนโดยไม่มีขอบเทียม
- ความต่างของความมั่นใจระหว่างช่วงเวลา
สิ่งที่กราฟนี้ตอบไม่ได้
- ★ ช่วงที่ระดับความเชื่อมั่นใดระดับหนึ่ง เพราะไม่มีขอบให้อ่าน
- ค่าที่แน่นอนของความน่าจะเป็นที่จุดใดจุดหนึ่ง
อ่านตามลำดับนี้
- มองหาบริเวณที่เข้มที่สุดซึ่งคือค่าที่น่าจะเป็นมากที่สุด
- ดูว่าสีจางออกไปกว้างแค่ไหน
- อ่านคำอธิบายว่าความเข้มแทนอะไร
คำถามที่ตอบได้
- ค่ามีโอกาสอยู่แถวไหนมากที่สุด
- ความมั่นใจลดลงเร็วแค่ไหน
- มีช่วงเวลาไหนที่แทบไม่รู้อะไรเลย
สัญญาณว่ามีอะไรผิด
- ไม่อธิบายว่าความเข้มแทนอะไร
- ใช้ชั้นน้อยเกินจนเห็นขอบเป็นขั้นบันได
- ซ้อนหลายแถบจนความเข้มบวกกัน
05เหมาะกับการนำเสนอแบบไหน
ทำอย่างไรให้คนอ่านได้ข้อสรุปโดยไม่ต้องบรรยาย
- ★ อธิบายว่าความเข้มแทนความน่าจะเป็น
- ติดค่ากลางเป็นตัวเลขที่จุดสำคัญ
- เพิ่มเส้นค่ากลางบาง ๆ เพื่อให้มีหลักให้จับ
รูปแบบชื่อกราฟที่ควรใช้
<ตัวชี้วัด> โดยความเข้มแทนความน่าจะเป็นของค่านั้น
06เอาไปใช้ต่อ
โค้ดทุกชิ้นอ่านไฟล์ gradient-band-sample.csv ชุดเดียวกับที่ Playground ใช้ และตัวเลขในโค้ดเปลี่ยนตามค่าที่คุณปรับด้านล่าง
# ติดตั้ง: pip install "matplotlib==3.10.*" "pandas==2.*"
# ดาวน์โหลด gradient-band-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("gradient-band-sample.csv")
df["value"] = pd.to_numeric(df["value"], errors="coerce")
df["low"] = pd.to_numeric(df["low"], errors="coerce")
df["high"] = pd.to_numeric(df["high"], errors="coerce")
NOTE = "edge" # ← ค่าจาก Playground
fig, ax = plt.subplots(figsize=(7.6, 4.2), facecolor=SURFACE)
ax.set_facecolor(SURFACE)
d = df.sort_values("date")
LAYERS = 24 # ชั้นมากพอจนไม่เห็นขั้นบันได
for i in range(LAYERS):
f = 1 - i / LAYERS
ax.fill_between(d["date"],
d["value"] - (d["value"] - d["low"]) * f,
d["value"] + (d["high"] - d["value"]) * f,
color=C1, alpha=0.035, linewidth=0)
ax.plot(d["date"], d["value"], color=C1, linewidth=1.6)
ax.set_ylabel("ค่าที่คาด")
ax.set_title("ความเข้ม = ความน่าจะเป็นของค่านั้น", loc="left", fontsize=10)
ax.spines[["top", "right"]].set_visible(False) # ลดเส้นที่ไม่ได้ให้ข้อมูล
fig.tight_layout()
fig.savefig("gradient-band.png", dpi=160)
print("เขียน gradient-band.png แล้ว ·", len(df), "แถว")07ลองเล่นเพื่อเข้าใจ
ขอบของแถบไม่ใช่เส้นแบ่งระหว่าง "เป็นไปได้" กับ "เป็นไปไม่ได้" — ค่าที่อยู่นอกแถบยังเกิดขึ้นได้
ดูข้อมูลเป็นตาราง (24 แถว)
| วันที่ | ค่ากลาง | ขอบล่าง | ขอบบน | ชนิด |
|---|---|---|---|---|
| 1/1/2568 | 101 | 97.7 | 104 | ข้อมูลจริง |
| 31/1/2568 | 102 | 99.1 | 106 | ข้อมูลจริง |
| 2/3/2568 | 101 | 97.8 | 104 | ข้อมูลจริง |
| 1/4/2568 | 103 | 99.5 | 106 | ข้อมูลจริง |
| 1/5/2568 | 104 | 101 | 107 | ข้อมูลจริง |
| 31/5/2568 | 103 | 100 | 106 | ข้อมูลจริง |
| 30/6/2568 | 103 | 99.6 | 106 | ข้อมูลจริง |
| 30/7/2568 | 101 | 97.4 | 104 | ข้อมูลจริง |
| 29/8/2568 | 99.7 | 96.5 | 103 | ข้อมูลจริง |
| 28/9/2568 | 99.6 | 96.4 | 103 | ข้อมูลจริง |
| 28/10/2568 | 102 | 98.6 | 105 | ข้อมูลจริง |
| 27/11/2568 | 103 | 99.7 | 106 | ข้อมูลจริง |
| 27/12/2568 | 103 | 99.8 | 106 | ข้อมูลจริง |
| 26/1/2569 | 106 | 103 | 109 | ข้อมูลจริง |
| 25/2/2569 | 109 | 106 | 112 | ข้อมูลจริง |
| 27/3/2569 | 112 | 109 | 115 | ข้อมูลจริง |
| 26/4/2569 | 113 | 110 | 117 | พยากรณ์ |
| 26/5/2569 | 116 | 109 | 122 | พยากรณ์ |
| 25/6/2569 | 118 | 108 | 128 | พยากรณ์ |
| 25/7/2569 | 119 | 106 | 133 | พยากรณ์ |
| 24/8/2569 | 123 | 106 | 140 | พยากรณ์ |
| 23/9/2569 | 125 | 104 | 145 | พยากรณ์ |
| 23/10/2569 | 127 | 103 | 151 | พยากรณ์ |
| 22/11/2569 | 126 | 98.8 | 153 | พยากรณ์ |
ลองแล้วจะเห็นอะไร
- สังเกตอะไร: เทียบกับหน้า confidence-band ที่ใช้ข้อมูลชุดเดียวกัน จะเห็นว่าที่นี่ไม่มีเส้นแบ่งให้ผู้อ่านเข้าใจผิดว่าข้างนอกเป็นไปไม่ได้
ข้อควรระวัง
- ไม่อธิบายว่าความเข้มแทนอะไร ทำให้ผู้อ่านเดาเอง
- ใช้ชั้นน้อยเกินจนเห็นเป็นขั้นบันได ซึ่งย้อนกลับไปสร้างขอบเทียมอีก
- ใช้ในงานพิมพ์ขาวดำที่การไล่ระดับเพี้ยน
- ซ้อนหลายแถบจนความเข้มบวกกันแล้วอ่านผิด
เมื่อไหร่ไม่ควรใช้กราฟนี้
- ผู้อ่านต้องอ่านช่วงที่ระดับความเชื่อมั่นเฉพาะ→ใช้แทน: confidence-band หรือ fan-chart
- ต้องพิมพ์ขาวดำ→ใช้แทน: confidence-band
- ค่าประมาณแยกกันไม่ต่อเนื่อง→ใช้แทน: error-bars