01ภาพรวมของกราฟนี้
Small multiple maps วางแผนที่หลายภาพเรียงกันโดยใช้สเกลสีเดียวกันทุกภาพ ทำให้เห็นการเปลี่ยนแปลงเชิงพื้นที่ตามเวลาได้โดยไม่ต้องอาศัยแอนิเมชันหรือความจำ กฎเหล็กคือทุกภาพต้องใช้สเกลเดียวกัน ไม่อย่างนั้นการเทียบกันก็ไร้ความหมาย
เปรียบเทียบให้เห็นภาพ
เหมือนภาพถ่ายดาวเทียมชุดเดียวกันถ่ายห่างกันปีละภาพ ซึ่งวางเรียงแล้วเห็นป่าหายไปทีละน้อย
ใช้ที่ไหนบ้าง — การแพร่ระบาดของโรคตามเวลา การขยายตัวของเมือง การเปลี่ยนแปลงผลการเลือกตั้งข้ามรอบ หรือการเทียบตัวชี้วัดหลายตัวในพื้นที่เดียวกัน
สร้างอย่างไร
- ขั้นที่ 1★ คำนวณสเกลสีจากข้อมูลทุกช่วงรวมกันแล้วใช้สเกลเดียวทุกภาพ
- ขั้นที่ 2เรียงภาพตามลำดับเวลาที่อ่านเป็นธรรมชาติ
- ขั้นที่ 3ใช้ขนาดและมุมมองเดียวกันทุกภาพ
- ขั้นที่ 4ใส่คำอธิบายสีชุดเดียวไว้นอกกริด
ตัวอย่างคลาสสิก · แผนที่ชุดแสดงการระบาดของโรคหัดก่อนและหลังมีวัคซีน
The Wall Street Journal เผยแพร่ภาพชุดแผนที่อัตราการเกิดโรคติดต่อรายรัฐเรียงตามปี โดยใช้สเกลสีเดียวกันทั้งหมด เส้นแบ่งที่ปีที่เริ่มใช้วัคซีนปรากฏชัดเจนจนไม่ต้องอธิบาย และกลายเป็นหนึ่งในภาพข้อมูลที่ถูกแชร์มากที่สุดในทศวรรษนั้น
02อธิบายภาษาคนเข้าใจง่าย ๆ
เมื่ออยากรู้ว่ารูปแบบเชิงพื้นที่เปลี่ยนไปอย่างไร ทางเลือกคือทำแอนิเมชัน หรือวางภาพเรียงกัน
แอนิเมชันดูน่าตื่นเต้นแต่มีจุดอ่อนร้ายแรง คือผู้ชมต้องจำภาพก่อนหน้าไว้ในหัวเพื่อเทียบกับภาพปัจจุบัน ซึ่งความจำระยะสั้นของคนทำได้แย่มาก
Small multiple maps แก้ด้วยการวางทุกช่วงเวลาไว้ให้เห็นพร้อมกัน ผู้อ่านจึงเทียบด้วยการกวาดสายตา ซึ่งแม่นกว่าการจำหลายเท่า และยังย้อนกลับไปดูซ้ำได้ตามใจ
กฎเหล็กข้อเดียวคือทุกภาพต้องใช้สเกลสีเดียวกัน ถ้าแต่ละภาพคำนวณสเกลของตัวเอง สีเดียวกันในสองภาพจะแทนค่าคนละค่า ซึ่งทำให้การเทียบกันไร้ความหมายโดยสิ้นเชิง
ข้อจำกัดคือแต่ละภาพเล็กลงตามจำนวนภาพ จึงเหมาะกับรูปแบบใหญ่ ๆ ที่เห็นได้แม้ภาพเล็ก ไม่เหมาะกับรายละเอียดปลีกย่อย
03ข้อมูลที่ต้องใช้
คอลัมน์ที่ต้องเตรียม
| คอลัมน์ | ทำหน้าที่ | ชนิด | เข้ารหัสด้วย | จำนวนค่าที่เหมาะ | หมายเหตุ |
|---|---|---|---|---|---|
province | เขตพื้นที่ | เชิงพื้นที่ | shape | 10–80 เขต | ชุดเดียวกันทุกภาพ |
region | ช่วงเวลาหรือกลุ่ม | มีลำดับ | column | 3–12 ภาพ | แต่ละค่าเป็นหนึ่งภาพย่อย |
rate | ค่าที่วัด | ตัวเลขต่อเนื่อง | color | ต่อเนื่อง | ★ สเกลสีต้องมาจากข้อมูลทุกภาพรวมกัน |
ต้องเตรียมข้อมูลอย่างไรก่อนวาด
- ★ คำนวณช่วงค่าจากข้อมูลทุกภาพรวมกันก่อนกำหนดสเกลสี
- ตรวจว่าทุกภาพมีเขตครบชุดเดียวกัน
- เรียงภาพตามลำดับเวลา
ค่าที่หายไป — ช่วงเวลาที่ไม่มีข้อมูลต้องแสดงเป็นภาพว่างพร้อมคำอธิบาย ไม่ใช่ข้ามไป เพราะการข้ามทำให้ช่วงเวลาดูต่อเนื่องทั้งที่ไม่
สเกลของแกน — ★ สเกลสีเดียวกันทุกภาพโดยไม่มีข้อยกเว้น และมุมมองกับขนาดต้องเท่ากันหมด
กราฟจะเริ่มพังเมื่อไร
เกิน 12 ภาพ แต่ละภาพเล็กจนไม่เห็นรูปแบบ
หน้าตาไฟล์ที่ต้องเตรียม
province,region,rate
กรุงเทพฯ,เหนือ,26.6
เชียงใหม่,อีสาน,34.7
…04อ่านแล้วเห็นอะไร
สิ่งที่เห็นได้จากภาพ
- ทิศทางการเปลี่ยนแปลงเชิงพื้นที่ตามเวลา
- บริเวณที่เปลี่ยนเร็วที่สุด
- บริเวณที่ไม่เปลี่ยนเลย
- จุดเริ่มต้นของการแพร่กระจาย
สิ่งที่กราฟนี้ตอบไม่ได้
- ★ รายละเอียดปลีกย่อย เพราะแต่ละภาพเล็กลงตามจำนวนภาพ
- ค่าที่แม่นยำของแต่ละเขตในแต่ละภาพ
อ่านตามลำดับนี้
- ดูภาพแรกและภาพสุดท้ายก่อนเพื่อรู้ทิศทางรวม
- กวาดสายตาตามลำดับเพื่อดูว่าเปลี่ยนตอนไหน
- เลือกเขตหนึ่งแล้วตามเขตนั้นข้ามทุกภาพ
คำถามที่ตอบได้
- รูปแบบเชิงพื้นที่เปลี่ยนไปอย่างไร
- เริ่มจากที่ไหนแล้วลามไปทางไหน
- ที่ไหนเปลี่ยนเร็วที่สุด
สัญญาณว่ามีอะไรผิด
- แต่ละภาพใช้สเกลสีของตัวเอง
- ภาพขนาดหรือมุมมองไม่เท่ากัน
- ข้ามช่วงเวลาที่ไม่มีข้อมูลโดยไม่บอก
05เหมาะกับการนำเสนอแบบไหน
ทำอย่างไรให้คนอ่านได้ข้อสรุปโดยไม่ต้องบรรยาย
- ★ วางคำอธิบายสีชุดเดียวไว้นอกกริดเพื่อย้ำว่าใช้สเกลเดียวกัน
- ติดชื่อช่วงเวลาไว้บนทุกภาพ
- ทำเครื่องหมายภาพที่เป็นจุดเปลี่ยนสำคัญ
รูปแบบชื่อกราฟที่ควรใช้
<ตัวชี้วัด> ระหว่าง <ช่วงแรก> ถึง <ช่วงสุดท้าย> โดยใช้สเกลสีเดียวกันทุกภาพ
06เอาไปใช้ต่อ
โค้ดทุกชิ้นอ่านไฟล์ small-multiple-maps-sample.csv ชุดเดียวกับที่ Playground ใช้ และตัวเลขในโค้ดเปลี่ยนตามค่าที่คุณปรับด้านล่าง
# ติดตั้ง: pip install "matplotlib==3.10.*" "pandas==2.*"
# ดาวน์โหลด small-multiple-maps-sample.csv จากหน้านี้ แล้ววางไว้ข้างสคริปต์
import matplotlib
matplotlib.use("Agg") # รันแบบไม่มีหน้าจอ ถ้ารันในเครื่องตัวเองลบบรรทัดนี้ได้
import matplotlib.pyplot as plt
import pandas as pd
import geopandas as gpd
import matplotlib.pyplot as plt
C1, C2, C3 = "#2a78d6", "#eb6834", "#1baf7a" # palette ของคลัง เปลี่ยนเป็นสีองค์กรได้
INK, SURFACE = "#0b0b0b", "#fcfcfb"
df = pd.read_csv("small-multiple-maps-sample.csv")
df["rate"] = pd.to_numeric(df["rate"], errors="coerce")
NOTE = "scale" # ← ค่าจาก Playground
fig, ax = plt.subplots(figsize=(7.6, 4.2), facecolor=SURFACE)
ax.set_facecolor(SURFACE)
periods = sorted(df["period"].unique())
vmin, vmax = df["rate"].min(), df["rate"].max() # ★ สเกลร่วมจากข้อมูลทุกช่วง
fig, axes = plt.subplots(2, 3, figsize=(11, 7), constrained_layout=True)
base = gpd.read_file("provinces.geojson")
for ax_, p in zip(axes.ravel(), periods):
g = base.merge(df[df["period"] == p], on="province")
g.plot(column="rate", cmap="Blues", vmin=vmin, vmax=vmax, # vmin/vmax เหมือนกันหมด
ax=ax_, edgecolor="#fcfcfb", linewidth=0.4)
ax_.set_title(str(p), fontsize=10, loc="left"); ax_.set_axis_off()
fig.colorbar(plt.cm.ScalarMappable(cmap="Blues",
norm=plt.Normalize(vmin, vmax)), ax=axes, shrink=0.6, label="ต่อประชากรหมื่นคน")
ax.spines[["top", "right"]].set_visible(False) # ลดเส้นที่ไม่ได้ให้ข้อมูล
fig.tight_layout()
fig.savefig("small-multiple-maps.png", dpi=160)
print("เขียน small-multiple-maps.png แล้ว ·", len(df), "แถว")07ลองเล่นเพื่อเข้าใจ
ถ้าแต่ละแผงใช้สเกลสีของตัวเอง การเทียบข้ามแผงจะไม่มีความหมาย — ต้องใช้สเกลร่วมเสมอ
ดูข้อมูลเป็นตาราง (12 แถว)
| จังหวัด | ไตรมาส 1 | ไตรมาส 2 | ไตรมาส 3 | ไตรมาส 4 |
|---|---|---|---|---|
| กรุงเทพฯ | 21.8 | 25.0 | 28.2 | 31.4 |
| เชียงใหม่ | 28.5 | 32.6 | 36.8 | 40.9 |
| ขอนแก่น | 26.8 | 30.7 | 34.7 | 38.6 |
| ชลบุรี | 28.2 | 32.3 | 36.5 | 40.6 |
| ภูเก็ต | 22.0 | 25.2 | 28.4 | 31.6 |
| นครราชสีมา | 15.0 | 17.2 | 19.4 | 21.6 |
| สงขลา | 8.53 | 9.78 | 11.0 | 12.3 |
| อุดรธานี | 18.9 | 21.7 | 24.5 | 27.3 |
| สุราษฎร์ธานี | 16.5 | 18.9 | 21.3 | 23.7 |
| พิษณุโลก | 14.7 | 16.8 | 19.0 | 21.1 |
| ระยอง | 14.3 | 16.4 | 18.4 | 20.5 |
| นครปฐม | 8.61 | 9.87 | 11.1 | 12.4 |
ลองแล้วจะเห็นอะไร
- สังเกตอะไร: ลองจินตนาการว่าแต่ละภาพใช้สเกลของตัวเอง สีเดียวกันจะแทนค่าคนละค่า และการเทียบทั้งหมดก็พังทันที
ข้อควรระวัง
- ★ ให้แต่ละภาพคำนวณสเกลสีของตัวเอง ทำให้สีเดียวกันแทนค่าคนละค่า
- ใช้ขนาดหรือมุมมองแผนที่ไม่เท่ากันในแต่ละภาพ
- ใส่ภาพมากเกินจนแต่ละภาพเล็กจนไม่เห็นอะไร
- ข้ามช่วงเวลาที่ไม่มีข้อมูลโดยไม่บอก ทำให้ดูต่อเนื่องทั้งที่ไม่
เมื่อไหร่ไม่ควรใช้กราฟนี้
- มีช่วงเวลาเดียว→ใช้แทน: choropleth-map
- สนใจแนวโน้มของตัวเลขมากกว่าตำแหน่ง→ใช้แทน: line-chart หรือ slope-graph
- มีมากกว่า 12 ช่วงเวลา→ใช้แทน: heatmap-matrix ที่แกนหนึ่งเป็นเวลา