Membuat Visualisasi Peta Menggunakan ggplot2 & sf

Data Science Indonesia
Data Science Indonesia
3 min readDec 31, 2019

By Rasyid Ridha

Di tulisan ini, saya akan membahas mengenai cara memvisualisasikan data spasial di R menggunakan ggplot2 dan sf. Sebenarnya, ada banyak alternatif di R untuk memvisualisasikan data spasial secara interaktif maupun statis. Untuk visualisasi interaktif, ada Leaflet maupun Highchart. Sedangkan untuk visualisasi statis, ada rgdal, sp, ggmap maupun sf.

Untuk visualisasi statis, saya pun lebih merekomendasikan sf dikarenakan fungsi-fungsi untuk melakukan operasi spasial di sana sudah lengkap sehingga membuat R seolah-olah menjadi GIS. Saya bisa melakukan spatial join, membaca peta dari berbagai format seperti GeoJSON maupun SHP, dan lain-lain. Terlebih lagi, sf sudah lebih modern dan juga berasaskan R ala Hadleyverse atau yang lebih dikenal dengan tidyverse.

Persiapan

Untuk melakukan visualisasi spasial, dibutuhkan library sf serta ggplot2 versi pengembangan untuk menjalankan fungsi “geom_sf”. Untuk peta yang digunakan (biasanya SHP), ada banyak sekali sumber yang bisa didapatkan di internet. Dengan menggunakan library indonesia, anda bisa mendapatkan peta Indonesia level provinsi maupun kota yang bersumber dari GADM dan juga peta Jakarta level kecamatan, kelurahan maupun RW yang bersumber dari Jakarta Smart City. Data peta pun sudah dibentuk dalam kelas sf data frame agar fungsi “geom_sf” untuk visualisasi dapat dijalankan.

# install.packages("devtools") # install.packages("tidyverse") install.packages("sf") devtools::install_github("tidyverse/ggplot2") devtools::install_github("rasyidstat/indonesia") library(sf) library(tidyverse) library(indonesia)

Data

Untuk data yang digunakan, mari kita gunakan data kriminalitas di Jakarta yang didapatkan dari #DOTD (data of the day) Bung Ramda di sini. Data pun bisa didapatkan via API dengan bentuk JSON yang kemudian diubah ke bentuk data frame dengan cara berikut ini.

library(jsonlite) crim <- fromJSON("https://ramdayz.carto.com/api/v2/sql?q=select%20*,%20st_x(the_geom)%20as%20lon,%20st_y(the_geom)%20as%20lat%20from%20public.jakarta_streetcrime") crim <- as.data.frame(crim) %>% select(lon=rows.lon, lat=rows.lat, address=rows.nama_jalan, n=rows.jumlah)

Kepingan data lainnya yang akan digunakan adalah data batas kelurahan kota Jakarta yang nantinya akan digabung dengan data crim di atas. Dengan menggunakan fungsi “id_map”, Anda bisa mendapatkan data batas kelurahan kota Jakarta yang sudah dikemas dalam bentuk kelas sf data frame. DI sisi lain, data crim yang masih berbentuk kelas data frame harus diubah ke bentuk sf data frame menggunakan fungsi “st_as_sf” dengan titik koordinat sebagai geometrinya.

dki <- id_map("jakarta", "kelurahan") crim <- st_as_sf(crim, coords=c("lon", "lat"))

Penggabungan spasial pun dilakukan dengan cara berikut. Setelah itu, sedikit sentuhan dplyr harus dilakukan untuk mengagregasi data titik-titik koordinat kriminalitas ke level kelurahan.

# project dki features to crim st_crs(crim) <- st_crs(dki) # join data crim_final <- st_join(dki, crim, left=FALSE) # aggregate data crim_final <- crim_final %>% select(kelurahan=nama_kelurahan, kecamatan=nama_kecamatan, n) %>% group_by(kelurahan, kecamatan) %>% summarise(n = sum(n))

Visualisasi

Data sudah siap disajikan untuk selanjutnya divisualisasi. Dengan beberapa baris kode ggplot2 berikut, visualisasi peta ala chloropeth secara sederhana dapat dilakukan.

ggplot(crim_final) + geom_sf(aes(fill=n), color="gray75")

Agar lebih bersih dan rapi lagi, berikut kode yang dapat digunakan.

ggplot(crim_final) + geom_sf(aes(fill=n), color="gray75") + theme(line = element_blank(), rect = element_blank(), axis.text = element_blank(), axis.ticks.length = unit(0, "cm"), legend.justification=c(0, 0), legend.position = c(0, 0), panel.spacing = unit(0, "lines"), plot.margin = unit(c(0, 0, 0, 0), "lines"), complete = TRUE) + viridis::scale_fill_viridis("N")

Originally published at https://datascience.or.id

--

--