Membuat Diagram Lebih Hidup dengan Animasi

Bagaimana menganimasikan diagram statistik? Artikel ini mendemonstrasikan bagaimana menggunakan paket {gganimate} untuk membuat animasi dalam penyajian data yang efisien dan menarik.

tutorial
visualisasi data
Pengarang
Afiliasi
Terbit

August 7, 2024

Dimodifikasi

August 13, 2024

Kata kunci

animasi, Gapminder, gganimate, harapan hidup, produk domestik bruto, PDB

Umumnya, diagram itu untuk menyampaikan pesan. Akibatnya, pembuatan diagram perlu disesuaikan dengan pesan yang perlu disampaikan. Nah, berdasarkan hal ini, mari kita tinjau kembali sebuah diagram pada pos sebelumnya. Gambar 1 menyajikan diagram yang dimaksud.

Gambar 1: Hubungan antara PDB per kapita dan angka harapan hidup setiap negara pada tahun 2007

Gambar 1 sudah baik dalam menunjukkan seperti apa relasi antara PDB per kapita dan angka harapan hidup setiap negara pada tahun 2007. Akan tetapi, bagaimana jika kita ingin menunjukkan relasi tersebut pada tahun-tahun lainnya?

Mungkin kita langsung berpikir untuk memvisualisasikan relasi tersebut untuk setiap tahunnya. Dengan demikian, penyajian datanya seperti yang ditunjukkan pada Gambar 2.

Gambar 2: Relasi antara PDB per kapita dan angka harapan hidup setiap negara mulai tahun 1952 sampai 2007

Gambar 2 tersebut tampak sudah sesuai dengan pesan yang ingin kita sampaikan. Akan tetapi, gambar tersebut kurang efisien karena terlalu banyak memuat informasi. Apakah ada metode yang lebih efisien?

Penggunaan animasi adalah salah satu solusinya. Pembuatan animasi tersebut dapat dilakukan di R dengan menggunakan paket {gganimate}. Tak perlu berlama-lama, mari kita panggil paket tersebut bersamaan dengan paket {tidyverse}. Paket {tidyverse} tersebut berguna untuk mengimpor, mengolah, dan memvisualisasikan data. Sebagai tambahan, sebaiknya dalam R kita juga sudah terinstal paket {gifski}. Paket ini digunakan untuk merender animasi kita nanti menjadi fail gif.

library(tidyverse)
library(gganimate)

Mengkreasi Animasi

Kita impor dan olah data Gapminder seperti pada pos sebelumnya. Baris kode yang digunakan adalah sebagai berikut.

# Impor data `gapminder`
load(url("https://github.com/jennybc/gapminder/raw/main/data/gapminder.rdata"))

# Menerjemahkan nama benua
terjemahan_benua <- c(
  "Asia" = "Asia",
  "Europe" = "Eropa",
  "Africa" = "Afrika",
  "Americas" = "Amerika",
  "Oceania" = "Oseania"
)
gapminder <- gapminder |> 
  mutate(
    continent = recode(continent, !!!terjemahan_benua)
  )

head(gapminder)
# A tibble: 6 × 6
  country     continent  year lifeExp      pop gdpPercap
  <fct>       <fct>     <int>   <dbl>    <int>     <dbl>
1 Afghanistan Asia       1952    28.8  8425333      779.
2 Afghanistan Asia       1957    30.3  9240934      821.
3 Afghanistan Asia       1962    32.0 10267083      853.
4 Afghanistan Asia       1967    34.0 11537966      836.
5 Afghanistan Asia       1972    36.1 13079460      740.
6 Afghanistan Asia       1977    38.4 14880372      786.

Data gapminder sudah siap. Sekarang waktunya untuk membuat animasi. Berikut ini adalah baris kodenya.

anim <- gapminder |> 
  ggplot(
    aes(x = gdpPercap, y = lifeExp)
  ) + 
  geom_point(
    aes(color = continent, size = pop),
    alpha = .6
  ) + 
  scale_size(
    range = c(1, 20),
    guide = "none"
  ) + 
  scale_color_viridis_d(name = "Benua") + 
  theme_minimal() + 
  theme(
    legend.position = "bottom",
    plot.title = element_text(face = "bold")
  ) + 
  # Penggunaan {gganimate} mulai dari sini
  labs(
    title = "Tahun: {frame_time}",
    x = "PDB per kapita",
    y = "Angka harapan hidup"
  ) + 
  transition_time(year) + 
  ease_aes("linear")

anim
Gambar 3: Relasi antara PDB per kapita dan angka harapan hidup setiap tahunnya, disajikan dengan animasi

Dari baris kode di atas, kita menggunakan dua fungsi dari {gganimate}. Kedua fungsi tersebut adalah transition_time() dan ease_aes(). Fungsi transition_time() berfungsi untuk membagi data kita berdasarkan kolom/variabel waktu tertentu. Karena data gapminder memiliki variabel waktu year, kita masukkan variabel ini ke dalam fungsi tersebut.

Fungsi transition_time() menghasilkan variabel frame_time. Variabel ini kita masukkan ke dalam judul diagram agar judul tersebut berubah-ubah di sepanjang animasinya, perhatikan bagian kiri atas Gambar 3. Penulisan variabel ini ke dalam judul perlu kita masukkan ke dalam kurung kurawal { } agar terbaca sebagai variabel.

Fungsi ease_aes() mengatur bagaimana perubahan variabel year. Pilihan dalam fungsi ini antara lain quadratic, cubic, dan quartic. Bawaannya, argumen awal fungsi ini adalah linear.

Menyimpan Animasi

Setelah animasi sudah jadi, saatnya kita simpan animasi tersebut. Sebelum kita menyimpannya, kita perlu merender animasi tersebut. Kita dapat merendernya dengan menggunakan animate() dan mengisikan argumen renderer = gifski_renderer() apabila ingin merendernya menjadi fail gif. Untuk menyimpan hasil animasinya, kita menggunakan fungsi anim_save().

# Merender animasi
animate(
  plot = anim,
  renderer = gifski_renderer()
)

# Menyimpan animasi
anim_save(
  file = "anim_pdb_harapan_hidup.gif"
)

Ketika menggunakan fungsi animate() dalam merender animasi, kita dapat mengatur beberapa argumen. Misalnya, nframes, fps, dan duration. Untuk lebih jelasnya, silakan kunjungi laman referensinya.

Catatan Akhir

Kita telah dapat menyajikan data yang kompleks secara sederhana dengan animasi. Dalam R, kita dapat menggunakan paket {gganimate}. Dengan paket tersebut, kita dapat membuat objek animasi. Hal ini telah didemonstrasikan pada Bagian 1. Selanjutnya, kita dapat merender objek animasi tersebut dan menyimpannya ke dalam sebuah fail. Hal ini telah dipaparkan pada Bagian 2.

Animasi tetap memiliki kekurangan. Kita hanya bisa melihat animasi tersebut, tanpa melakukan interaksi. Apakah kita dapat membuat diagram yang tak hanya efisien, tetapi juga interaktif? Iya, kita dapat membuat diagram yang interaktif dengan R. Untuk mengetahui caranya, silakan pantau pos selanjutnya.

Penggunaan Kembali