01ภาพรวมของกราฟนี้
Choropleth map ระบายสีเขตการปกครองตามค่าที่วัดได้ เหมาะกับข้อมูลที่ผูกกับเขตอยู่แล้ว จุดที่ต้องระวังที่สุดคือต้องใช้อัตราส่วนไม่ใช่จำนวนนับ เพราะไม่อย่างนั้นแผนที่จะแสดงแค่ว่าเขตไหนมีคนเยอะ และเขตใหญ่จะครองสายตาเสมอทั้งที่อาจมีคนอยู่น้อย
เปรียบเทียบให้เห็นภาพ
เหมือนแผนที่พยากรณ์อากาศที่ระบายสีจังหวัดตามอุณหภูมิ ซึ่งเห็นได้ทันทีว่าภาคไหนร้อนภาคไหนเย็น
ใช้ที่ไหนบ้าง — อัตราการว่างงานรายจังหวัด ผลการเลือกตั้งรายเขต อัตราการเกิดโรคต่อประชากร หรือสัดส่วนครัวเรือนที่เข้าถึงอินเทอร์เน็ต
สร้างอย่างไร
- ขั้นที่ 1★ แปลงจำนวนนับเป็นอัตราส่วนต่อประชากรหรือพื้นที่
- ขั้นที่ 2เลือกวิธีแบ่งช่วงค่าและระบุไว้ในคำอธิบาย
- ขั้นที่ 3ใช้สเกลสีลำดับเดียวไล่อ่อนไปเข้ม
- ขั้นที่ 4ใส่คำอธิบายสีพร้อมหน่วยเสมอ
ตัวอย่างคลาสสิก · แผนที่อหิวาตกโรคของ John Snow ปี 1854
John Snow วาดตำแหน่งผู้เสียชีวิตจากอหิวาตกโรคลงบนแผนที่ย่านโซโหในลอนดอน แล้วเห็นว่าผู้เสียชีวิตกระจุกรอบปั๊มน้ำบนถนน Broad Street ซึ่งเป็นหลักฐานที่ทำให้เขาโน้มน้าวให้ถอดคันโยกปั๊มออก นี่คือตัวอย่างแรก ๆ ที่การวางข้อมูลลงบนแผนที่เผยสาเหตุที่ตารางตัวเลขซ่อนไว้
02อธิบายภาษาคนเข้าใจง่าย ๆ
ข้อมูลหลายอย่างผูกกับพื้นที่โดยธรรมชาติ เช่น อัตราการว่างงานรายจังหวัด ซึ่งดูจากตาราง 77 แถวแล้วแทบมองไม่เห็นรูปแบบอะไร
Choropleth map ใช้ประโยชน์จากข้อเท็จจริงว่าคนจำแผนที่ประเทศตัวเองได้ เมื่อระบายสีตามค่า เขตที่มีค่าใกล้กันซึ่งอยู่ติดกันก็จะรวมเป็นบริเวณสีเดียวกันทันที
ผลคือรูปแบบเชิงพื้นที่ เช่น ภาคเหนือทั้งภาคมีค่าสูงกว่าภาคกลาง ปรากฏขึ้นในพริบตา ซึ่งเป็นสิ่งที่ตารางเรียงตามตัวอักษรไม่มีทางแสดงได้
กับดักที่ใหญ่ที่สุดคือการใช้จำนวนนับแทนอัตราส่วน ถ้าระบายสีตามจำนวนผู้ป่วย แผนที่จะเข้มที่กรุงเทพเสมอ เพราะกรุงเทพมีคนเยอะ ไม่ใช่เพราะที่นั่นมีความเสี่ยงสูง
กับดักที่สองมาจากเรขาคณิต เขตที่มีพื้นที่ใหญ่ครองสายตามากกว่าเขตเล็ก แม้จะมีคนอยู่น้อยกว่ามาก ซึ่งแปลว่าแผนที่ให้น้ำหนักตามพื้นที่ ไม่ใช่ตามจำนวนคน
กับดักที่สามคือวิธีแบ่งช่วงค่า แบ่งเท่ากัน แบ่งตามควอนไทล์ หรือแบ่งด้วย Jenks ให้แผนที่หน้าตาต่างกันมากจากข้อมูลชุดเดียวกัน จึงต้องระบุวิธีที่ใช้เสมอ
03ข้อมูลที่ต้องใช้
คอลัมน์ที่ต้องเตรียม
| คอลัมน์ | ทำหน้าที่ | ชนิด | เข้ารหัสด้วย | จำนวนค่าที่เหมาะ | หมายเหตุ |
|---|---|---|---|---|---|
province | เขตพื้นที่ | เชิงพื้นที่ | shape | 10–100 เขต | ต้องตรงกับชื่อในไฟล์ขอบเขต |
regionไม่บังคับ | ภูมิภาค | หมวดหมู่ | row | 4–8 กลุ่ม | ใช้จัดกลุ่มในตารางประกอบ |
rate | อัตราส่วน | ตัวเลขต่อเนื่อง | color | ต่อเนื่อง | ★ ต้องเป็นอัตราส่วน ไม่ใช่จำนวนนับ |
ต้องเตรียมข้อมูลอย่างไรก่อนวาด
- ★ หารด้วยประชากรหรือพื้นที่เพื่อให้เป็นอัตราส่วน
- ตรวจว่าชื่อเขตตรงกับไฟล์ขอบเขตทุกตัว
- เลือกและบันทึกวิธีแบ่งช่วงค่า
ค่าที่หายไป — เขตที่ไม่มีข้อมูลต้องระบายด้วยลายหรือสีเทาที่ต่างจากสเกลหลักชัดเจน และเขียนไว้ในคำอธิบาย
สเกลของแกน — ใช้สเกลสีลำดับเดียวสำหรับค่าที่มีทิศทางเดียว และใช้สเกลสองขั้วพร้อมกลางสีเทาเมื่อมีจุดอ้างอิงที่มีความหมาย
กราฟจะเริ่มพังเมื่อไร
เขตเล็กมากจนมองไม่เห็น เช่น เขตเมืองในแผนที่ทั้งประเทศ
หน้าตาไฟล์ที่ต้องเตรียม
province,region,rate
กรุงเทพฯ,เหนือ,26.6
เชียงใหม่,อีสาน,34.7
…04อ่านแล้วเห็นอะไร
สิ่งที่เห็นได้จากภาพ
- บริเวณที่มีค่าสูงหรือต่ำต่อเนื่องกัน
- เขตที่ต่างจากเพื่อนบ้านอย่างชัดเจน
- ความต่างระหว่างภูมิภาค
สิ่งที่กราฟนี้ตอบไม่ได้
- ★ เทียบค่าระหว่างเขตให้แม่นไม่ได้เพราะอ่านจากสี ต้องมีตารางประกอบ
- ★ เขตพื้นที่ใหญ่ครองสายตามากกว่าเขตเล็ก แม้จะมีคนอยู่น้อยกว่า
- รูปแบบภายในเขตเดียวกันซึ่งถูกกลบเป็นสีเดียว
อ่านตามลำดับนี้
- อ่านคำอธิบายสีและหน่วยก่อนเสมอ
- มองหาบริเวณสีเดียวกันที่ต่อเนื่องกัน
- ตรวจว่าเขตที่เข้มที่สุดเป็นเพราะค่าสูงจริงหรือเพราะพื้นที่ใหญ่
คำถามที่ตอบได้
- ภูมิภาคไหนมีค่าสูงที่สุด
- ค่าสูงกระจุกอยู่ที่ไหน
- มีเขตไหนผิดจากเพื่อนบ้านบ้าง
สัญญาณว่ามีอะไรผิด
- ใช้จำนวนนับแทนอัตราส่วน
- ไม่ระบุวิธีแบ่งช่วงค่า
- ใช้สเกลสีรุ้งซึ่งไม่มีลำดับที่คนอ่านตรงกัน
- ไม่แยกเขตที่ไม่มีข้อมูลออกจากเขตที่มีค่าต่ำ
05เหมาะกับการนำเสนอแบบไหน
ทำอย่างไรให้คนอ่านได้ข้อสรุปโดยไม่ต้องบรรยาย
- ★ เขียนหน่วยไว้ในคำอธิบายสีเสมอ เช่น ต่อประชากรหมื่นคน
- ติดชื่อเฉพาะเขตที่พูดถึงในเรื่อง
- ใส่ตารางอันดับสิบอันดับแรกประกอบเพื่อให้เทียบค่าได้แม่น
รูปแบบชื่อกราฟที่ควรใช้
<ตัวชี้วัด> ต่อ <ฐาน> รายจังหวัด โดย <จังหวัด> สูงที่สุดที่ <ค่า>
06เอาไปใช้ต่อ
โค้ดทุกชิ้นอ่านไฟล์ choropleth-map-sample.csv ชุดเดียวกับที่ Playground ใช้ และตัวเลขในโค้ดเปลี่ยนตามค่าที่คุณปรับด้านล่าง
# ติดตั้ง: pip install "matplotlib==3.10.*" "pandas==2.*"
# ดาวน์โหลด choropleth-map-sample.csv จากหน้านี้ แล้ววางไว้ข้างสคริปต์
import matplotlib
matplotlib.use("Agg") # รันแบบไม่มีหน้าจอ ถ้ารันในเครื่องตัวเองลบบรรทัดนี้ได้
import matplotlib.pyplot as plt
import pandas as pd
import geopandas as gpd
C1, C2, C3 = "#2a78d6", "#eb6834", "#1baf7a" # palette ของคลัง เปลี่ยนเป็นสีองค์กรได้
INK, SURFACE = "#0b0b0b", "#fcfcfb"
df = pd.read_csv("choropleth-map-sample.csv")
df["rate"] = pd.to_numeric(df["rate"], errors="coerce")
NOTE = "area" # ← ค่าจาก Playground
fig, ax = plt.subplots(figsize=(7.6, 4.2), facecolor=SURFACE)
ax.set_facecolor(SURFACE)
gdf = gpd.read_file("provinces.geojson").merge(df, on="province")
gdf.plot(column="rate", cmap="Blues", ax=ax, legend=True,
scheme="quantiles", k=5, # ระบุวิธีแบ่งช่วงเสมอ
edgecolor="#fcfcfb", linewidth=0.6,
missing_kwds=dict(color="#e8e6e0", hatch="///", label="ไม่มีข้อมูล"))
ax.set_axis_off()
ax.set_title("อัตราต่อประชากรหมื่นคน · แบ่งช่วงแบบควอนไทล์", loc="left")
ax.spines[["top", "right"]].set_visible(False) # ลดเส้นที่ไม่ได้ให้ข้อมูล
fig.tight_layout()
fig.savefig("choropleth-map.png", dpi=160)
print("เขียน choropleth-map.png แล้ว ·", len(df), "แถว")07ลองเล่นเพื่อเข้าใจ
ต้องใช้กับอัตราหรือสัดส่วนเท่านั้น ถ้าใช้กับจำนวนดิบ พื้นที่ที่มีประชากรมากจะเข้มเสมอ
ดูข้อมูลเป็นตาราง (12 แถว)
| จังหวัด | ภูมิภาค | ค่า (ต่อประชากรหมื่นคน) |
|---|---|---|
| กรุงเทพฯ | เหนือ | 26.6 |
| เชียงใหม่ | อีสาน | 34.7 |
| ขอนแก่น | กลาง | 32.7 |
| ชลบุรี | ตะวันออก | 34.4 |
| ภูเก็ต | ตะวันตก | 26.8 |
| นครราชสีมา | ใต้ | 18.3 |
| สงขลา | เหนือ | 10.4 |
| อุดรธานี | อีสาน | 23.1 |
| สุราษฎร์ธานี | กลาง | 20.1 |
| พิษณุโลก | ตะวันออก | 17.9 |
| ระยอง | ตะวันตก | 17.4 |
| นครปฐม | ใต้ | 10.5 |
ลองแล้วจะเห็นอะไร
- สังเกตอะไร: สังเกตว่าเขตพื้นที่ใหญ่ดึงความสนใจมากกว่าเขตเล็กเสมอ แม้ค่าจะเท่ากัน — นี่คือเหตุผลที่ cartogram มีอยู่
ข้อควรระวัง
- ★ ใช้จำนวนนับแทนอัตราส่วน ทำให้แผนที่แสดงแค่ว่าที่ไหนมีคนเยอะ
- ลืมว่าเขตพื้นที่ใหญ่ครองสายตามากกว่าเขตเล็กที่มีคนอยู่มากกว่า
- ไม่ระบุวิธีแบ่งช่วงค่า ทั้งที่วิธีต่างกันให้แผนที่หน้าตาต่างกันมาก
- ใช้สเกลสีรุ้งซึ่งไม่มีลำดับที่คนอ่านตรงกัน
เมื่อไหร่ไม่ควรใช้กราฟนี้
- ต้องเทียบค่าระหว่างเขตให้แม่น→ใช้แทน: horizontal-bar เรียงตามค่า
- ประชากรกระจุกในเขตเล็กไม่กี่เขต→ใช้แทน: cartogram หรือ tile-grid-map
- ข้อมูลเป็นจุดพิกัดไม่ใช่รายเขต→ใช้แทน: dot-density-map หรือ graduated-symbol-map