Menggambar Indonesia dengan R

Indonesia memiliki 16.771 pulau yang secara administratif dibagi menjadi 34 provinsi, 416 kabupaten/kota dan menjadi rumah bagi 270,2 juta jiwa. Saat bercerita berkenaan dengan wilayah di Indonesia, apa tah jumlah penduduk per kecamatan atau sebaran daerah tangkap ikan tongkol, kita sering terbantu dengan adanya gambar. Gambar menjadi elemen penting yang membantu audiens memahami pesan yang kita sampaikan. Sebab itu, mari menggambar Indonesia, untuk mempermudah kita mengerti soal Ia.

KODE LIMA DETIK

library(tidyverse)
library(raster)
library(sf)
require(maps)
require(viridis)
theme_set(
  theme_void()
)

peta_dunia <- map_data('world')
ggplot(peta_dunia, aes(x=long, y=lat, group=group)) +
  geom_polygon(fill='lightgray', colour='white')

peta_indonesia <- map_data('world', region = 'Indonesia')
ggplot(peta_indonesia, aes(x=long, y=lat, group=group)) +
  geom_polygon(fill='lightgray', colour='white')

ggplot(peta_dunia, aes(x=long, y=lat, group=group)) +
  geom_polygon(fill='lightgray', colour='white') +
  xlim(95, 141) + ylim(-11, 6)

indonesia1 <- getData('GADM', country='IDN', level=1)

ind1 <- readRDS('gadm36_IDN_1_sp.rds')

ind1A <- fortify(ind1)
warna <- rainbow(length(unique(ind1A$id)))
ggplot(peta_indonesia, aes(x=long, y=lat, group=group)) +
  geom_polygon(data=ind1A, aes(x=long, y=lat, group=group, fill=id), color='grey')

warna <- rainbow(34)

ind28 <- readRDS('IDN_adm1.rds')
ind28A <- fortify(ind28)
ind28@data$id <- rownames(ind28@data)
ind28B <- plyr::join(ind28A, ind28@data, by="id")
ggplot(peta_indonesia, aes(x=long, y=lat, group=group)) +
  geom_polygon(data=ind28B, aes(x=long, y=lat, group=group, fill=NAME_1), color='grey')

Latar Belakang

Kita suka bercerita soal diri sendiri. Jika diperluas, kita suka bercerita dan mendengarkan cerita mengenai komunitas kita, daerah tempat bermukim atau negara kita. Dalam pada itu gambar menjadi katalisator yang baik untuk meningkatkan efektivitas pesan yang ingin kita sampaikan dalam cerita.

Berpijak pada hal tersebut, kemampuan memvisualkan peta, yang diperkaya dengan data, menjadi mendesak untuk dimiliki. Kelebihan peta adalah sedari awal ia sudah menjawab pertanyaan “dimana“. Dimana saja sebaran petani mujair, dimana wilayah dengan kasus curanmor tertinggi, dimana Waldo, dimana saja wilayah yang tercakup program imunisasi dan dimana dimana lainnya.

Seperti yang sudah-sudah, R memiliki library yang memudahkan kita mencapai hal tersebut.


Teknologi Digunakan

tidyverse

Librarystandar” pada tulisan-tulisan di sini karena menawarkan banyak kemudahan saat melakukan oleh data. Penulis sendiri khawatir jangan-jangan dosis penggunaan tidyverse sudah melebihi batas.

maps

Salah satu library utama untuk menggambar peta. Bagi penggambar peta tipis-tipis seperti penulis, sulit untuk tidak menggunakan library ini karena mayoritas kebutuhan telah tercukupi dengan maps.

viridis

Viridis berguna untuk membuat macam-macam warna saat membuat visualisasi data. Selain cantik, library ini juga “ramah” bagi orang yang buta warna.

raster

Jika berurusan dengan peta pada saat tertentu kita akan harus berhadapan dengan raster data. Library raster membantu R mempermudah membaca, memanipulasi de el el raster data ini.

sf

Mirip seperti library raster, sf (Simple Features) memudahkan saat kita bergumul dengan data spasial. Library sf digunakan pada tulisan ini karena kita punya kebutuhan untuk membaca dan menggabungkan beberapa wilayah kabupaten/kota menjadi satu provinsi “baru”.


Negara

Kita mulai dari kode tersedikit, berisi hanya library (minimal) dan 1-2 perintah kepada R. Kode itu akan menggambar peta dunia, yang dipisahkan menjadi per negara.

Dunia

library(tidyverse)
require(maps)
require(viridis)
theme_set(
  theme_void()
)

Setelah me-load library, variabel pertama adalah peta_dunia yang berisi koordinat batas-batas antar negara. Fungsi map_data (yang ditampung oleh peta_dunia) adalah milik ggplot2 namun membutuhkan maps agar dapat bekerja.

peta_dunia <- map_data('world')

Berikutnya kita memerintahkan ggplot untuk menggambar peta dunia.

ggplot(peta_dunia, aes(x=long, y=lat, group=group)) +
  geom_polygon(fill='lightgray', colour='white')

Indonesia

Kita hanya akan bercerita perihal Indonesia. Di bawah ini kita akan membuat R menampilkan peta Indonesia. Sedikitnya ada dua jalan untuk sampai, pertama dengan menggunakan variabel yang berisi koordinat wilayah Indonesia. Cara kedua dengan tetap menggunakan peta dunia namun menampilkan hanya wilayah Indonesia.

Hanya Indonesia

Pendekatan pertama adalah membuat variabel, dalam contoh diberi nama peta_indonesia, berisi koordinat wilayah Indonesia.

peta_indonesia <- map_data('world', region = 'Indonesia')
ggplot(peta_indonesia, aes(x=long, y=lat, group=group)) +
  geom_polygon(fill='lightgray', colour='white')

Kalau penasaran dengan peta_indonesia kita dapat membuka dan akan mendapati 3.715 baris data berisi koordinat pulau-pulau yang akan membentuk gambar peta.

Dengan Tetangga

Sesuai pelajaran geografi di bangku sekolah, Indonesia terletak antara 6° LU – 11° LS dan 95° BT – 141° BT. Berbekal pengetahuan tersebut kita dapat “memotong” peta dunia menggunakan fungsi xlim dan ylim yang disediakan ggplot2.

ggplot(peta_dunia, aes(x=long, y=lat, group=group)) +
  geom_polygon(fill='lightgray', colour='white') +
  xlim(95, 141) + ylim(-11, 6)

Impak dari pendekatan ini, memotong tampilan peta dunia, adalah jiran kita akan ikut tampil. Malaysia, Singapura, Brunei, (sebagian) Filipina dan Timor Leste adalah negara selain Indonesia yang jua pegari di layar.

Menampilkan Indonesia baik secara soliter maupun tersabur dengan setangga adalah sesuai hajat masing-masing.


Provinsi

Karena sudah kadung hidup di era dimana wilayah geografis dipotong-potong secara administratif menjadi entitas bernama Provinsi, Kabupaten/Kota, Kecamatan/Distrik, Desa/Kelurahan dan Dukuh/Dusun kita pasti terdorong untuk mencari tahu bagaimana kondisi di tiap-tiap entitas tersebut.

Petani jagung di desa A musti terdorong untuk tahu berapa ton produksi pipilan kering desa sebelah. Kepala kantor pemerintahan di provinsi B bisa termotivasi untuk “belajar” pada provinsi C jika tahu mereka sukses mencapai jumlah komoditas yang lebih baik.

Sayangnya map_data hanya memuat titik-titik koordinat pulau-pulau dan batas-batas Indonesia sebagai negara. Kita butuh data lain yang memuat batas-batas wilayah administratif. Salah dua penyedia data yang populer adalah GADM dan geoBoundaries.

Mencari data wilayah administratif untuk R kita akan lebih banyak menemukan yang menggunakan GADM. Di bawah ini kita akan belajar menggunakan data tersebut untuk memisahkan antar provinsi.

Lagi-lagi ada dua cara untuk mendapatkan data dari GADM, yaitu langsung download pada kode dan menggunakan file yang sudah didownload sebelumnya.

Unduh Dulu

library(raster)
indonesia1 <- getData('GADM', country='IDN', level=1)

Library raster perlu dipanggil untuk menggunakan fungsi getData. Yang dapat diinstal terlebih dahulu jika belum ada.

Pada getData di atas variabel country diisi IDN yang merupakan singkatan dari Indonesia dan level diisi angka 1. Untuk data Indonesia, level 1 berarti provinsi, level 2 kabupaten/kota dan seterusnya sampai level 4.

Jika kode dijalankan maka getData akan mengunduh data, jika belum ada. Karena itu koneksi internet dibutuhkan jika menggunakan jalan ini. Pada saat tulisan ini dibuat, 3.6 adalah versi terbaru dari data GADM. Versi terakhir adalah yang secara default akan diunduh oleh getData.

Jika berhasil mengunduh, variabel indonesia1 akan berisi data seperti ini.

Luring

Proses pengunduhan data melalui fungsi getData selain membutuhkan koneksi internet, juga tidak selalu berhasil.

Sebagai alternatif kita dapat mengunduh data GADM sendiri melalui pranala ini, menyimpan pada folder tempat bekerja dan kemudian memanggilnya.

Yang perlu diunduh adalah file dengan nama sp, pada gambar di atas yang berada dalam kotak biru. Karena sedang perlu data batas wilayah provinsi maka level1 yang didownload.

Hasil unduhan akan bernama gadm36_IDN_1_sp.rds yang dapat langsung digunakan pada R menggunakan fungsi readRDS seperti contoh berikut. Tidak seperti fungsi getData yang merupakan bagian dari library raster, fungsi readRDS ada pada base package R sehingga tidak diperlukan library tambahan (yang diinstal maupun dipanggil).

ind1 <- readRDS('gadm36_IDN_1_sp.rds')

Kita akan mendapatkan data yang sama dengan variabel indonesia1 yang menggunakan fungsi getData.

Gambar 33 Provinsi

Data GADM bertipe Spatial Polygons DataFrame yang besar. Yang sayangnya hanya berjumlah 33, padahal jumlah provinsi di Indonesia, pada Juli 2021 adalah 34. Satu provinsi yang tidak ada pada data GADM versi 3.6 ini adalah Kalimantan Utara.

Pada bagian setelah ini kita akan memperbaiki atau mencari data lain yang berisi 34 provinsi. Untuk sekarang kita akan belajar bagaimana menggambar 33 provinsi tersebut.

Variabel ind1 atau indonesia1 terdiri dari 3 “bagian” yaitu data, polygons dan proj4string.

Untuk menggambar, sebenarnya hanya cukup koordinat yang ada pada Polygons.

Contohnya seperti di bawah ini.

ind1A <- fortify(ind1)
warna <- rainbow(length(unique(ind1A$id)))
ggplot(peta_indonesia, aes(x=long, y=lat, group=group)) +
  geom_polygon(data=ind1A, aes(x=long, y=lat, group=group, fill=id), color='grey')

Gambar di atas adalah hasilnya. Seperti terlihat tiap provinsi diberi warna berbeda. Pada pulau Kalimantan hanya terdapat 3 provinsi, Kalimantan Utara tidak ada.

Variabel ind1A dari data ind1 yang disederhanakan dengan fungsi fortify dari ggplot2 sehingga menjadi tujuh kolom data.

Variabel warna berisi 33 warna, sejumlah sama dengan provinsi pada data. Warna-warni ini yang akan digunakan pada masing-masing provinsi.

Sudah berhasil menggambar 33 provinsi adalah pencapaian tersendiri, namun ketiadaan nama provinsi dapat mengurangi nilai informasi yang ditampilkan. Untuk menambah kolom berisi nama provinsi kita dapat menggunakan kode seperti ini.

ind1@data$id <- rownames(ind1@data)
ind1B <- plyr::join(ind1A, ind1@data, by="id")
ggplot(peta_indonesia, aes(x=long, y=lat, group=group)) +
  geom_polygon(data=ind1B, aes(x=long, y=lat, group=group, fill=NAME_1), color='grey')

Pada baris pertama kita menambahkan kolom id pada data. Kolom ini kita perlukan sebagai primary key saat menggabungkan data dengan ind1A.

Variabel ind1B adalah ind1A yang telah dilengkapi dengan nama provinsi.

Data dan gambar telah dilengkapi nama provinsi, selamat.

Sekarang pe-ernya adalah menampilkan 34 provinsi alih-alih 33 provinsi.

34 Provinsi

Se-enggaknya ada dua metode yang dapat ditempuh untuk mendapatkan data (dan gambar) 34 provinsi di Indonesia, yaitu.

  • Menggunakan data GADM versi sebelumnya, yaitu versi 2.8
  • Memperbaiki data GADM versi 3.6 dengan menggabungkan sendiri kabupaten/kota di Kalimantan Utara.

GADM Versi 2.8

Penulis belum mendapat jawaban kenapa versi 2.8, dari segi jumlah provinsi di Indonesia, malah lebih kekiniyan ketimbang versi 3.6. Versi 2.8 untuk Indonesia dapat diunduh di sini. Pilih negara, kemudian pilih RDS level1 untuk provinsi.

Kita akan mendapat file bernama IDN_adm1.rds yang kita gunakan pada kode di bawah ini.

warna <- rainbow(34)

ind28 <- readRDS('IDN_adm1.rds')
ind28A <- fortify(ind28)
ind28@data$id <- rownames(ind28@data)
ind28B <- plyr::join(ind28A, ind28@data, by="id")
ggplot(peta_indonesia, aes(x=long, y=lat, group=group)) +
  geom_polygon(data=ind28B, aes(x=long, y=lat, group=group, fill=NAME_1), color='grey')

Lengkap 34 provinsi.

Gabung GADM Level 2 (Kabupaten)

Bagaimanapun menggunakan data terbaru adalah lebih utama. Karena itu kita perlu mencari jalan agar tetap dapat menggunakan data GADM versi 3.6 namun dengan jumlah provinsi yang sesuai dengan kondisi terkini (Juli 2021).

Kalimantan Utara (Kaltara) menjadi provinsi terpisah dari Kalimantan Timur (Kaltim) pada 16 Oktober 2012 berdasar UU 20/2012. Provinsi ke-34 ini terdiri dari 1 kota dan 4 kabupaten, yaitu:

  1. Kota Tarakan
  2. Kabupaten Bulungan
  3. Kabupaten Malinau
  4. Kabupaten Nunukan
  5. Kabupaten Tana Tidung

Berdasar informasi itu, kita akan memisahkan lima wilayah tersebut dari GADM 3.6 level 2 (kabupaten/kota) dari semula menjadi wilayah Kaltim, menjadi Kaltara.

Metode di bawah ini sangat terinspirasi dari sana.

Unduh GADM Level 2

Pertama kita perlu mendapatkan data GADM level 2 yang berisi kabupaten/kota di Indonesia. Hasil unduhan adalah file bernama gadm36_IDN_2_sp.rds.

Load Data

Untuk dapat memisahkan dan menggabungkan wilayah administratif dari data GADM kita memerlukan library sf yang dapat diinstal terlebih dahulu.

Pada kasus penulis, selain library sf perlu juga diinstal library Rcpp dan rgeos.

library(sf)

indonesia2 <- readRDS('gadm36_IDN_2_sp.rds') %>% 
  st_as_sf()

Jika kode di atas dieksekusi kita akan mendapatkan variabel indonesia2 yang berisi data seperti ini. Kita punya nama negara di kolom NAME_0, nama provinsi, jenis DATI II pada kolom TYPE_2, nama kabupaten/kota dan geometry. Geometry ini memuat batas-batas administratif kabupaten/kota.

Struktur data di bawah ini berbeda (terdapat kolom geometry) dari sebelumnya yang kita bahas karena digunakannya fungsi st_as_sf() dari library sf.

Sebagian dari sidang pembaca yang budiman mungkin akan mengernyit, berpikir keras kenapa ada 502 data kabupaten/kota alih-alih 514 (416 + 98) namun kita kesampingkan dulu ihwal itu.

Kaltara dan Kaltim

Pertama pastikan Kalimantan Utara belum ada pada data.

indonesia2 %>% filter(NAME_1 == 'Kalimantan Utara') %>% View()

Oke, tidak ada Provinsi Kaltara pada data. Sekarang pastikan 5 Kabupaten/Kota Kaltara ada di Kaltim.

kaltara <- c('Tarakan', 'Bulungan', 'Malinau', 'Nunukan', 'Tana Tidung')

indonesia2 %>% 
  filter(
    NAME_2 %in% kaltara
  ) %>% 
  View()

Lalu ganti NAME_1 (nama provinsi) untuk lima Kabupaten/Kota tersebut menjadi Kalimantan Utara

indonesia2_baru <- indonesia2 %>% 
  mutate(
    NAME_1 = case_when(
      NAME_1 == 'Kalimantan Timur' & NAME_2 %in% kaltara ~ 'Kalimantan Utara',
      TRUE ~ NAME_1
    )
  )
Kolom Nilai (untuk Kebaikan di Masa Depan)

Tambahkan satu kolom bernama nilai dengan angka 0 sebagai isian default. Kolom ini akan kita gunakan nantinya jika butuh menampilkan angka untuk masing-masing provinsi, misal produksi tembakau menurut provinsi.

indonesia2_baru$NILAI <- 0
Dati II jadi Dati I

Selanjutnya gabungkan kabupaten/kota menjadi provinsi.

idn2_semua <- indonesia2_baru %>% 
  group_by(NAME_1) %>% 
  summarise(nilai=sum(NILAI)) %>% 
  st_simplify(dTolerance = 1000)

Fungsi st_simplify (dari library sf) berguna untuk menyederhanakan garis peta sehingga tidak terlalu detail sehingga tidak memerlukan sumberdaya komputer yang lebih besar. Toh kebutuhan kita sejauh ini hanya untuk memvisualkan data untuk masing-masing provinsi.

Kolom nilai berisi angka 0 yang dapat kita ganti nantinya.

The Momen of truth

Akhirnya kita sampai di bagian ini, menggambar 34 provinsi menggunakan data GADM terbaru.

warna2 <- grDevices::colors()

ggplot() +
  geom_sf(data=idn2_semua, aes(fill=factor(NAME_1))) +
  theme_bw() +
  scale_fill_manual(values=warna2[361:394], name='NAME_1')

Fungsi grDevices::colors() akan membuatkan 657 nama warna yang akan dipilih 34 diantaranya untuk mewarnai masing-masing provinsi.

Simpan untuk Nanti

Kita dapat menyimpan variabel idn2_semua agar di masa depan tak perlu lagi mengulangi langkah-langkah menggabungkan kabupaten/kota di Kaltara, cukup memberi nilai pada masing-masing provinsi.

saveRDS(idn2_semua, file = 'provinsi34_gambar.rds')

Keuntungan dari metode tadi di atas adalah kita dapat “menambahkan sendiri” jika suatu wilayah administrasi berubah. Misal terdapat pemekaran provinsi, atau kabupaten baru. Selama kita punya data wilayah administratif pada level di bawahnya, kita dapat membuat sendiri batas-batas administratif wilayah baru tersebut.


Cover Image by Brett Zeck on Unsplash


Referensi


Berlangganan

Suka tulisan di sini, silahkan mengisi formulir di bawah ini untuk berlangganan agar kami dapat mengirim pemberitahuan tulisan baru.

2 Replies to “Menggambar Indonesia dengan R”

  1. Maaf ka Izin bertanya
    Mengapa saat menggambar 33 Provinsi
    Obejct ‘Peta_Indonesia’ not found?

    1. Hi, terimakasih telah membaca, mohon maaf atas lambatnya jawaban. Pada tulisan di atas digunakan variabel bernama peta_indonesia (semua huruf kecil) sementara pada pertanyaan digunakan Peta_Indonesia (huruf besar pada awal kata), apakah pada kode yang ditulis Hafsah menggunakan Peta_Indonesia atau peta_indonesia? Seperti yang kita ketahui bersama, bahasa R adalah case-sensitive sehingga pilihan penggunaan besar dan kecilnya huruf perlu menjadi perhatian karena ini_variabel, Ini_variabel, Ini_Variabel semuanya merujuk pada hal yang berbeda.

Leave a Reply

Your email address will not be published. Required fields are marked *