Beberapa waktu lalu ketika sedang mencari cara untuk membuat peta dengan R, Google menunjukkan satu package yang sangat menarik - leaflet. Package yang dikembangkan oleh RStudio ini merupakan interface untuk membuat peta dengan memanfaatkan Leaflet, salah satu JavaScript library untuk pemetaan yang sangat populer dan tentu saja open-source.
Berbeda dengan package lain (seperti RgoogleMaps, ggmap dan maps) yang menghasilkan peta statis, leaflet memudahkan kita untuk membuat peta interaktif yang lebih hidup hanya dengan beberapa baris kode R, tanpa perlu mempunyai pengetahuan tentang JavaScript. Tertarik untuk mencoba? Inilah hasil “eksperimen” pertama saya dengan R dan leaflet.
Persiapan
Sebenarnya dengan R saja cukup, namun saya merekomendasikan RStudio. Instal package leaflet dari CRAN:
install.packages("leaflet")
Atau dari GitHub, untuk versi development
devtools::install_github("rstudio/leaflet")
Lalu load ke dalam R session
library(leaflet)
Menandai suatu titik koordinat
OK! saatnya kita “bermain” dengan leaflet. Sebelum menggunakan data Twitter, mari kita mulai dengan menandai suatu titik koordinat pada peta dengan icon marker, misalnya untuk lokasi “Bundaran Hotel Indonesia” yang menurut Google Maps berada pada koordinat (-6.1949571, 106.8230631).
point <- "Bundaran Hotel Indonesia"
latitude <- -6.1949571
longitude <- 106.8230631
map <- leaflet() %>%
addTiles() %>%
addMarkers(lng=longitude, lat=latitude, popup=point)
map
Penjelasannya kurang lebih:
leaflet()
: menginisiasi leaflet workspace, seakan sebuah kanvas di mana peta akan digambar di atasnya.addTiles()
: menambahkan peta dasar base-map (secara default menggunakan OpenStreetMap).addMarkers()
: menandai titik koordinat (lng
untuk longitude danlat
untuk latitude) dengan icon marker. Opsipopup
berguna untuk nenampilkan teks jika icon di-klik.
Kode di atas menggunakan pipe operator (%>%
) dari package
magrittr, yang ekuivalen
dengan:
map <- leaflet()
map <- addTiles(map)
map <- addMarkers(map, lng=longitude, lat=latitude, popup=point)
map
Memetakan data Twitter
Kenapa data Twitter? Beberapa kali saya men-download data Twitter melalui search API baik menggunakan package twitteR maupun tools lain. Salah satu hal menarik mengenai tweet-tweet tersebut adalah adanya geo-coordinate, titik latitude dan longitute, yang menandai lokasi di mana mereka di-posting. Memang, informasi ini tidak tersedia untuk semua tweets, tapi cukup kaya untuk dieksplorasi seperti yang akan kita lakukan sekarang.
Dimulai dengan men-download tweets berdasarkan kata kunci tertentu menggunakan twitteR :
library(twitteR)
setup_twitter_oauth(consumer_key = "XXX",
consumer_secret = "XXX",
access_token = "XXX",
access_secret = "XXX")
tweetsList <- searchTwitteR("makan siang",
geocode = paste(latitude, longitude, "20km", sep = ","),
n = 1000)
Dengan fungsi di atas, kita berhasil mendapatkan 600-an tweets dengan kata kunci “makan siang” yang berada dalam radius 10km seputar Bundaran Hotel Indonesia, Jakarta.
Konversi tweetList
menjadi data frame:
tweets <- twListToDF(tweetsList)
Sebaiknya titik koordinat merupakan kolom numerik dan tidak ada data
yang latitude/longitude-nya kosong (NA
atau NULL
).
tweets$latitude <- as.numeric(tweets$latitude)
tweets$longitude <- as.numeric(tweets$longitude)
tweets <- tweets[!is.na(tweets$latitude) & !is.na(tweets$longitude),]
Sekarang kita siap untuk mapping titik-titik koordinat data Twitter tersebut dengan leaflet:
tweetsmap <- leaflet(data = tweets) %>%
addTiles() %>%
addMarkers(lng = ~longitude, lat = ~latitude, popup = ~screenName)
tweetsmap
(Hanya 100 twit pertama yg ditampilkan agar loading tidak terlalu lama)
Nice! Seluruh titik koordinat sudah kita tampilkan dalam peta hanya dengan empat baris kode R. Mudah, bukan?
Tentu saja kita bisa membuat tampilan peta tersebut menjadi lebih baik.
Misalnya, ada dua hal sederhana yang saya lakukan dalam “eksperimen”
ini. Pertama, menjadikan teks pada popup
sebagai link untuk
membuka tweets pada laman Twitter dengan cara mengubahnya menjadi konten
HTML dengan format:
"<a href="https://twitter.com/SCREENNAME/status/STATUSID" target="_blank">SCREENNAME</a>"
Berikut ini perintah untuk membuat konten HTML tersebut:
link2tweet <- paste("https://twitter.com",
tweets$screenName,
"status",
tweets$id,
sep = "/")
popupLink <- paste0("<a href=\"",
link2tweet,
"\" target=\"_blank\">",
tweets$screenName,
"</a>")
Kedua, membuat marker cluster sehingga titik-titik pada peta tidak
terlalu padat. Marker cluster mengelompokkan beberapa titik yang
berdekatan dalam cluster dan menampilkan kembali seluruh titik apabila
peta diperbesar (zoom-in). Untuk membuat marker cluster pada peta
baru kita buat tadi bisa dilakukan dengan terlebih dahulu menghapus
markers menggunakan fungsi clearMarkers()
, lalu buat kembali dengan
fungsi addMarkers()
yang ditambahkan dengan opsi
markerClusterOptions()
.
tweetsmap <- clearMarkers(tweetsmap) %>%
addMarkers(popup = popupLink, clusterOptions = markerClusterOptions())
tweetsmap
Note: Jika latitude dan longitude tidak dinyatakan secara
eksplisit, addMarker()
akan mencari kolom lat/latitude
dan
lon/lng/long/longitude
(case-sensitive) pada data-frame.
Ini adalah hasil akhir yang kita peroleh. Klik pada titik cluster untuk memperbesar peta!
Kurang canggih? Masih ada fitur-fitur leaflet yang lain untuk kita eksplorasi seperti mengganti map tiles, modifikasi markers dan pop ups, menambahkan polygons dan lines, dan banyak lagi.