Visualisasi Peta Choropleth dengan Folium
Peta choropleth adalah jenis peta tematik yang menggunakan pola warna atau gradasi warna untuk menggambarkan variasi data di wilayah geografis yang berbeda. Pada peta choropleth, wilayah geografis seperti negara, provinsi, atau kota dibagi menjadi beberapa area atau poligon yang mewakili unit analisis.
Peta choropleth biasanya digunakan untuk menggambarkan data kuantitatif seperti populasi, pertumbuhan ekonomi, tingkat pengangguran, dan sebagainya. Setiap wilayah di peta diisi dengan warna atau gradasi warna yang mencerminkan nilai data yang sedang diamati.
Membuat peta choropleth pada python dapat dilakukan menggunakan pustaka folium
. Folium merupakan wrapper dari Leaflet
, pustaka JavaScript untuk pemetaan interaktif. Leaflet
menyediakan banyak fitur dan fungsionalitas untuk membuat peta yang interaktif dan responsif di berbagai platform.
Membuat Peta Choropleth dengan Folium
Pada tutorial ini, kita menggunakan data geoJSON dari github ans-4175/peta-indonesia-geojson
. File ini menyimpan informasi batas-batas provinsi di Indonesia (saat tulisan ini dibuat data geografis tersedia untuk 34 provinsi).
Untuk membuat peta, kita gunakan fungsi Map
. Terdapat beberapa parameter yang dapat diatur , diantaranya adalah location
dan zoom_start
. parameter location
berisi nilai latitude
dan longitude
yang menjadi titik pusat saat peta ditampilkan. Nilai yang kita gunakan pada contoh berikut menunjukkan lokasi pertengahan untuk Indonesia. Parameter lainnya, zoom_start
menunjukkan seberapa besar peta akan ditampilkan dibandingkan ukuran default.
Selanjutnya kita dapat menambahkan layer dasar pada peta menggunakan fungsi TileLayer
. Di sini kita mengunakan "cartodpositron"
. Nilai default dari TileLayer
pada peta adalah "OpenStreetView"
dimana peta akan menampilkan informasi sangat detail termasuk jaringan jalan. Adapun "cartodpositron"
akan membuat peta dasar dengan warna terang tanpa detail yang tidak kita perlukan sehingga cocok untuk visualisasi choropleth.
Selanjutnya, buat layer Choropleth
dengan menentukan parameter geo_data
yaitu prov_geojson
serta beberapa pengaturan tambahan lainnya.
Hasil kode berikut menampilkan peta wilayah Indonesia dengan batas-batas setiap provinsi.
Python
from folium import Map, TileLayer, Choropleth from folium.features import GeoJsonTooltip import requests # Mengunduh data GeoJSON yang berisi info batas provinsi url = "https://raw.githubusercontent.com/ans-4175/peta-indonesia-geojson/master/indonesia-prov.geojson" response = requests.get(url) prov_geojson = response.json() # Membuat objek peta Folium dan mengarahkan pada lokasi peta Indonesia map = Map(location=[-2.5489, 118.0149], zoom_start=5) # Menambahkan layer dasar peta TileLayer("cartodbpositron").add_to(map) # Menambahkan layer batas provinsi di Indonesia Choropleth( geo_data=prov_geojson, name="Provinsi", fill_opacity=0.8, fill_color="red", line_opacity=1, line_color="#2F2F2F", line_weight=0.5, ).add_to(map) # menyimpan peta dalam format HTML # map.save("map_1.html") # Menampilkan peta map
Output
Untuk melihat hasil dalam format HTML klik di sini
Memahami Objek GeoJSON
Sebelum lebih jauh melanjutkan pembuatan peta choropleth, kita akan melihat lebih dalam konten yang tersimpan pada objek prov_geojson
. Penting untuk memahaminya serta akan berkaitan dengan langkah selanjutnya yaitu menampilkan nilai PDB per provinsi.
JSON
Setiap objek geoJSON memiliki struktur yang mungkin saja agak berbeda-beda. Objek prov_geojson
yang kita gunakan tersusun bebarapa key dengan key utama yaitu features
. Key ini berisi nilai list
dengan 34 elemen. Contoh pada gambar di atas, elemen pertama dari features
, di dalamnya tersusun dari beberapa key lainnya lagi yaitu type
, geometry
, id
, dan properties
.
Key geometry
berisi informasi poligon/multipoligon dengan berbagai koordinat yang menunjukkan batas-batas provinsi tersebut dan menjadi dasar bagaimana layer choropleth dibentuk. Key properties
tersusun dari 4 key yaitu ID
, kode
, Propinsi
dan SUMBER
. Data geoJSON pada dasarnya tersusun dalam format dict
. Oleh karena itu, kita dapat mengakses nilai-nilai yang diperlukan menggunakan key.
Contohnya, untuk mendapatkan kode dan nama provinsi pada elemen pertama dari features
maka dapat dilakukan sebagai berikut:
Python
print(prov_geojson["features"][0]["properties"]["kode"]) # atau # print(prov_geojson.get("features")[0].get("properties").get("kode")) print(prov_geojson["features"][0]["properties"]["Propinsi"]) # atau # print(prov_geojson.get("features")[0].get("properties").get("Propinsi"))
Output
52 NUSATENGGARA BARAT
Karena nilai dari key features
berupa list
, maka kita dapat melakukan iterasi untuk melihat setiap elemennya dengan cara berikut:
Python
for prov in province_geojson["features"]: print(prov["properties"])
Output
{'ID': 2, 'kode': 52, 'Propinsi': 'NUSATENGGARA BARAT', 'SUMBER': 'Peta Dasar BAKOSURTANAL Skala 1 : 250.000'} {'ID': 3, 'kode': 75, 'Propinsi': 'GORONTALO', 'SUMBER': 'Peta Dasar BAKOSURTANAL Skala 1 : 250.000'} {'ID': 4, 'kode': 74, 'Propinsi': 'SULAWESI TENGGARA', 'SUMBER': 'Peta Dasar BAKOSURTANAL Skala 1 : 250.000'} ...
Informasi ini penting, karena mungkin kita perlu mengakses data-data ini, khususnya ketika menggabungkan dengan data-data lainnya dari luar geoJSON tersebut.
Menambahkan Data pada Peta
Tujuan pembuatan peta choropleth yaitu menunjukkan perbedaan nilai antara wilayah. Perbedaan ini divisualisasikan dengan perbedaan atau gradasi. Pada contoh berikut kita akan menampilkan data PDB menurut provinsi di Indonesia tahun 2020. Contoh data sudah disiapkan dalam format CSV : pdb_ind_2020.csv.
Python
import pandas as pd data_pdb = pd.read_csv("pdb_ind_2020.csv") data_pdb.head()
Output
Kode Provinsi PDB.2020.triliun 0 11 ACEH 166.37 1 12 SUMATERA UTARA 811.19 2 13 SUMATERA BARAT 241.89 3 14 RIAU 727.60 4 15 JAMBI 205.08
Data terdiri dari 3 kolom yaitu Kode
, Provinsi
dan PDB.2020.triliun
. Kolom Kode
pada data_pdb
berisi info yang sama dengan key kode
pada data prov_geojson
yaitu menggunakan aturan pengkodean dari BPS. Oleh karena itu kita dapat menghubungkan kedua data sehingga dapat menampilkan informasi nilai PDB untuk masing-masing provinsi yang bersesuaian.
Parameter tambahan yang kita atur yaitu data
, columns
dan key_on
. Parameter data
adalah objek data yang akan ditampilkan yaitu data_pdb
. Parameter columns
adalah kolom-kolom pada objek data_pdb
yang menjadi perhatian. Penghubung antara objek prov_geojson
dan data_pdb
ditentukan pada parameter key_on
. Dalam hal ini keduanya memiliki identitas yang sama yaitu Kode
pada data_pdb
dan feature.properties.kode
pada prov_geojson
.
Hal lainnya yang dapat disesuaikan adalah fill_color
. Terdapat banyak pallete built-in yang dapat digunakan seperti "Y1Gn"
, "YlOrBr"
, "YlOrRd"
, "OrRd"
, "RdPu"
, "PuRd"
, "Greens"
dan sebagainya. Jika belum sesuai dapat pula membuat palette kustom.
Python
# # Membuat objek peta Folium map = Map(location=[-2.5489, 118.0149], zoom_start=5) # Menambahkan layer dasar peta TileLayer("cartodbpositron").add_to(map) # Menambahkan layer batas provinsi di Indonesia choropleth = Choropleth( geo_data=prov_geojson, name="Produk Domestik Bruto", data=data_pdb, columns=["Kode", "PDB.2020.triliun"], key_on="feature.properties.kode", fill_color="YlGn", fill_opacity=0.8, line_opacity=1, line_weight=0.5, ).add_to(map) # menyimpan peta dalam format HTML # map.save("map_2.html") # Menampilkan peta interaktif map
Output
Untuk melihat dalam format HTML klik di sini
Menambah Informasi pada Tooltip
Peta choropleth sebelumnya dapat menampilkan perbedaan nilai PDB antar provinsi di Indonesia. Namun kita belum bisa melihat nilai PDB setiap provinsi. Kita dapat menambah informasi tersebut melalui tooltip. Tooltip merupakan tampilan yang tampil ketika kita menyorot area tertentu (popup) pada peta.
Kita akan menambahkan tooltip untuk menampilkan nama provinsi serta nilai PDB dari provinsi tersebut setiap kali menyorot area suatu provinsi. Penambahan tooltip ini dapat dilakukan melalui fungsi GeoJsonTooltip
. Fungsi GeoJsonTooltip
hanya mengakses kolom-kolom pada objek geoJSON saja yaitu prov_geojson
. Sementara itu, data PDB yang ingin ditampilkan berada pada objek data_pdb
dan tidak dikenali oleh fungsi ini. Untuk mengatasinya kita perlu menambahkan informasi nilai PDB ke dalam objek prov_geojson
.
Agar memperjelas langkah-langkah yang dilakukan, dapat kita buat dalam bentuk fungsi. Fungsi akan menerima argumen berupa kode provinsi, berdasarkan kode tersebut, dicari indeks kode yang sesuai pada data_pdb
. Setelah indeks di peroleh, ambil nilai kolom PDB.2020.triliun
dari data pada posisi indeks tersebut.
Selanjutnya lakukan iterasi pada data prov_geojson
. Pada setiap iterasi tambahkan informasi nilai pdb di dalam key pdb
. Nilai kita ambil menggunakan fungsi yang dibuat sebelumnya. Untuk lebih memperjelas tampilan, kita dapat memformat data atau memberi tambahan teks tertentu.
Setelah objek prov_geojson
memiliki informasi data pdb
, kita dapat membuat tooltip menggunakan fungsi . Pada fungsi GeoJsonTooltip
. Parameter fields
diisi dengan info apa saja yang akan dimunculkan pada tooltip. Kita juga dapat memberi nama alias untuk setiap info tersebut melalui parameter aliases
. Jika diperlukan kita dapat menambahkan styling menggunakan format CSS.
Python
import locale # Mengatur locale ke bahasa Indonesia (format angka) locale.setlocale(locale.LC_ALL, "id_ID.UTF-8") # Fungsi untuk mengambil nilai PDB menurut kode provinsi def pdb_by_kode(kode_prov) -> int: idx = data_pdb[data_pdb["Kode"] == kode_prov].first_valid_index() return data_pdb.loc[idx, "PDB.2020.triliun"] # menambahkan data pdb (yang sudah di format) # ke dalam objek geoJSON for prov in prov_geojson["features"]: prov_kode = prov["properties"]["kode"] formatted_text = "{:n}".format(pdb_by_kode(prov_kode)) prov["properties"]["pdb"] = f"Rp{formatted_text} Triliun" # Membuat objek peta Folium map = Map( location=[-2.5489, 118.0149], zoom_start=5, title="PDB Indonesia Tahun 2020" ) # Menambahkan layer dasar peta TileLayer("cartodbpositron").add_to(map) # Menambahkan layer batas provinsi di Indonesia choropleth = Choropleth( geo_data=prov_geojson, name="Produk Domestik Bruto", data=data_pdb, columns=["Kode", "PDB.2020.triliun"], key_on="feature.properties.kode", fill_color="PuRd", fill_opacity=0.8, line_opacity=1, line_weight=0.5, ).add_to(map) # Menambahkan Tooltip pada peta tooltip = GeoJsonTooltip( fields=["Propinsi", "pdb"], aliases=["Provinsi :", "PDB 2020 :"], style=( """background-color: #fdfdfd; color: #2f2f2f; font-family: arial; font-size: 12px; padding: 10px;""" ), ) choropleth.geojson.add_child(tooltip) # menyimpan peta dalam format HTML #map.save("map_3.html") # Menampilkan peta interaktif map
Output
Untuk melihat dalam format HTML klik di sini
Selamat mencoba!
Visualisasi Data