# 繪製臺灣與自訂區域水平及垂直分布圖的 R 套件 `twmap`
###### tags: `用R做` `地理資訊系統`
碩士班時期,需要繪製許多物種在臺灣的分布圖以及海拔示意圖。這種批次繪圖的工作,用 R 來做應該是相當方便的,當時便找到了林政道老師所開發的 `twmap` 套件。不過當時因為這個套件的版本相依性問題沒有解決(這套件依賴的部分 R 套件已經合併或停用了),加上當時能力不足,就放棄使用這個套件。
直到最近又有類似的需求,加上強大的 AI 工具輔助,終於把這個套件完全轉移到現有的套件功能上,解決相依性問題。
我在這個版本中,除了解決套件本身的問題,也把原本林老師設計的部分實作完成,提供更彈性的繪圖功能,以下介紹最主要的功能:
### 繪製物種在臺灣的分布圖
首先是最主要的功能 `distrmap.tw()`,可以繪製物種在臺灣的分布圖,包含分布位置與海拔分布。
注意輸入的物種分布點位順序為 x(經度)、y(緯度)、z(海拔高度)。要取得這些資料,可以考慮從生物多樣性研究所的[台灣生物多樣性網絡(TBN)](https://www.tbn.org.tw/taxa)查詢特定物種,依序點選「查詢TBN紀錄」、「觀測紀錄表」來下載,之後把資料清理成 x、y、z 的順序就可以了。
以下為使用示例與產出的圖:
```{R}=
data("sample_spts.tw")
distrmap.tw(sample_spts.tw, theme = 1, pch = 16, cex = 0.5, col = "red")
```

在這個功能中,`theme` 參數可以調整臺灣底圖的樣式。
- `theme = 1` 是分層設色圖。
- `theme = 2` 是顏色較淺且半透明的分層設色圖。
- `theme = 3` 是數值地形模型(DTM)的黑白算繪(render)圖。
- `theme = 4` 是邊界,只會畫出深灰色的邊界。效果可見下方第三張示例圖。
### 繪製自訂範圍的分布圖
這是原本林老師希望做的功能 `distrmap()`,不過在他當初提供的範例中,底圖的經緯度都已經固定為臺灣範圍,且輸入用的 DTM 因為檔案太大,沒辦法放在 GitHub 上,因此我把繪製臺灣的功能單獨移出來成為 [`distrmap.tw()`](https://hackmd.io/RKISvE5GTgC5ZTKryzQaWg?stext=328%3A15%3A1%3A1764756094%3AIk3lht&both=),用原有的資料集來繪圖;而將 `distrmap()` 改為完全自訂範圍的分布圖。
這個功能需要輸入自訂範圍的邊界(border)的 shape **檔案路徑路徑**,以及**經過分析的**數值地形模型剖面圖。
以蘭嶼來示範前置步驟如下:
```{R}=
boundary_path <- system.file("extdata", "LanyuBorder.shp", package = "twmap")
profile_data <- lat_elev_profile(system.file("extdata", "LanyuDTM.tif", package = "twmap"))
```
其中 `lat_elev_profile` 是套件中專門產出地形剖面資料的功能,需要輸入 DTM 的 GeoTIFF 檔;輸出的地形剖面資料可供後續繪圖。
接下來的繪圖,就是輸入分布點位,畫在自訂範圍邊界與地形剖面資料而已。
套件中提供清理自 TBN 中蘭嶼山桂花 *Maesa lanyuensis* Yuen P.Yang 在蘭嶼的分布資料作為示例:
```{R}=
data("sample_spts.ly")
distrmap(sample_spts.ly, boundary = boundary_path, vert_prof = profile_data, col = "blue")
```

### 如何同時呈現超過一個物種的分布
雖然這些功能本身沒有設計輸入超過一份分布點位的功能,但我們可以將需要繪製的物種點位合併、預先指定好顏色之後繪圖呈現。
以下用雙環翠鳳蝶 *Papilio hopponis* Matsumura, 1907(雙環鳳蝶,分布於臺灣中北部中海拔)與黃帶隱蛺蝶 *Yoma sabina podium* Tsukada, 1985(黃帶枯葉蝶,分布於臺灣南部、東部中低海拔)作為示例:
```{R}=
> sp1 <- system.file("extdata", "Yoma_sabina_podium.csv", package = "twmap") |> read.csv(header = T)
> sp2 <- system.file("extdata", "Papilio_hopponis.csv", package = "twmap") |> read.csv(header = T)
sp1$species <- "A"
sp2$species <- "B"
pts_all <- rbind(sp1, sp2)
cols <- ifelse(pts_all$species == "A", "tomato3", "steelblue3")
png("dir_you_set/test.png", width = 2000, height = 2400, pointsize = 40)
distrmap.tw(pts_all, theme = 4, cex = .5, pch = 19, col = cols)
legend("bottomleft", , inset = c(0.04, 0.08), legend = c("Yoma sabina podium", "Papilio hopponis"), col = c("tomato3", "steelblue3"), pch = 16, pt.cex = 0.7, bty = "n", bg = rgb(1, 1, 1, 0.7))
dev.off()
```

### 如何安裝
上面提到的檔案,都已經附在套件裡,只要安裝好,就可以照著上面的程式碼跑看看。
安裝的方法如下:
```{R}
install.packages('devtools')
library(devtools)
devtools::install_github('gavin987/twmap')
```
### 未來可擴充的功能
對於輸入的分布資料要同時具備 x、y、z 座標這個要求或許有些嚴格,畢竟不是每份資料集都有紀錄海拔資料,所以 TBN 下載到的觀測紀錄可用資料可能會受限於缺乏海拔。
如果要自己手動查詢輸入,又會花上不少時間。
未來會加上輸入 x、y 座標與 DTM 就能查詢海拔的功能,相信會讓這個套件更完善。
最後感謝林政道老師當年上傳這個套件供大家使用。雖然老師很快就開發出 QGIS 用的模板 [distrmap_tw.qgis](https://github.com/mutolisp/distrmap_tw.qgis),不過還留著這個 R 套件,讓我有機會把它完善。希望這套件修好之後,能協助到有需要的人。
<span style="font-size:30px">🐕🦺</span><font color="dcdcdc">2025.12.03</font>