Data berupa perubahan nilai dari waktu ke waktu (29 Januari - 1 Februari), tetapi disajikan dengan pie chart. Pie chart cocok untuk komposisi bagian terhadap keseluruhan (total 100%), sedangkan keempat nilai ini bukan bagian dari satu total (54%+57%+57%+60% tidak sama dengan 100%). Akibatnya, tren naik tidak terlihat dan pembaca bisa salah memahami data.
Diganti menjadi line chart dengan sumbu x berupa tanggal dan sumbu y berupa persentase keterisian. Label nilai ditampilkan di setiap titik sehingga tren dan nilai pasti terbaca sekaligus.
bor <- tibble(
tanggal = as.Date(c("2021-01-29", "2021-01-30", "2021-01-31", "2021-02-01")),
bor = c(54, 57, 57, 60)
)
ggplot(bor, aes(x = tanggal, y = bor)) +
geom_line(color = "#C0392B", linewidth = 1.3) +
geom_point(color = "#C0392B", size = 4) +
geom_text(aes(label = paste0(bor, "%")), vjust = -1.2,
fontface = "bold", size = 5) +
scale_x_date(breaks = bor$tanggal, date_labels = "%d %b") +
scale_y_continuous(limits = c(50, 65), labels = function(x) paste0(x, "%")) +
labs(title = "Tingkat Keterisian Tempat Tidur RS di DKI Jakarta",
subtitle = "29 Januari - 1 Februari",
x = "Tanggal", y = "Keterisian tempat tidur") +
theme_minimal(base_size = 14) +
theme(plot.title = element_text(face = "bold"))
Keterisian tempat tidur RS di DKI Jakarta meningkat dari 54% (29 Januari) menjadi 60% (1 Februari). Sempat diam di 57% pada 30-31 Januari, lalu naik lagi 3 poin persentase pada 1 Februari. Tren ini menunjukkan pasien rumah sakit yang terus bertambah.
Warna antar irisan mirip, sehingga irisan sulit dibedakan. Legenda yang terpisah juga memaksa pembaca bolak-balik mencocokkan warna dan keterangan.
Warna diganti dengan palet yang lebih kontras, irisan diberi garis pemisah putih, urutan irisan dari terbesar ke terkecil, dan label langsung (nama + persen) ditempatkan di samping irisan sehingga legenda tidak diperlukan.
pay <- tibble(
metode = c("M-Banking", "COD", "Lainnya", "Paylater/Cicilan"),
persen = c(64, 20, 14, 2)
) %>%
mutate(metode = fct_inorder(metode)) %>%
arrange(desc(metode)) %>% # urutan sesuai tumpukan ggplot
mutate(ypos = cumsum(persen) - persen / 2,
label = paste0(metode, "\n", persen, "%"))
warna <- c("M-Banking" = "#0072B2", "COD" = "#E69F00",
"Lainnya" = "#009E73", "Paylater/Cicilan" = "#D55E00")
ggplot(pay, aes(x = 1, y = persen, fill = metode)) +
geom_col(width = 1, color = "white", linewidth = 1.2) +
geom_text(aes(x = 1.75, y = ypos, label = label, color = metode),
fontface = "bold", size = 4.5, lineheight = 0.9) +
coord_polar(theta = "y", start = 0) +
scale_x_continuous(limits = c(0.5, 2.1)) +
scale_fill_manual(values = warna) +
scale_color_manual(values = warna) +
labs(title = "Metode Pembayaran yang Digunakan") +
theme_void(base_size = 14) +
theme(legend.position = "none",
plot.title = element_text(face = "bold", hjust = 0.5))
M-Banking adalah metode pembayaran yang paling dominan (64%), diikuti COD (20%). Kategori Lainnya sebesar 14%, sedangkan Paylater/Cicilan paling jarang digunakan (2%). Sekitar dua pertiga transaksi sudah dilakukan melalui layanan perbankan digital.
Batang disusun mengikuti urutan alfabet/geografis, sehingga sulit melihat provinsi mana yang tertinggi dan terendah serta membandingkan peringkatnya.
Batang diurutkan dari nilai terbesar ke terkecil. Ditambahkan label nilai di ujung batang, dan tiga provinsi tertinggi diberi warna lebih gelap sebagai penekanan.
prov <- tribble(
~provinsi, ~nilai,
"Aceh", 11.7, "Sumatera Utara", 14.2, "Sumatera Barat", 17.0, "Riau", 14.5,
"Jambi", 12.2, "Sumatera Selatan", 11.1, "Bengkulu", 14.8, "Lampung", 10.0,
"Kep. Bangka Belitung", 12.0, "Kep. Riau", 20.8, "DKI Jakarta", 23.5,
"Jawa Barat", 14.5, "Jawa Tengah", 13.2, "DI Yogyakarta", 23.4,
"Jawa Timur", 14.2, "Banten", 15.3, "Bali", 18.6,
"Nusa Tenggara Barat", 12.1, "Nusa Tenggara Timur", 11.4,
"Kalimantan Barat", 10.5, "Kalimantan Tengah", 13.6,
"Kalimantan Selatan", 17.4, "Kalimantan Timur", 19.5,
"Kalimantan Utara", 18.1, "Sulawesi Utara", 14.3, "Sulawesi Tengah", 13.6,
"Sulawesi Selatan", 15.4, "Sulawesi Tenggara", 15.8, "Gorontalo", 16.5,
"Sulawesi Barat", 12.3, "Maluku", 13.8, "Maluku Utara", 11.3,
"Papua Barat", 14.1, "Papua", 8.3
) %>%
mutate(top3 = rank(-nilai, ties.method = "first") <= 3)
ggplot(prov, aes(x = nilai, y = fct_reorder(provinsi, nilai), fill = top3)) +
geom_col(width = 0.75) +
geom_text(aes(label = number(nilai, accuracy = 0.1, decimal.mark = ",")),
hjust = -0.2, size = 3.3) +
scale_fill_manual(values = c("TRUE" = "#08519C", "FALSE" = "#6BAED6"),
guide = "none") +
scale_x_continuous(expand = expansion(mult = c(0, 0.1))) +
labs(title = "Nilai Indikator menurut Provinsi (Terurut dari Terbesar)",
subtitle = "Tiga provinsi tertinggi diberi warna lebih gelap",
x = "Nilai indikator", y = NULL) +
theme_minimal(base_size = 12) +
theme(panel.grid.major.y = element_blank(),
plot.title = element_text(face = "bold"))
DKI Jakarta (23,5) dan DI Yogyakarta (23,4) memiliki nilai tertinggi, disusul Kep. Riau (20,8). Papua memiliki nilai terendah (8,3), diikuti Lampung (10,0). Nilai di sebagian besar provinsi berkisar 11-16, sehingga tampak kesenjangan antara beberapa provinsi teratas dan mayoritas provinsi lainnya.
Garis rata-rata bergerak 3 hari berwarna abu-abu pudar sehingga hampir tidak terlihat di antara batang abu-abu dan garis rata-rata 7 hari. Pembaca sulit membedakan kedua garis tersebut.
Batang dibuat abu-abu terang sebagai latar, garis rata-rata 3 hari oranye terang, dan garis rata-rata 7 hari biru tua sehingga keduanya kontras satu sama lain dan terhadap batang. Legenda ditempatkan di atas grafik.
library(tidyverse)
library(scales)
set.seed(123)
tgl <- seq(as.Date("2020-01-22"), as.Date("2020-08-30"), by = "day")
anchor_d <- as.Date(c("2020-01-22","2020-02-14","2020-03-01","2020-03-10","2020-03-18",
"2020-03-26","2020-04-03","2020-04-11","2020-04-27","2020-05-05",
"2020-05-13","2020-05-29","2020-06-14","2020-06-22","2020-07-08",
"2020-07-24","2020-08-09","2020-08-25","2020-08-30"))
anchor_v <- c(0, 5000, 5000, 10000, 35000, 60000, 75000, 80000, 80000, 90000,
85000, 120000, 140000, 160000, 200000, 260000, 270000, 255000, 255000)
n <- length(tgl)
dasar <- approx(as.numeric(anchor_d), anchor_v, xout = as.numeric(tgl))$y
faktor <- 1 + 0.08 * sin(2 * pi * (1:n) / 7) + rnorm(n, 0, 0.05)
kasus <- pmax(round(dasar * faktor), 0)
# rata-rata bergerak (tanpa stats::filter)
roll_mean <- function(x, k) {
sapply(seq_along(x), function(i) if (i < k) NA_real_ else mean(x[(i - k + 1):i]))
}
covid <- data.frame(
tanggal = tgl,
kasus = kasus,
ma3 = roll_mean(kasus, 3),
ma7 = roll_mean(kasus, 7)
)
garis <- rbind(
data.frame(tanggal = covid$tanggal, nilai = covid$ma3, seri = "MA 3 hari"),
data.frame(tanggal = covid$tanggal, nilai = covid$ma7, seri = "MA 7 hari")
)
garis <- garis[!is.na(garis$nilai), ]
p <- ggplot(covid, aes(x = tanggal)) +
geom_col(aes(y = kasus, fill = "Kasus harian"),
width = 0.8) +
geom_line(data = garis, aes(y = nilai, color = seri), linewidth = 1.1) +
scale_fill_manual(values = c("Kasus harian" = "grey75"), name = NULL) +
scale_color_manual(values = c("MA 3 hari" = "#FF5A00", "MA 7 hari" = "#0B3C8C"),
name = NULL) +
scale_x_date(date_breaks = "1 month", date_labels = "%b") +
scale_y_continuous(labels = label_number(scale = 1/1000, suffix = "k"),
expand = expansion(mult = c(0, 0.05))) +
labs(title = "Kasus Baru COVID-19 Harian (Dunia)",
subtitle = "Batang: kasus harian | Garis: rata-rata bergerak 3 dan 7 hari",
x = NULL, y = "Kasus per hari") +
theme_minimal(base_size = 13) +
theme(legend.position = "top", plot.title = element_text(face = "bold"))
print(p)
Kasus harian dunia tumbuh lambat hingga awal Maret, kemudian meningkat tajam dan mencapai sekitar 80 ribu per hari pada April. Kasus naik lagi sejak akhir Mei dan mencapai puncak sekitar 260-290 ribu per hari pada akhir Juli hingga Agustus, lalu cenderung mendatar. Garis MA 3 hari lebih responsif terhadap fluktuasi harian, sedangkan MA 7 hari lebih halus.
Pada treemap, perbandingan nilai dilakukan melalui luas persegi panjang yang besarnya berbeda-beda. Mata kurang akurat membandingkan luas hanya secara visual, sehingga negara dengan nilai mirip (misalnya Singapura, India, Malaysia) sulit ditentukan mana yang lebih besar. Negara kecil juga menjadi label yang tidak terbaca.
Diganti dengan dua bar chart: (a) total ekspor per benua beserta persentasenya, dan (b) 15 negara tujuan terbesar yang diurutkan dan diwarnai berdasarkan benua. Perbandingan dilakukan melalui panjang batang pada sumbu yang sama, sehingga lebih akurat, dan angka ditampilkan langsung.
ekspor <- tribble(
~negara, ~benua, ~nilai, # US$ miliar (perkiraan)
"Tiongkok", "Asia", 25.9,
"Jepang", "Asia", 14.3,
"Singapura", "Asia", 9.7,
"India", "Asia", 8.3,
"Malaysia", "Asia", 7.5,
"Korea Selatan", "Asia", 6.4,
"Thailand", "Asia", 4.9,
"Filipina", "Asia", 4.4,
"Vietnam", "Asia", 4.0,
"Hong Kong", "Asia", 3.2,
"Pakistan", "Asia", 2.6,
"Bangladesh", "Asia", 2.2,
"Arab Saudi", "Asia", 1.8,
"Uni Emirat Arab", "Asia", 1.6,
"Myanmar", "Asia", 0.9,
"Asia lainnya", "Asia", 4.5,
"Amerika Serikat", "Amerika Utara", 17.7,
"Meksiko", "Amerika Utara", 1.2,
"Kanada", "Amerika Utara", 1.1,
"Belanda", "Eropa", 3.0,
"Jerman", "Eropa", 2.1,
"Italia", "Eropa", 2.0,
"Spanyol", "Eropa", 1.9,
"Inggris", "Eropa", 1.7,
"Belgia", "Eropa", 1.3,
"Turki", "Eropa", 1.1,
"Prancis", "Eropa", 1.0,
"Rusia", "Eropa", 0.9,
"Polandia", "Eropa", 0.9,
"Eropa lainnya", "Eropa", 2.5,
"Mesir", "Afrika", 1.5,
"Afrika Selatan", "Afrika", 0.9,
"Nigeria", "Afrika", 0.5,
"Afrika lainnya", "Afrika", 1.5,
"Australia", "Oseania", 2.6,
"Selandia Baru", "Oseania", 0.7,
"Brasil", "Amerika Selatan", 1.3,
"Peru", "Amerika Selatan", 0.4,
"Kolombia", "Amerika Selatan", 0.3
)
warna_benua <- c("Asia" = "#D55E00", "Amerika Utara" = "#CC79A7", "Eropa" = "#0072B2",
"Afrika" = "#009E73", "Oseania" = "#E69F00", "Amerika Selatan" = "#56B4E9")
(a) Total ekspor per benua
benua <- ekspor %>%
group_by(benua) %>%
summarise(total = sum(nilai), .groups = "drop") %>%
mutate(persen = total / sum(total))
ggplot(benua, aes(x = total, y = fct_reorder(benua, total), fill = benua)) +
geom_col(width = 0.7) +
geom_text(aes(label = paste0(number(total, accuracy = 0.1, decimal.mark = ","),
" (", percent(persen, accuracy = 0.1, decimal.mark = ","), ")")),
hjust = -0.1, size = 4) +
scale_fill_manual(values = warna_benua, guide = "none") +
scale_x_continuous(expand = expansion(mult = c(0, 0.25))) +
labs(title = "Ekspor Indonesia 2019 menurut Benua Tujuan",
x = "Nilai ekspor (US$ miliar)", y = NULL) +
theme_minimal(base_size = 13) +
theme(panel.grid.major.y = element_blank(), plot.title = element_text(face = "bold"))
(b) 15 negara tujuan ekspor terbesar
top15 <- ekspor %>%
filter(!str_detect(negara, "lainnya")) %>%
slice_max(nilai, n = 15)
ggplot(top15, aes(x = nilai, y = fct_reorder(negara, nilai), fill = benua)) +
geom_col(width = 0.75) +
geom_text(aes(label = number(nilai, accuracy = 0.1, decimal.mark = ",")),
hjust = -0.2, size = 3.8) +
scale_fill_manual(values = warna_benua, name = "Benua") +
scale_x_continuous(expand = expansion(mult = c(0, 0.1))) +
labs(title = "15 Negara Tujuan Ekspor Terbesar Indonesia, 2019",
x = "Nilai ekspor (US$ miliar, perkiraan)", y = NULL) +
theme_minimal(base_size = 13) +
theme(panel.grid.major.y = element_blank(), plot.title = element_text(face = "bold"),
legend.position = "bottom")
Asia merupakan tujuan ekspor terbesar Indonesia (lebih dari separuh total), diikuti Amerika Utara dan Eropa. Pada tingkat negara, Tiongkok adalah tujuan utama, disusul Amerika Serikat dan Jepang. Urutan negara berikutnya (Singapura, India, Malaysia, Korea Selatan) kini dapat dibandingkan dengan jelas.
Scatterplot pada gambar 1 dan 2 (gambar atas) menampilkan semua mobil dengan satu warna, sehingga jenis bahan bakar tidak dapat dibedakan. Padahal jenis bahan bakar kemungkinan memengaruhi jarak tempuh per liter.
Scatterplot yang diwarnai berdasarkan jenis bahan bakar (gambar bawah) tidak memiliki garis tren, sehingga pola hubungan antara berat kendaraan dan efisiensi BBM hanya bisa ditebak dari sebaran titik. Titik yang besar dan saling menumpuk (overplotting) juga membuat pola sulit dibaca.
Warna titik dibedakan menurut jenis bahan bakar (diesel dan gas) agar perbedaan kedua kelompok langsung terlihat.
Ditambahkan garis tren LOESS berwarna oranye. Garis ini merangkum pola hubungan secara keseluruhan dan mampu menangkap kelengkungan hubungan yang tidak bisa ditunjukkan garis lurus.
Garis tren sengaja dibuat satu garis untuk seluruh data, dengan warna oranye yang kontras terhadap titik merah muda dan toska, sehingga tidak tertukar dengan kategori bahan bakar.
Transparansi titik (alpha) dipertahankan agar titik yang menumpuk tetap terlihat, dan label sumbu diberi satuan (kg dan km) agar mudah dipahami.
library(ggplot2)
set.seed(123)
# ---------- Data tiruan ----------
n_gas <- 185
n_diesel <- 20
# Berat bersih kendaraan (kg)
berat_gas <- c(rnorm(150, mean = 2400, sd = 400),
runif(35, min = 2800, max = 4060))
berat_gas <- pmin(pmax(berat_gas, 1490), 4060)
berat_diesel <- runif(n_diesel, min = 2000, max = 3800)
# Jarak tempuh per liter BBM (km/L): makin berat, makin boros
jarak_gas <- 22.5 * (berat_gas / 1500)^(-1) * rnorm(n_gas, 1, 0.08)
jarak_diesel <- 22.5 * (berat_diesel / 1500)^(-1) * 1.2 * rnorm(n_diesel, 1, 0.07)
mobil <- data.frame(
berat_kg = c(berat_gas, berat_diesel),
jarak_km_per_l = c(jarak_gas, jarak_diesel),
fuel.type = rep(c("gas", "diesel"), times = c(n_gas, n_diesel))
)
# ---------- Visualisasi ----------
ggplot(mobil, aes(x = berat_kg, y = jarak_km_per_l)) +
geom_point(aes(color = fuel.type), size = 6, alpha = 0.5) +
geom_smooth(method = "loess", se = FALSE,
color = "#FF7F50", linewidth = 1.5) +
labs(x = "berat bersih kendaraan (kg)",
y = "jarak tempuh per liter BBM (km)") +
theme_light(base_size = 13)
Hubungan negatif: semakin berat kendaraan, semakin kecil jarak tempuh per liter BBM. Mobil dengan berat sekitar 1.500 kg menempuh sekitar 22 km/L, sedangkan mobil di atas 4.000 kg hanya sekitar 7-8 km/L.
Penurunan tidak linear: garis tren turun paling tajam pada rentang 1.500-2.500 kg, lalu melandai setelah sekitar 3.000 kg. Artinya, penambahan berat pada mobil ringan berdampak lebih besar terhadap konsumsi BBM dibanding pada mobil yang sudah berat.
Perbedaan jenis bahan bakar: mobil diesel (merah muda) umumnya berada di atas kelompok mobil gas (toska) pada berat yang sama, yang berarti jarak tempuhnya per liter lebih jauh. Mobil gas jauh lebih banyak jumlahnya dan terkonsentrasi pada berat 1.800-3.200 kg.
Gambar 1 dan 2 (sebelah kiri) dan gambar 3 (kanan atas) terlalu kasar, sedangkan gambar 5 (kanan bawah) terlalu halus sehingga ada puncak yang hilang. Gambar 4 (Kanan tengah) menjadi yang paling pas, namun garis hitam polos terkesan kurang menarik dan tidak membedakan area data dari latar grafik.
Ditambahkan warna di bawah garis (area chart) dengan warna hijau toska transparan, sehingga bentuk gelombang kasus dan besarnya lebih menonjol.
Puncak diberi penanda dan label (titik merah, nilai, dan tanggal), sehingga informasi utama langsung terbaca tanpa menebak dari sumbu.
library(ggplot2)
set.seed(2021)
# ---------- Data tiruan (rata-rata 7 hari kasus baru harian) ----------
tanggal <- seq(as.Date("2020-05-01"), as.Date("2021-03-31"), by = "day")
jangkar_tgl <- as.Date(c("2020-05-01", "2020-06-15", "2020-07-01", "2020-07-15",
"2020-08-01", "2020-08-20", "2020-09-05", "2020-09-15",
"2020-09-25", "2020-10-10", "2020-10-20", "2020-11-05",
"2020-11-12", "2020-11-25", "2020-12-10", "2020-12-25",
"2021-01-05", "2021-01-15", "2021-01-25", "2021-02-03",
"2021-02-10", "2021-02-15", "2021-02-18", "2021-02-22",
"2021-03-01", "2021-03-08", "2021-03-20", "2021-03-31"))
jangkar_val <- c(120, 100, 130, 190,
300, 480, 650, 1000,
1130, 1180, 1100, 780,
800, 1100, 1250, 1200,
1500, 1900, 2500, 3050,
3100, 3380, 3000, 2500,
1750, 1550, 1400, 1320)
dasar <- approx(as.numeric(jangkar_tgl), jangkar_val,
xout = as.numeric(tanggal))$y
# Tambahkan fluktuasi harian, lalu haluskan dengan rata-rata bergerak 7 hari
harian <- dasar * (1 + rnorm(length(dasar), 0, 0.10))
roll_mean <- function(x, k) {
sapply(seq_along(x), function(i) mean(x[max(1, i - k + 1):i]))
}
kasus <- data.frame(
tanggal = tanggal,
kasus = roll_mean(harian, 7)
)
# Titik puncak
puncak <- kasus[which.max(kasus$kasus), ]
# ---------- Visualisasi ----------
p <- ggplot(kasus, aes(x = tanggal, y = kasus)) +
geom_area(fill = "#69B3A2", alpha = 0.35) +
geom_line(color = "#1F5F4F", linewidth = 0.6) +
geom_point(data = puncak, color = "#C0392B", size = 3) +
geom_text(data = puncak,
aes(label = paste0("Puncak: ", format(round(kasus), big.mark = "."), " kasus\n",
format(tanggal, "%d %b %Y"))),
hjust = 1.1, vjust = 0.5, size = 3.6, color = "#C0392B") +
scale_x_date(date_breaks = "3 months", date_labels = "%b %Y") +
scale_y_continuous(labels = function(x) format(x, big.mark = "."),
expand = expansion(mult = c(0, 0.08))) +
labs(x = "tanggal", y = "banyaknya kasus baru harian") +
theme_light(base_size = 13)
print(p)
Gelombang pertama (Mei-Oktober 2020): kasus naik perlahan dari sekitar 100 per hari menjadi sekitar 1.150 pada Oktober 2020 dengan kenaikan paling cepat terjadi sejak Agustus.
Penurunan sementara: pada Oktober-November 2020 kasus turun ke sekitar 780 per hari, tetapi penurunan ini tidak berlangsung lama.
Gelombang kedua (Desember 2020-Februari 2021): kasus naik tajam dan mencapai puncak sekitar 3.380 per hari pada pertengahan Februari 2021. Puncak ini hampir tiga kali lipat gelombang pertama. Di sekitar puncak terlihat fluktuasi kecil naik-turun sebelum akhirnya turun.
Penurunan setelah puncak: kasus turun cepat hingga sekitar 1.300 per hari pada akhir Maret 2021.
Network graph hanya menunjukan arah perdagangannya saja tanpa menampilkan nilai perdagangan yang dilakukan.
Node (bentuk bulat) dibuat dengan ukuran beragam berdasarkan nilai perdagangan yang dialkukan pada setiap negara.
# install.packages(c("igraph", "ggraph", "ggplot2")) # jalankan sekali jika belum terpasang
library(igraph)
library(ggraph)
library(ggplot2)
set.seed(42)
# ---------- Data edge (arah perdagangan) ----------
edges <- data.frame(
from = c("Thailand", "Indonesia", "Malaysia", "Singapore", "Indonesia",
"Indonesia", "Philippines", "Thailand", "Singapore", "Thailand",
"Malaysia", "Singapore", "Malaysia", "Thailand", "Malaysia",
"Thailand", "Singapore", "Vietnam"),
to = c("Indonesia", "Philippines", "Indonesia", "Indonesia", "Malaysia",
"Singapore", "Singapore", "Singapore", "Thailand", "Malaysia",
"Singapore", "Malaysia", "Thailand", "Cambodia", "Vietnam",
"Vietnam", "Vietnam", "Singapore")
)
edges$nilai <- round(runif(nrow(edges), 1, 10), 1) # nilai perdagangan (tiruan)
edges$jenis <- ifelse(edges$from == "Indonesia" | edges$to == "Indonesia",
"Terkait Indonesia", "Antar negara lain")
# ---------- Data node (negara) ----------
nodes <- data.frame(
name = c("Indonesia", "Philippines", "Singapore", "Thailand",
"Malaysia", "Cambodia", "Vietnam"),
x = c(4.5, 6.1, 4.5, 2.7, 6.4, 0.9, 4.5),
y = c(-0.5, -0.4, -1.9, -2.5, -2.5, -2.5, -2.8),
grup = c("Indonesia", "ASEAN aktif", "ASEAN aktif", "ASEAN aktif",
"ASEAN aktif", "Kurang aktif", "Kurang aktif")
)
# Total perdagangan tiap negara = jumlah nilai arus keluar + arus masuk
nodes$total <- sapply(nodes$name, function(n) {
sum(edges$nilai[edges$from == n | edges$to == n])
})
# ---------- Membuat graf ----------
g <- graph_from_data_frame(edges, vertices = nodes, directed = TRUE)
# ---------- Visualisasi ----------
p <- ggraph(g, layout = "manual", x = nodes$x, y = nodes$y) +
geom_edge_arc(aes(edge_colour = jenis, edge_width = nilai),
strength = 0.25,
arrow = arrow(length = unit(3.5, "mm"), type = "closed"),
start_cap = circle(11, "mm"),
end_cap = circle(11, "mm")) +
geom_node_point(aes(color = grup, size = total), alpha = 0.95) +
geom_node_text(aes(label = name), vjust = 4.2, size = 3.5, color = "grey30") +
scale_size_continuous(range = c(8, 28), name = "Total perdagangan") +
scale_color_manual(values = c("Indonesia" = "#FF7F00",
"ASEAN aktif" = "#0087AD",
"Kurang aktif" = "#BDBDBD"),
name = "Negara",
guide = guide_legend(override.aes = list(size = 6))) +
scale_edge_colour_manual(values = c("Terkait Indonesia" = "#C8294B",
"Antar negara lain" = "#2A9AC4"),
name = "Arus perdagangan") +
scale_edge_width(range = c(0.4, 1.6), guide = "none") +
coord_cartesian(clip = "off") +
labs(title = "Visualisasi Perdagangan antar Negara ASEAN",
subtitle = "Ukuran lingkaran menunjukkan total nilai perdagangan negara") +
theme_void(base_size = 13) +
theme(plot.title = element_text(face = "bold", hjust = 0.5),
plot.subtitle = element_text(hjust = 0.5, color = "grey40"),
legend.position = "bottom",
plot.margin = margin(15, 25, 15, 25))
print(p)
Indonesia aktif mealkukan perdagangan ke negara Thailand, Malaysia, Singapura dan Filipina. Sedangkan negara seperti Vietnam dan Komboja tidak secara langsung terlibat perdagangan dengan Indonesia. Negara dengan total perdagangan terbesar antar negara ASEAN adalah Singapura, sedangkan total perdagangan terkecil adalah Kamboja.