WebberUI

台灣縣市方塊地圖(React)

22 縣市方塊格地圖的 React 元件,不需任何地理資料:依數值著色的 choropleth、hover 提示卡、點選回呼與鍵盤方向鍵巡覽,可當作視覺化篩選器。

這是 WebberUI Pro 元件

上線活動期間免費:註冊或登入後,在上方預覽區按「複製安裝指令」就能直接安裝,不需付費、不用綁信用卡。下方那條指令未登入時會回 401。

怎麼安裝 Pro 元件 →查看方案 →

像美國州別 tile-grid map 那樣,用等大的圓角方塊排出台灣輪廓——本島由北到南、離島靠左,5 欄 × 11 列就是整張圖,不必載入任何 GeoJSON 或投影函式庫。傳入 data(縣市代碼或名稱 → 數值)即依大小內插上色,沒有資料的縣市留淡灰;hover 或聚焦格子時抬升並浮出名稱與數值,點選則加上外框與勾選徽章並回呼,天生適合當門市分佈、疫情或銷售統計的視覺化篩選器。內建 22 個行政區的代碼、全名、縮寫與預設格位(TAIWAN_REGIONS),格位可用 layout 逐一覆寫。

載入預覽⋯
npx shadcn@latest add "https://webberui.com/r/taiwan-tile-map.json?t=<安裝 token>"

Playground

即時調整 props、程式碼片段同步更新——直接試出你要的樣子再複製。

<TaiwanTileMap />

安裝

npx shadcn@latest add "https://webberui.com/r/taiwan-tile-map.json?t=<安裝 token>"

或在 components.json 設定 registries 後,改用 @webberui/taiwan-tile-map 安裝。

使用

import { TaiwanTileMap, TAIWAN_REGIONS } from "@/components/ui/taiwan-tile-map";

// 鍵可以是代碼(TPE)或縣市名(臺北市/台北市),沒列出的縣市會顯示為無資料
const storeCounts = { 臺北市: 128, 新北市: 176, TXG: 104, KHH: 98, 澎湖縣: 3 };

<TaiwanTileMap
  data={storeCounts}
  labels="short"
  onSelect={(code, selected) => console.log(code, selected)}
/>

// 多選當篩選器,並固定色階範圍(跨月份比較時顏色才一致)
<TaiwanTileMap
  data={storeCounts}
  multi
  domain={[0, 200]}
  colors={["#e0f2fe", "#075985"]}
  labels="value"
  tooltipFormatter={(region, value) => `${region.name}:${value ?? 0} 家`}
/>

// 內建常數可拿來產生選單、對照表或自訂格位
TAIWAN_REGIONS.map((r) => r.code); // ["LIE", "KIN", "PEN", "TPE", ...]

Props

Prop型別預設值說明
dataRecord<string, number>各縣市數值,鍵可為代碼(TPE)或縣市名(臺北市/台北市);沒有資料的縣市以淡灰呈現
colorScale(t: number) => string自訂色階函式:輸入 0..1 的正規化值,回傳任意 CSS 顏色;提供時優先於 colors
colors[string, string]["#d1fae5", "#047857"]兩端顏色 [最淺, 最深](hex),以 RGB 線性內插
domain[number, number]固定色階的 [min, max];不提供時自動取資料的最小/最大值
labels"name" | "short" | "value" | "none""short"格內文字顯示模式:全名、縮寫、數值或不顯示
selectedstring | string[] | null受控選取:縣市代碼(或名稱);multi 時為陣列,null 表示未選取
defaultSelectedstring | string[] | nullnull非受控模式的初始選取
onSelect(code: string, selected: string[]) => void點選格子時回呼:code 為剛切換的縣市代碼,selected 為切換後的完整選取清單
multibooleanfalse是否允許多選(再次點選同一格可取消)
showLegendbooleantrue是否顯示底部的漸層圖例(min/max 與無資料色塊)
noDataLabelstring"無資料"無資料時在提示卡與圖例顯示的文字
tooltipFormatter(region: TaiwanRegion, value: number | undefined) => React.ReactNode自訂 hover 提示卡內容;回傳節點會取代預設的「名稱+數值」
valueFormatter(value: number) => stringzh-TW 千分位數值格式化,用於格內 value 標籤、提示卡與圖例
layoutPartial<Record<string, readonly [number, number]>>覆寫個別縣市的格位:代碼 → [col, row];未列出的縣市沿用預設
size"sm" | "md" | "lg""md"尺寸預設:控制地圖最大寬度、格距、圓角與字級
aria-labelstring"台灣縣市方塊地圖"最外層群組的無障礙標籤
classNamestring透傳到最外層容器

TaiwanRegion

TAIWAN_REGIONS 常數的每一筆,也是 tooltipFormatter 的第一個參數。

欄位型別預設值說明
codestring縣市代碼(採 ISO 3166-2:TW 的三碼英文,例如 TPE
namestring官方全名,例如「臺北市」
shortstring一至二字縮寫,例如「北」「竹市」
layoutreadonly [col: number, row: number]預設格位,左上為 [0, 0]、往右往下遞增

另外具名匯出 TAIWAN_REGIONS(22 筆 TaiwanRegion)、resolveTaiwanRegion(key)(以代碼或縣市名查詢,「臺」「台」皆可)以及 TaiwanTileLabelTaiwanTileMapSize 型別。

細節

  • 預設格位:連江 [0,1]、金門 [0,2]、澎湖 [0,7];臺北 [3,0]、基隆 [4,0];桃園 [2,1]、新北 [3,1]、宜蘭 [4,1];新竹市 [1,2]、新竹縣 [2,2];苗栗 [2,3];臺中 [2,4]、南投 [3,4]、花蓮 [4,4];彰化 [1,5];雲林 [1,6];嘉義市 [1,7]、嘉義縣 [2,7]、臺東 [4,7];臺南 [1,8];高雄 [1,9];屏東 [2,10]。格網用 CSS grid(repeat(5, minmax(0, 1fr)) 搭配 aspect-square),欄數依格位自動計算,覆寫 layout 時整張圖跟著重排。
  • 著色:先把每個值正規化到 0..1((value − min) / (max − min),範圍來自資料或 domain),再交給 colorScale,或在 colors 兩端之間做 RGB 內插;只有一個值時直接視為最深色。格內文字會依方塊顏色的 WCAG 相對亮度自動切換深淺,自訂色階回傳無法解析的顏色(如 hsl())時退回依 t 值判斷。
  • 提示卡:由 hover 或鍵盤聚焦觸發,頂端兩列往下開、其餘往上開,最左/最右欄靠邊對齊,不需量測也不會超出地圖範圍。
  • 進場動畫:各格依 row 交錯淡入放大,同列再依 col 微幅錯開,視覺上像由北到南鋪開;覆寫 layout 或切換 size 時,格子位置以 layout 動畫平滑移動。

可及性

  • 格網為 role="group" 並帶 aria-label(可自訂),顯示圖例時以 aria-describedby 連到圖例;每個縣市是 type="button" 的按鈕,aria-label 包含全名與數值(或無資料文字),aria-pressed 反映選取狀態
  • 採 roving tabindex:整張圖只佔一個 Tab 停點,方向鍵優先沿同欄/同列移動、該方向沒有格子時斜向跳到最近的一格,Home / End 跳到第一/最後一格,Enter / Space 切換選取,Esc 收起提示卡;焦點格有 focus-visible 外框
  • 選取狀態變化寫入 aria-live="polite" 的隱藏區域(例如「已選取 臺北市、桃園市」),選取格另加勾選徽章,不只靠顏色辨識;提示卡與圖例色條標記 aria-hidden
  • 使用者系統開啟「減少動態效果」時,停用進場交錯、hover 抬升與 layout 位移動畫,提示卡改為直接顯示/隱藏,顏色與外框回饋不變

本頁目錄