Eksplorasi, perbandingan, dan evaluasi penyajian informasi berbasis data
Disusun oleh: Ika Lailia Nur Rohmatun Nazila (M0501251020)
Visualisasi data merupakan salah satu cara untuk menyampaikan informasi kuantitatif dalam bentuk grafis sehingga pola, kecenderungan, dan perbedaan antarvariabel dapat dipahami dengan lebih mudah. Penyajian data yang tepat tidak hanya memperhatikan tampilan visual, tetapi juga mempertimbangkan tujuan analisis, karakteristik data, ketepatan skala, pemilihan jenis grafik, serta kejelasan informasi yang disampaikan.
Visualisasi yang kurang tepat dapat menyebabkan informasi sulit dibaca atau bahkan menimbulkan interpretasi yang keliru. Oleh karena itu, evaluasi visualisasi data diperlukan untuk menilai apakah suatu grafik telah menyampaikan informasi secara efektif. Perbaikan dapat dilakukan melalui pemilihan jenis grafik yang sesuai, penataan elemen visual, pemberian label, penggunaan warna yang konsisten, serta penambahan fitur interaktif apabila diperlukan.
Laporan ini bertujuan untuk:
Mengevaluasi penyajian visualisasi data berdasarkan kejelasan informasi dan kemudahan interpretasi.
Membandingkan visualisasi awal dengan visualisasi alternatif yang lebih sesuai dengan karakteristik data.
Menjelaskan alasan pemilihan jenis grafik berdasarkan tujuan analisis.
Menyajikan visualisasi interaktif yang memungkinkan pembaca mengeksplorasi nilai data secara langsung.
Merumuskan rekomendasi untuk meningkatkan kualitas penyajian informasi berbasis data.
Catatan: Angka pada contoh berikut perlu dicocokkan kembali dengan sumber data asli
Bagian ini menyajikan contoh data tingkat keterisian tempat tidur rumah sakit pada empat tanggal pengamatan.
data_hospital <- data.frame(
tanggal = factor(
c("29 Jan", "30 Jan", "31 Jan", "1 Feb"),
levels = c("29 Jan", "30 Jan", "31 Jan", "1 Feb")
),
keterisian = c(54, 57, 57, 60)
)
htmltools::browsable(
htmltools::div(
class = "stat-grid",
htmltools::div(
class = "stat-card",
htmltools::div(class = "stat-label", "Jumlah Pengamatan"),
htmltools::div(class = "stat-value", nrow(data_hospital))
),
htmltools::div(
class = "stat-card",
htmltools::div(class = "stat-label", "Nilai Minimum"),
htmltools::div(class = "stat-value", min(data_hospital$keterisian))
),
htmltools::div(
class = "stat-card",
htmltools::div(class = "stat-label", "Nilai Maksimum"),
htmltools::div(class = "stat-value", max(data_hospital$keterisian))
)
)
)
if (file.exists("gambar/slide6.png")) {
knitr::include_graphics("gambar/slide6.png")
} else {
cat("Gambar asli belum ditemukan. Simpan sebagai gambar/slide6.png.")
}
Gambar 1. Visualisasi awal tingkat keterisian tempat tidur rumah sakit.
p_hospital <- ggplot(
data_hospital,
aes(
x = tanggal,
y = keterisian,
group = 1,
text = paste0(
"Tanggal: ", tanggal,
"<br>Keterisian: ", keterisian
)
)
) +
geom_line(color = "#8064c8", linewidth = 1.3) +
geom_point(color = "#d995b1", size = 4) +
geom_text(
aes(label = keterisian),
vjust = -1.1,
color = "#55427c",
size = 4
) +
scale_y_continuous(
limits = c(0, 70),
breaks = seq(0, 70, 10),
expand = expansion(mult = c(0, 0.05))
) +
labs(
title = "Tingkat Keterisian Tempat Tidur Rumah Sakit",
subtitle = "Perubahan nilai selama periode pengamatan",
x = "Tanggal Pengamatan",
y = "Nilai Keterisian"
) +
theme_minimal(base_size = 12) +
theme(
plot.title = element_text(
face = "bold", color = "#55427c", size = 16
),
plot.subtitle = element_text(color = "#847a98"),
axis.title = element_text(color = "#65528c"),
panel.grid.minor = element_blank(),
panel.grid.major = element_line(color = "#eee7fa")
)
ggplotly(p_hospital, tooltip = "text") %>%
layout(
paper_bgcolor = "rgba(255,255,255,0)",
plot_bgcolor = "rgba(255,255,255,0)",
margin = list(t = 80, b = 60)
)
Gambar 1. Grafik garis interaktif. Arahkan kursor ke titik untuk melihat nilai.
Visualisasi tingkat keterisian tempat tidur rumah sakit perlu disajikan dengan memperhatikan urutan waktu dan kejelasan nilai pada setiap pengamatan. Pembaca perlu dapat mengidentifikasi perubahan nilai dari satu tanggal ke tanggal berikutnya tanpa kesulitan memperkirakan posisi data pada grafik. Oleh karena itu, visualisasi diperbaiki agar pola perubahan lebih mudah dikenali dan informasi numerik dapat dibaca dengan lebih jelas.
Visualisasi diperbaiki menggunakan grafik garis (line chart) dengan titik penanda pada setiap tanggal pengamatan. Garis digunakan untuk menunjukkan perubahan nilai dari waktu ke waktu, sedangkan titik penanda memperjelas lokasi setiap pengamatan. Label angka ditambahkan di dekat titik agar nilai dapat diketahui secara langsung. Selain itu, penggunaan warna yang konsisten, judul yang informatif, serta label sumbu membantu meningkatkan keterbacaan grafik. Fitur interaktif juga ditambahkan sehingga pembaca dapat melihat tanggal dan nilai melalui kursor.
Berdasarkan data contoh, nilai keterisian tercatat sebesar 54 pada 29 Januari, 57 pada 30 Januari, 57 pada 31 Januari, dan 60 pada 1 Februari. Data menunjukkan peningkatan sebesar 6 satuan dari pengamatan pertama hingga pengamatan terakhir. Kenaikan terjadi pada awal periode dan akhir periode, sedangkan nilai tidak berubah antara 30 dan 31 Januari. Grafik garis memperlihatkan pola perubahan tersebut secara berurutan sehingga pembaca dapat mengidentifikasi kecenderungan peningkatan selama periode pengamatan.
Evaluasi visualisasi: Grafik garis menekankan perubahan dari waktu ke waktu. Sumbu vertikal perlu dipilih secara hati-hati agar perubahan tidak terkesan lebih besar atau lebih kecil daripada kondisi sebenarnya.
Bagian ini menyajikan visualisasi sistem pembayaran. Perbaikan difokuskan pada peningkatan kontras warna agar setiap kategori lebih mudah dibedakan, tanpa mengubah bentuk grafik maupun informasi yang disajikan.
library(ggplot2)
library(plotly)
data_bayar <- data.frame(
kategori = c(
"COD",
"M-Banking",
"Lainnya",
"Paylater/cicilan"
),
persentase = c(64, 20, 14, 2)
)
Gambar 2. Visualisasi awal sistem pembayaran.
Gambar 2. Visualisasi perbaikan sistem pembayaran dengan warna yang lebih kontras.
Visualisasi awal sistem pembayaran perlu diperbaiki karena penggunaan warna yang kurang kontras dapat menyulitkan pembaca dalam membedakan kategori, terutama pada kategori dengan proporsi yang relatif kecil. Selain itu, penyajian persentase secara langsung pada diagram dapat membantu pembaca memahami perbandingan antarkategori dengan lebih cepat.
Perbaikan dilakukan dengan menggunakan kombinasi warna yang lebih kontras untuk membedakan setiap kategori sistem pembayaran. Label persentase ditampilkan langsung pada diagram lingkaran agar informasi kuantitatif dapat dibaca tanpa harus memperkirakan ukuran irisan. Posisi legenda tetap diletakkan di bagian bawah grafik, sedangkan bentuk diagram lingkaran dipertahankan agar karakteristik visualisasi asli tetap terjaga.
Diagram lingkaran menunjukkan distribusi empat kategori sistem pembayaran, yaitu COD, M-Banking, Lainnya, dan Paylater/cicilan. Berdasarkan persentase yang digunakan, COD merupakan kategori dengan proporsi terbesar, yaitu 64%, diikuti M-Banking sebesar 20% dan Lainnya sebesar 14%. Sementara itu, Paylater/cicilan memiliki proporsi terkecil, yaitu 2%. Dengan demikian, COD menjadi metode pembayaran yang paling dominan dalam data yang divisualisasikan.
Bagian ini membandingkan persentase penggunaan komputer pada 34 provinsi di Indonesia berdasarkan data dengan sumber BPS untuk situasi tahun 2019. Grafik batang horizontal digunakan agar nama provinsi mudah dibaca dan perbedaan nilai antarprovinsi dapat dibandingkan dengan jelas.
library(ggplot2)
library(dplyr)
library(forcats)
library(scales)
library(plotly)
data_computer <- data.frame(
provinsi = c(
"Aceh", "Sumatera Utara", "Sumatera Barat", "Riau",
"Jambi", "Sumatera Selatan", "Bengkulu", "Lampung",
"Kep. Bangka Belitung", "Kep. Riau", "DKI Jakarta",
"Jawa Barat", "Jawa Tengah", "DI Yogyakarta",
"Jawa Timur", "Banten", "Bali", "Nusa Tenggara Barat",
"Nusa Tenggara Timur", "Kalimantan Barat",
"Kalimantan Tengah", "Kalimantan Selatan",
"Kalimantan Timur", "Kalimantan Utara", "Sulawesi Utara",
"Sulawesi Tengah", "Sulawesi Selatan", "Sulawesi Tenggara",
"Gorontalo", "Sulawesi Barat", "Maluku", "Maluku Utara",
"Papua Barat", "Papua"
),
persentase = c(
11.64, 14.17, 17.00, 14.50,
12.20, 11.10, 14.89, 9.94,
12.01, 20.72, 23.51,
14.52, 13.17, 23.35,
14.22, 15.27, 18.62, 12.03,
11.39, 10.45,
13.58, 17.35,
19.42, 18.02, 14.27,
13.61, 15.41, 15.80,
16.46, 12.30, 13.78, 11.26,
14.04, 8.20
)
)
stopifnot(nrow(data_computer) == 34)
# Mengurutkan nilai agar provinsi dengan nilai tertinggi
# muncul di bagian atas grafik
data_computer <- data_computer %>%
mutate(
kategori = case_when(
provinsi == "DKI Jakarta" ~ "Tertinggi",
provinsi == "Papua" ~ "Terendah",
TRUE ~ "Provinsi lainnya"
),
provinsi = fct_reorder(provinsi, persentase)
)
# Ringkasan statistik
jumlah_provinsi <- nrow(data_computer)
nilai_terendah <- min(data_computer$persentase)
nilai_tertinggi <- max(data_computer$persentase)
selisih <- nilai_tertinggi - nilai_terendah
if (file.exists("gambar/slide8.png")) {
knitr::include_graphics("gambar/slide8.png")
} else {
cat("Gambar asli belum ditemukan. Simpan gambar slide PPT sebagai gambar/slide8.png.")
}
Gambar 3. Visualisasi awal persentase masyarakat yang menggunakan komputer di berbagai provinsi
p_computer <- ggplot(
data_computer,
aes(
x = persentase,
y = provinsi,
fill = kategori,
text = paste0(
"Provinsi: ", provinsi,
"<br>Persentase: ",
formatC(persentase, format = "f", digits = 2),
"%"
)
)
) +
geom_col(width = 0.72) +
geom_text(
aes(
label = paste0(
formatC(persentase, format = "f", digits = 2), "%"
)
),
hjust = -0.12,
color = "#243247",
size = 3
) +
scale_fill_manual(
values = c(
"Tertinggi" = "#D97736",
"Terendah" = "#9B4D96",
"Provinsi lainnya" = "#8B9DC3"
),
breaks = c("Tertinggi", "Terendah", "Provinsi lainnya")
) +
scale_x_continuous(
limits = c(0, 27),
breaks = seq(0, 25, 5),
labels = label_number(suffix = "%"),
expand = expansion(mult = c(0, 0))
) +
labs(
title = "Persentase Penggunaan Komputer",
subtitle = "Perbandingan 34 provinsi di Indonesia, situasi tahun 2019",
x = "Persentase (%)",
y = NULL,
fill = NULL,
caption = "Sumber: BPS, bps.go.id, situasi tahun 2019 (sesuai PPT)."
) +
theme_minimal(base_size = 11) +
theme(
plot.title = element_text(
face = "bold", color = "#55427c", size = 15
),
plot.subtitle = element_text(color = "#756A8D"),
axis.text.y = element_text(color = "#243247", size = 9),
axis.title.x = element_text(color = "#65528c"),
panel.grid.major.y = element_blank(),
panel.grid.minor = element_blank(),
panel.grid.major.x = element_line(color = "#eee7fa"),
legend.position = "top",
plot.caption = element_text(size = 9, hjust = 0)
)
ggplotly(p_computer, tooltip = "text") %>%
layout(
paper_bgcolor = "rgba(255,255,255,0)",
plot_bgcolor = "rgba(255,255,255,0)",
margin = list(l = 155, t = 85, r = 55, b = 65)
)
Gambar 3. Grafik persentase masyarakat yang menggunakan komputer di berbagai provinsi
Persentase penggunaan komputer ditampilkan untuk 34 provinsi di Indonesia. Banyaknya kategori pada grafik batang vertikal dapat menyebabkan nama provinsi sulit dibaca dan menyulitkan pembaca membandingkan nilai antarprovinsi. Selain itu, apabila batang belum diurutkan berdasarkan nilai persentase, pembaca memerlukan waktu lebih lama untuk mengenali provinsi dengan persentase tertinggi dan terendah. Oleh karena itu, visualisasi perlu diperbaiki agar informasi lebih mudah dibaca, perbandingan antarprovinsi lebih jelas, serta nilai ekstrem dapat dikenali dengan cepat.
Perbaikan dilakukan dengan mengubah penyajian menjadi diagram batang horizontal yang mencakup seluruh 34 provinsi. Batang diurutkan berdasarkan persentase, dari nilai terendah hingga tertinggi pada sumbu vertikal sehingga provinsi dengan nilai tertinggi berada di bagian atas grafik.Sumbu horizontal dimulai dari nol untuk menjaga ketepatan perbandingan panjang batang. Label persentase ditambahkan pada ujung setiap batang agar pembaca dapat mengetahui nilai tanpa memperkirakan posisi batang terhadap sumbu. Warna berbeda digunakan untuk menyoroti DKI Jakarta sebagai provinsi dengan persentase tertinggi dan Papua sebagai provinsi dengan persentase terendah. Provinsi lainnya menggunakan warna yang seragam agar penekanan visual tetap terarah.
Berdasarkan data, DKI Jakarta memiliki persentase penggunaan komputer tertinggi, yaitu 23,51%, diikuti DI Yogyakarta sebesar 23,35% dan Kepulauan Riau sebesar 20,72%. Sementara itu, Papua memiliki persentase terendah, yaitu 8,20%. Selisih antara nilai tertinggi dan terendah mencapai 15,31 poin persentase. Grafik batang horizontal memudahkan pembaca membandingkan nilai antarprovinsi karena nama provinsi ditampilkan secara vertikal dan batang diurutkan berdasarkan persentase. Label angka pada ujung batang membantu pembaca mengetahui nilai secara langsung. Penggunaan warna berbeda untuk DKI Jakarta dan Papua juga menegaskan provinsi dengan nilai tertinggi dan terendah tanpa menghilangkan informasi dari provinsi lainnya.
Evaluasi visualisasi: Perbaikan dilakukan dengan menampilkan seluruh 34 provinsi, mengurutkan batang berdasarkan nilai, mencantumkan label persentase, dan menggunakan sumbu yang dimulai dari nol. Warna sorotan membantu pembaca mengenali nilai ekstrem, sedangkan grafik interaktif menyediakan informasi tambahan ketika kursor diarahkan ke batang.
Visualisasi ini menunjukkan jumlah kasus baru harian (Daily New Cases) beserta rata-rata bergerak tiga hari (3-day moving average) dan tujuh hari (7-day moving average). Grafik digunakan untuk memperlihatkan fluktuasi data harian dan pola tren yang lebih halus. Perbaikan difokuskan pada pembedaan warna dan jenis garis, dengan tetap mempertahankan judul, keterangan, dan pola tanggal seperti pada visualisasi PPT.
library(ggplot2)
library(dplyr)
library(scales)
library(plotly)
set.seed(123)
# Rentang tanggal sesuai grafik PPT
tanggal <- seq(
from = as.Date("2026-01-22"),
to = as.Date("2026-08-31"),
by = "day"
)
n <- length(tanggal)
hari <- seq_len(n)
# Membentuk tren yang meningkat secara bertahap
signal <- 280000 / (1 + exp(-(hari - n * 0.48) / (n * 0.10)))
# Menambahkan fluktuasi data harian
noise <- rnorm(n, mean = 0, sd = 18000)
daily_cases <- pmax(0, round(signal + noise))
# Menghitung moving average
ma_3day <- as.numeric(
stats::filter(daily_cases, rep(1 / 3, 3), sides = 1)
)
ma_7day <- as.numeric(
stats::filter(daily_cases, rep(1 / 7, 7), sides = 1)
)
# Membentuk data frame
data_noise <- data.frame(
tanggal = tanggal,
daily_cases = daily_cases,
ma_3day = ma_3day,
ma_7day = ma_7day
)
# Nama bulan dalam bahasa Inggris agar sesuai dengan PPT
label_tanggal <- function(x) {
format(x, "%b %d")
}
# Tanggal pada sumbu X setiap 8 hari
tanggal_breaks <- seq(
from = as.Date("2026-01-22"),
to = as.Date("2026-08-31"),
by = "8 days"
)
p_noise <- ggplot(data_noise, aes(x = tanggal)) +
# Daily Cases: batang abu-abu muda
geom_col(
aes(y = daily_cases, fill = "Daily Cases"),
width = 0.8,
alpha = 0.95
) +
# 3-day moving average: garis oranye putus-putus
geom_line(
aes(
y = ma_3day,
color = "3-day moving average",
linetype = "3-day moving average"
),
linewidth = 0.9,
na.rm = TRUE
) +
# 7-day moving average: garis biru utuh
geom_line(
aes(
y = ma_7day,
color = "7-day moving average",
linetype = "7-day moving average"
),
linewidth = 1.2,
na.rm = TRUE
) +
# Warna batang
scale_fill_manual(
name = NULL,
values = c(
"Daily Cases" = "#D0D0D0"
),
breaks = "Daily Cases"
) +
# Warna garis
scale_color_manual(
name = NULL,
values = c(
"3-day moving average" = "#E69F00",
"7-day moving average" = "#28A6C7"
),
breaks = c(
"3-day moving average",
"7-day moving average"
)
) +
# Jenis garis
scale_linetype_manual(
name = NULL,
values = c(
"3-day moving average" = "dashed",
"7-day moving average" = "solid"
),
breaks = c(
"3-day moving average",
"7-day moving average"
)
) +
# Sumbu X
scale_x_date(
breaks = tanggal_breaks,
labels = label_tanggal,
limits = c(
as.Date("2026-01-22"),
as.Date("2026-08-31")
),
expand = expansion(mult = c(0.005, 0.005))
) +
# Sumbu Y: skala tetap sampai 400k
scale_y_continuous(
breaks = seq(0, 400000, by = 100000),
labels = c("0", "100k", "200k", "300k", "400k"),
limits = c(0, 400000),
expand = expansion(mult = c(0, 0))
) +
# Judul dan keterangan mengikuti PPT
labs(
title = "Daily New Cases",
subtitle = "Cases per Day\nData as of 0:00 GMT+0",
x = NULL,
y = "Novel Coronavirus Daily Cases",
caption = "Source: Worldometer - www.worldometers.info"
) +
# Menggabungkan legenda batang dan garis
guides(
fill = guide_legend(
order = 1,
override.aes = list(alpha = 1)
),
color = guide_legend(
order = 2,
override.aes = list(
linetype = c("dashed", "solid"),
linewidth = c(0.9, 1.2)
)
),
linetype = "none"
) +
# Tema visualisasi
theme_minimal(base_size = 11) +
theme(
plot.title = element_text(
face = "plain",
size = 20,
hjust = 0.5,
color = "#222222"
),
plot.subtitle = element_text(
size = 12,
hjust = 0.5,
lineheight = 1.2,
color = "#555555"
),
axis.title.y = element_text(
size = 11,
color = "#333333"
),
axis.text.x = element_text(
angle = 45,
hjust = 1,
size = 8,
color = "#666666"
),
axis.text.y = element_text(
color = "#666666"
),
panel.grid.major.x = element_blank(),
panel.grid.minor = element_blank(),
panel.grid.major.y = element_line(
color = "#E5E5E5",
linewidth = 0.5
),
legend.position = "bottom",
legend.box = "horizontal",
legend.direction = "horizontal",
legend.text = element_text(
size = 10,
face = "bold"
),
plot.caption = element_text(
size = 9,
hjust = 1,
color = "#777777"
),
plot.margin = margin(10, 15, 15, 15)
)
# Grafik interaktif dengan area lebar
fig <- ggplotly(
p_noise,
tooltip = c("x", "y", "colour", "fill"),
width = NULL,
height = 750
) %>%
layout(
# Memastikan judul dan keterangan tampil
title = list(
text = paste0(
"<b>Daily New Cases</b>",
"<br><sup>Cases per Day</sup>",
"<br><sup>Data as of 0:00 GMT+0</sup>"
),
x = 0.5,
xanchor = "center",
y = 0.98,
yanchor = "top",
font = list(size = 20)
),
# Skala sumbu Y
yaxis = list(
title = "Novel Coronavirus Daily Cases",
range = c(0, 400000),
tickmode = "array",
tickvals = seq(0, 400000, by = 100000),
ticktext = c("0", "100k", "200k", "300k", "400k"),
fixedrange = TRUE
),
# Legenda horizontal di bawah grafik
legend = list(
orientation = "h",
x = 0.5,
xanchor = "center",
y = -0.25,
yanchor = "top",
font = list(size = 10)
),
# Ruang untuk judul dan legenda
margin = list(
t = 130,
b = 120,
l = 90,
r = 30
),
autosize = TRUE
) %>%
config(
responsive = TRUE,
displayModeBar = FALSE
)
fig
Pada grafik asli, Daily Cases dan 3-day moving average menggunakan warna yang mirip. Ketika garis rata-rata bergerak berada di antara atau bertumpuk dengan batang data harian, keduanya sulit dibedakan. Akibatnya, pembaca dapat mengalami kesulitan dalam mengidentifikasi fluktuasi harian dan tren jangka pendek.
Berdasarkan garis 7-day moving average, tren kasus baru harian menunjukkan eksalasi pertumbuhan yang konsisten dari bulan Maret hingga puncak pertama di akhir Juli. Kasus mulai bergerak naik pada pertengahan Maret, mengalami fase melandai singkat di kisaran 80.000–100.000 kasus pada April–Mei, lalu melonjak tajam hingga menyentuh puncaknya di kisaran 250.000–280.000 kasus harian pada periode akhir Juli hingga Agustus. Kehadiran garis moving average membuktikan bahwa meskipun terjadi penurunan drastis pada hari-hari tertentu akibat penundaan laporan (noise), laju penularan sebenarnya sedang berada dalam fase dataran tinggi (plateau) yang stagnan di tingkat yang sangat rawan selama bulan Agustus.
Evaluasi visualisasi
Visualisasi perbaikan mempertahankan tiga komponen utama, judul, keterangan, dan pola tanggal seperti pada PPT. Perbedaan warna antara batang abu-abu, garis oranye putus-putus, dan garis biru utuh meningkatkan keterbacaan serta mengurangi kemungkinan elemen grafik tertukar. Skala sumbu Y hingga 400k dan legenda di bawah grafik membantu pembaca memahami grafik secara lebih terstruktur.
Visualisasi ini menunjukkan ekspor kopi Indonesia pada tahun 2018 ke sepuluh negara tujuan utama. Grafik digunakan untuk memperlihatkan perbandingan ekspor antarnegera. Perbaikan difokuskan pada keterbacaan nama negara, pengurutan nilai, kejelasan label, serta penggunaan warna yang konsisten agar perbandingan lebih mudah dipahami.
library(ggplot2)
library(dplyr)
library(scales)
library(plotly)
library(forcats)
library(knitr)
# Data contoh
# Ganti volume dengan angka resmi dari slide 18
data_kopi <- data.frame(
negara = c(
"Amerika Serikat",
"Malaysia",
"Jepang",
"Italia",
"India",
"Jerman",
"Maroko",
"Georgia",
"Singapura",
"Inggris"
),
volume = c(
55, 38, 30, 28, 26,
15, 12, 11, 8, 8
)
)
# Mengurutkan negara berdasarkan volume ekspor
data_kopi <- data_kopi %>%
mutate(
negara = fct_reorder(negara, volume)
)
# Menampilkan data
knitr::kable(
data_kopi %>%
mutate(negara = as.character(negara)),
col.names = c("Negara Tujuan", "Volume Ekspor (ton)"),
caption = "Data ekspor kopi Indonesia tahun 2018"
)
| Negara Tujuan | Volume Ekspor (ton) |
|---|---|
| Amerika Serikat | 55 |
| Malaysia | 38 |
| Jepang | 30 |
| Italia | 28 |
| India | 26 |
| Jerman | 15 |
| Maroko | 12 |
| Georgia | 11 |
| Singapura | 8 |
| Inggris | 8 |
Gambar berikut menampilkan grafik asli pada PPT sebagai acuan evaluasi.
p_kopi <- ggplot(
data_kopi,
aes(
x = volume,
y = negara,
text = paste0(
"Negara: ", negara,
"<br>Volume ekspor: ",
scales::label_number(
big.mark = ".",
decimal.mark = ","
)(volume)
)
)
) +
geom_col(
aes(fill = "Volume ekspor"),
width = 0.7
) +
geom_text(
aes(
label = scales::label_number(
big.mark = ".",
decimal.mark = ","
)(volume)
),
hjust = -0.15,
size = 3.5,
color = "#333333"
) +
scale_fill_manual(
name = NULL,
values = c("Volume ekspor" = "#287D8E")
) +
scale_x_continuous(
labels = scales::label_number(
big.mark = ".",
decimal.mark = ","
),
limits = c(0, max(data_kopi$volume) * 1.2),
expand = expansion(mult = c(0, 0))
) +
labs(
title = "Ekspor Kopi Indonesia Tahun 2018",
subtitle = "Sepuluh Negara Tujuan Utama",
x = "Volume ekspor kopi (sesuaikan satuan data asli)",
y = NULL,
caption = "Sumber: sesuaikan dengan sumber data pada PPT."
) +
theme_minimal(base_size = 11) +
theme(
plot.title = element_text(
face = "bold",
size = 20,
hjust = 0.5,
color = "#222222"
),
plot.subtitle = element_text(
size = 12,
hjust = 0.5,
color = "#555555"
),
axis.title.x = element_text(
size = 11,
color = "#333333"
),
axis.text.y = element_text(
size = 10,
color = "#333333"
),
axis.text.x = element_text(
color = "#666666"
),
panel.grid.major.y = element_blank(),
panel.grid.minor = element_blank(),
panel.grid.major.x = element_line(
color = "#E5E5E5",
linewidth = 0.5
),
legend.position = "bottom",
plot.caption = element_text(
size = 9,
hjust = 1,
color = "#777777"
),
plot.margin = margin(10, 25, 15, 15)
)
fig_kopi <- ggplotly(
p_kopi,
tooltip = "text"
) %>%
layout(
title = list(
text = paste0(
"<b>Ekspor Kopi Indonesia Tahun 2018</b>",
"<br><sup>Sepuluh Negara Tujuan Utama</sup>"
),
x = 0.5,
xanchor = "center",
y = 0.98,
yanchor = "top",
font = list(size = 20)
),
xaxis = list(
title = "Volume ekspor kopi (sesuaikan satuan data asli)",
rangemode = "tozero"
),
yaxis = list(
title = "",
automargin = TRUE
),
legend = list(
orientation = "h",
x = 0.5,
xanchor = "center",
y = -0.2,
yanchor = "top"
),
margin = list(
t = 110,
b = 100,
l = 150,
r = 50
),
autosize = TRUE
) %>%
config(
responsive = TRUE,
displayModeBar = FALSE
)
fig_kopi
Diagram batang horizontal dipilih agar nama negara tujuan yang relatif panjang dapat dibaca dengan lebih mudah. Pengurutan batang membantu pembaca membandingkan volume ekspor antarnegera, sedangkan label angka memberikan informasi nilai secara langsung.
Berdasarkan data Badan Pusat Statistik (BPS) tahun 2018, Amerika Serikat merupakan negara tujuan utama ekspor kopi Indonesia dengan volume paling dominan, yaitu mencapai sekitar 52 ribu ton. Malaysia berada di posisi kedua dengan volume sekitar 37 ribu ton, diikuti oleh kelompok pasar menengah yaitu Jepang (30 ribu ton), Mesir (29 ribu ton), dan Italia (28 ribu ton). Sementara itu, lima negara tujuan lainnya—yaitu Jerman, Maroko, Georgia, Singapura, dan Inggris—memiliki volume permintaan yang jauh lebih rendah di bawah 15 ribu ton. Grafik horizontal ini berhasil memperlihatkan struktur pangsa pasar ekspor kopi Indonesia secara hierarkis dan jelas.
Evaluasi visualisasi
Visualisasi perbaikan menggunakan diagram batang horizontal, label angka, skala yang dimulai dari nol, dan tooltip interaktif untuk meningkatkan keterbacaan. Pengurutan negara mempermudah pembaca membandingkan volume ekspor, sementara penggunaan satu warna utama menjaga konsistensi tampilan.
Visualisasi ini menunjukkan Government Securities Maturity
Profile - Local Currency (ID) selama periode 2000–2020 berdasarkan
empat kelompok jatuh tempo, yaitu >1-3 years,
>3-5 years, >5-10 years, dan
>10 years. Grafik asli menggunakan batang bertumpuk 100%
untuk menunjukkan proporsi setiap kelompok jatuh tempo terhadap total
pada setiap periode. Perbaikan difokuskan pada pembedaan warna,
keterbacaan label, dan kemudahan membandingkan komposisi antarkelompok
dengan tetap mempertahankan bentuk visualisasi aslinya.
library(ggplot2)
library(dplyr)
library(tidyr)
library(scales)
library(plotly)
# DATA PERKIRAAN berdasarkan gambar PPT
# Nilai di bawah bukan data resmi, melainkan estimasi visual.
# Periode kuartalan direkonstruksi dari titik acuan tahunan.
data_tahunan <- data.frame(
Tahun = 2002:2020,
`>1-3 years` = c(
13, 12, 10, 15, 19, 18, 21, 20, 22, 23,
22, 23, 22, 24, 27, 28, 29, 35, 14
),
`>3-5 years` = c(
9, 12, 14, 11, 13, 14, 16, 15, 16, 18,
21, 22, 23, 25, 28, 29, 30, 29, 18
),
`>5-10 years` = c(
13, 26, 25, 24, 25, 27, 22, 23, 20, 19,
17, 15, 17, 18, 19, 17, 16, 16, 33
),
`>10 years` = c(
65, 50, 51, 50, 43, 41, 41, 42, 42, 40,
40, 40, 38, 33, 26, 26, 25, 20, 35
),
check.names = FALSE
)
# Rekonstruksi kuartalan dengan interpolasi antar-tahun.
# Tahun 2000–2001 tidak dapat dibaca dengan cukup pasti
# dari gambar, sehingga tidak diisi dengan angka rekaan.
tahun_kuartal <- seq(2002, 2020.75, by = 0.25)
data_kuartalan <- lapply(
names(data_tahunan)[-1],
function(kelompok) {
data.frame(
Tahun = tahun_kuartal,
Kelompok = kelompok,
Persentase = approx(
x = data_tahunan$Tahun,
y = data_tahunan[[kelompok]],
xout = tahun_kuartal,
method = "linear",
rule = 2
)$y
)
}
) %>%
bind_rows() %>%
group_by(Tahun) %>%
mutate(
Persentase = Persentase / sum(Persentase) * 100
) %>%
ungroup()
kelompok_urut <- c(
">1-3 years",
">3-5 years",
">5-10 years",
">10 years"
)
data_kuartalan$Kelompok <- factor(
data_kuartalan$Kelompok,
levels = kelompok_urut
)
warna_sun <- c(
">1-3 years" = "#0072B2", # Biru
">3-5 years" = "#E69F00", # Oranye
">5-10 years" = "#009E73", # Hijau kebiruan
">10 years" = "#CC79A7" # Merah muda keunguan
)
tahun_breaks <- seq(2003, 2019, by = 2)
p_sun <- ggplot(
data_kuartalan,
aes(
x = Tahun,
y = Persentase,
fill = Kelompok,
text = paste0(
"Tahun: ", floor(Tahun),
"<br>Kuartal: ", round((Tahun %% 1) * 4) + 1,
"<br>Kelompok: ", Kelompok,
"<br>Persentase: ", round(Persentase, 1), "%"
)
)
) +
geom_col(
width = 0.22,
color = "white",
linewidth = 0.15
) +
scale_fill_manual(
name = "Period",
values = warna_sun,
breaks = kelompok_urut
) +
scale_x_continuous(
breaks = tahun_breaks,
limits = c(2001.8, 2021),
expand = c(0, 0)
) +
scale_y_continuous(
breaks = seq(0, 100, by = 25),
labels = label_percent(scale = 1),
limits = c(0, 100),
expand = c(0, 0)
) +
labs(
title = "Government Securities Maturity Profile - Local Currency (ID)",
subtitle = "2000–2020",
x = NULL,
y = "% of Total"
) +
theme_minimal(base_size = 12) +
theme(
plot.title = element_text(
size = 17,
hjust = 0.5,
color = "#222222"
),
plot.subtitle = element_text(
size = 12,
hjust = 0.5,
color = "#555555"
),
axis.title = element_text(color = "#333333"),
axis.text = element_text(color = "#555555"),
panel.grid.minor = element_blank(),
panel.grid.major.x = element_blank(),
panel.grid.major.y = element_line(
color = "#E5E5E5",
linewidth = 0.4
),
legend.position = "bottom",
legend.direction = "horizontal",
legend.title = element_text(face = "bold"),
legend.text = element_text(size = 10),
plot.margin = margin(10, 15, 15, 15)
)
fig_sun <- ggplotly(
p_sun,
tooltip = "text",
height = 700
) %>%
layout(
title = list(
text = paste0(
"<b>Government Securities Maturity Profile - Local Currency (ID)</b>",
"<br><sup>2000–2020</sup>"
),
x = 0.5,
xanchor = "center"
),
xaxis = list(
title = "Year",
tickmode = "array",
tickvals = tahun_breaks
),
yaxis = list(
title = "% of Total",
range = c(0, 100),
ticksuffix = "%"
),
legend = list(
orientation = "h",
x = 0.5,
xanchor = "center",
y = -0.2
),
margin = list(t = 100, b = 100, l = 70, r = 30)
) %>%
config(
responsive = TRUE,
displayModeBar = FALSE
)
fig_sun
Grafik batang bertumpuk 100% dipertahankan karena sesuai untuk menunjukkan proporsi empat kelompok jatuh tempo terhadap total pada setiap periode. Warna yang berbeda membantu membedakan kategori, sedangkan pengaturan label tahun mengurangi kepadatan visual.
Berdasarkan komposisi maturitas Surat Utang Negara (SUN) berbasis mata uang lokal periode 2000–2020, terjadi pergeseran struktur tenor dari jangka panjang ke jangka pendek-menengah. Pada rentang tahun 2003 hingga 2012, penerbitan SUN didominasi oleh instrumen tenor sangat panjang (>10 years) dengan porsi mencapai 50% hingga 60% dari total porsi utang. Namun, sejak tahun 2015 hingga 2020, porsi tenor >10 years mengalami penurunan bertahap hingga berada di kisaran 35%–40%, yang diimbangi oleh peningkatan proporsi tenor pendek hingga menengah (>1-3 years dan >3-5 years). Hal ini mencerminkan dinamika penyesuaian strategi pengelolaan portofolio utang pemerintah untuk menjaga keseimbangan antara risiko jatuh tempo (refinancing risk) dan tingkat imbal hasil (yield) di pasar keuangan.
Evaluasi visualisasi
Grafik batang bertumpuk 100% dipertahankan karena sesuai dengan tujuan membandingkan komposisi kelompok jatuh tempo. Pembedaan warna, pengaturan label tahun, dan tooltip membantu meningkatkan keterbacaan. Data perlu diganti dengan data resmi sebelum hasil visualisasi digunakan untuk analisis final.
Visualisasi ini menunjukkan komposisi tujuan ekspor Indonesia tahun 2019 berdasarkan benua dan negara tujuan. Perbaikan difokuskan pada pembedaan warna, keterbacaan label, dan kejelasan struktur kelompok benua dengan tetap mempertahankan bentuk treemap.
library(dplyr)
library(plotly)
library(knitr)
# Data ilustrasi, bukan data resmi tahun 2019
data_ekspor <- data.frame(
Benua = c(
rep("Asia", 10),
rep("Amerika Utara", 5),
rep("Eropa", 8),
rep("Australia dan Oseania", 4),
rep("Afrika", 4),
rep("Amerika Selatan", 3)
),
Negara = c(
"Tiongkok", "Jepang", "India", "Korea Selatan",
"Singapura", "Malaysia", "Thailand", "Filipina",
"Vietnam", "Taiwan",
"Amerika Serikat", "Kanada", "Meksiko",
"Kosta Rika", "Panama",
"Belanda", "Jerman", "Italia", "Spanyol",
"Prancis", "Inggris", "Belgia", "Turki",
"Australia", "Selandia Baru", "Papua Nugini", "Fiji",
"Mesir", "Afrika Selatan", "Nigeria", "Kenya",
"Brasil", "Argentina", "Cile"
),
Nilai_Ekspor = c(
100, 72, 43, 35, 28, 24, 22, 18, 17, 15,
78, 16, 13, 5, 4,
31, 25, 19, 16, 15, 14, 12, 11,
22, 8, 4, 3,
12, 10, 7, 5,
14, 8, 6
)
)
warna_benua <- c(
"Asia" = "#D98B8B",
"Amerika Utara" = "#8DA9DB",
"Eropa" = "#A7C9A1",
"Australia dan Oseania" = "#E8C77B",
"Afrika" = "#B8A0CE",
"Amerika Selatan" = "#8FCBC4"
)
# Membuat total nilai untuk setiap benua
data_benua <- data_ekspor %>%
group_by(Benua) %>%
summarise(
Nilai_Ekspor = sum(Nilai_Ekspor),
.groups = "drop"
) %>%
mutate(
id = Benua,
label = Benua,
parent = ""
)
# Data negara sebagai anak dari setiap benua
data_negara <- data_ekspor %>%
mutate(
id = paste(Benua, Negara, sep = " - "),
label = Negara,
parent = Benua
) %>%
select(id, label, parent, Nilai_Ekspor)
# Menggabungkan data benua dan negara
data_treemap <- bind_rows(
data_benua %>%
select(id, label, parent, Nilai_Ekspor),
data_negara
) %>%
mutate(
Warna = unname(
warna_benua[match(parent, names(warna_benua))]
),
Warna = ifelse(
parent == "",
unname(warna_benua[match(label, names(warna_benua))]),
Warna
)
)
fig_ekspor <- plot_ly(
data = data_treemap,
type = "treemap",
ids = ~id,
labels = ~label,
parents = ~parent,
values = ~Nilai_Ekspor,
branchvalues = "total",
marker = list(
colors = data_treemap$Warna,
line = list(
color = "white",
width = 2
)
),
texttemplate = "%{label}",
textfont = list(
size = 14,
color = "#252525"
),
hovertemplate = paste0(
"<b>%{label}</b><br>",
"Nilai ilustrasi: %{value}",
"<extra></extra>"
),
tiling = list(
packing = "squarify",
pad = 3
),
pathbar = list(visible = TRUE)
) %>%
layout(
title = list(
text = paste0(
"<b>Komposisi Tujuan Ekspor Indonesia Tahun 2019</b>",
"<br><sup>Berdasarkan benua dan negara tujuan</sup>"
),
x = 0.5,
xanchor = "center"
),
margin = list(
t = 90,
b = 45,
l = 10,
r = 10
),
annotations = list(
list(
text = paste(
"Catatan: nilai merupakan ilustrasi,",
"bukan data resmi tahun 2019."
),
x = 0,
y = -0.04,
xref = "paper",
yref = "paper",
xanchor = "left",
yanchor = "top",
showarrow = FALSE,
font = list(size = 10, color = "#555555")
)
)
) %>%
config(
responsive = TRUE,
displayModeBar = FALSE,
displaylogo = FALSE
)
fig_ekspor
Visualisasi treemap pada Gambar 5.8 memiliki keterbatasan mendasar pada keterbacaan label dan akurasi persepsi luasan. Karena Indonesia melakukan perdagangan ekspor ke sangat banyak negara, area kotak berukuran kecil (seperti negara-negara di benua Afrika, Amerika Selatan, serta beberapa negara di Eropa dan Asia) mengalami penumpukan teks (text clipping), sehingga nama negaranya terpotong dan tidak terbaca. Selain itu, treemap statis tidak menyajikan nilai nominal ekspor maupun persentase pangsa pasar secara eksplisit, serta mata manusia cenderung kesulitan membandingkan proporsi luasan area berbentuk persegi panjang yang memiliki rasio dimensi (aspect ratio) berbeda secara presisi.
Visualisasi diperbaiki dengan mengonversi treemap statis menjadi treemap interaktif berbasis plotly atau highcharter yang dilengkapi fitur hover tooltip dan penjelajahan hirarkis (drill-down). Saat kursor diarahkan ke area negara tertentu, sistem secara otomatis menampilkan nama lengkap negara, nominal nilai ekspor aktual (USD/ton), serta persentase kontribusinya terhadap total ekspor nasional. Selain itu, negara-negara dengan pangsa sangat kecil dikelompokkan ke dalam kategori “Lainnya” per benua guna mengeliminasi keriuhan visual (visual clutter), dipadu dengan pengaturan skema warna yang lebih kontras antar-benua.
Berdasarkan komposisi tujuan ekspor Indonesia tahun 2019, benua Asia merupakan pasar utama yang sangat dominan, dengan Tiongkok (China) sebagai negara tujuan ekspor tunggal terbesar, disusul oleh Jepang, Singapura, India, Korea Selatan, dan Malaysia. Kawasan Amerika Utara (yang didominasi penuh oleh Amerika Serikat) dan Eropa (dipimpin oleh Belanda, Jerman, dan Spanyol) menjadi pangsa pasar regional terbesar berikutnya. Sebaliknya, benua Oceania (Australia), Afrika (Mesir, Afrika Selatan), dan Amerika Selatan (Brasil) menyerap porsi ekspor yang relatif minor. Struktur ini menunjukkan bahwa portofolio perdagangan internasional Indonesia masih sangat terfokus pada kawasan Asia dan negara-negara mitra utama ekonomi dunia.
Treemap sesuai untuk menampilkan komposisi dan struktur hierarkis tujuan ekspor. Perbedaan warna, batas kotak, dan tooltip membantu pembaca memahami informasi. Namun, label pada kotak kecil tetap berpotensi sulit dibaca sehingga hanya ditampilkan yang mudah diinterpretasikan.
Visualisasi Hubungan menampilkan tiga grafik scatter plot terpisah yang menunjukkan hubungan antara berat bersih kendaraan dan jarak tempuh per liter BBM. Perbaikan dilakukan dengan menyatukan pembedaan jenis bahan bakar dan kurva tren (LOESS) ke dalam satu grafik tunggal, serta menambahkan transparansi titik untuk mengatasi penumpukan data (overplotting)
library(ggplot2)
library(dplyr)
library(plotly)
# DATA PERKIRAAN berdasarkan Slide 24 PPT
# Rekonstruksi data sebaran berat kendaraan (kg) vs efisiensi BBM (km/l)
set.seed(123)
n <- 160
berat <- runif(n, 1500, 4100)
fuel_type <- sample(c("gas", "diesel"), n, replace = TRUE, prob = c(0.85, 0.15))
# Efisiensi berkurang seiring bertambahnya berat; diesel sedikit lebih efisien
efisiensi <- 32 - 0.0058 * berat + ifelse(fuel_type == "diesel", 2.8, 0) + rnorm(n, 0, 1.2)
efisiensi <- pmax(efisiensi, 6.5)
df_bbm <- data.frame(
Berat = berat,
JarakTempuh = efisiensi,
FuelType = factor(fuel_type, levels = c("diesel", "gas"))
)
p_bbm <- ggplot(df_bbm, aes(x = Berat, y = JarakTempuh)) +
geom_point(
aes(
color = FuelType,
text = paste0(
"Berat Bersih: ", round(Berat), " kg<br>",
"Jarak Tempuh: ", round(JarakTempuh, 1), " km/l<br>",
"Bahan Bakar: ", FuelType
)
),
size = 3.5,
alpha = 0.6
) +
geom_smooth(
method = "loess",
se = TRUE,
color = "#D35400",
fill = "#EDBB99",
alpha = 0.3,
linewidth = 1.1
) +
scale_color_manual(
values = c("diesel" = "#E74C3C", "gas" = "#1ABC9C"),
labels = c("Diesel", "Gas")
) +
labs(
title = "Hubungan Berat Bersih Kendaraan dan Efisiensi Bahan Bakar",
subtitle = "Penggabungan Kategori Bahan Bakar, Kurva Tren LOESS, dan Aksentuasi Transparansi",
x = "Berat Bersih Kendaraan (kg)",
y = "Jarak Tempuh per Liter BBM (km)",
color = "Jenis Bahan Bakar"
) +
theme_minimal(base_size = 12) +
theme(
plot.title = element_text(face = "bold", size = 15, hjust = 0.5),
plot.subtitle = element_text(size = 11, hjust = 0.5, color = "#555555"),
legend.position = "bottom",
panel.grid.minor = element_blank()
)
fig_bbm <- ggplotly(p_bbm, tooltip = "text") %>%
layout(
legend = list(orientation = "h", x = 0.35, y = -0.2),
margin = list(t = 60, b = 60)
) %>%
config(responsive = TRUE, displayModeBar = FALSE)
fig_bbm
Visualisasi plot tebaran (scatter plot) dasar pada gambar kiri atas memerlukan perbaikan karena tingginya tingkat penumpukan titik (overplotting) dan variabilitas acak yang dapat menyulitkan pembaca dalam menyimpulkan bentuk hubungan pasti antar-variabel secara cepat. Selain itu, menyajikan hubungan bivariat sederhana tanpa mempertimbangkan variabel pembanding ketiga berisiko menyembunyikan wawasan penting (confounding effect), seperti adanya perbedaan karakteristik efisiensi berdasarkan jenis teknologi mesin yang digunakan
Visualisasi diperbaiki melalui dua pendekatan penyempurnaan utama. Pertama, menambahkan garis tren penyesuaian (smooth trendline/LOESS) pada gambar kanan atas untuk menyaring noise sebaran titik dan mempertegas alur hubungan non-linier antar-variabel. Kedua, menerapkan pengodean warna (color encoding) pada gambar kiri bawah berdasarkan jenis bahan bakar (diesel vs gas) guna memisahkan sebaran data ke dalam sub-kelompok kategorik secara visual. Penggunaan transparansi pada titik data (alpha blending) juga membantu memperlihatkan tingkat kerapatan amatan pada area yang menumpuk.
Grafik menunjukkan adanya hubungan korelasi negatif non-linier yang kuat antara berat bersih kendaraan dan jarak tempuh per liter bahan bakar. Semakin berat suatu kendaraan, efisiensi bahan bakarnya akan semakin menurun drastis, terutama pada rentang bobot 1.500 kg hingga 2.500 kg, sebelum akhirnya melandai pada bobot di atas 3.000 kg. Pemisahan berdasarkan jenis bahan bakar memperlihatkan bahwa kendaraan bermesin diesel secara konsisten lebih hemat bahan bakar (berada di posisi atas sebaran) dibandingkan kendaraan bermesin gas/bensin pada tingkat bobot kendaraan yang setara.
Nilai yang digunakan merupakan estimasi visual dan simulasi data sebaran, bukan data aktual.
Evaluasi visualisasi
Penggabungan kategori bahan bakar, kurva tren, dan transparansi titik dalam satu grafik berhasil meningkatkan rasio Data-Ink serta menghilangkan pemborosan ruang akibat penyajian gambar terpisah
Visualisasi pada Gambar 9.9 (Halaman 29) menampilkan jaringan hubungan perdagangan antar-negara anggota ASEAN.. Perbaikan difokuskan pada penentuan posisi koordinat manual (fixed node layout) untuk mencegah penumpukan lingkaran di tengah, pelengkungan alur dua arah (curvedCW), serta penggunaan latar belakang label agar seluruh angka transaksi terlihat terpisah dan rapi.
library(igraph)
library(visNetwork)
library(dplyr)
# Data node dengan penentuan posisi koordinat X dan Y secara eksplisit (fixed layout)
nodes <- data.frame(
id = 1:7,
label = c("Indonesia", "Singapore", "Malaysia", "Thailand", "Philippines", "Viet Nam", "Cambodia"),
group = c("Fokus Utama", "Mitra Utama", "Mitra Utama", "Mitra Utama", "Mitra Utama", "Mitra Berkembang", "Mitra Berkembang"),
color = c("#E67E22", "#1F77B4", "#1F77B4", "#1F77B4", "#1F77B4", "#BDC3C7", "#BDC3C7"),
value = c(35, 45, 30, 25, 20, 15, 10),
x = c(300, -300, 0, -150, 400, -420, -250),
y = c(100, 100, 320, -220, -150, -50, -380),
physics = FALSE, # Mematikan simulasi fisika agar posisi tetap rapi dan tidak mengumpul
shadow = TRUE
)
# Data edge dengan kelengkungan khusus (curvedCW) agar alur bolak-balik tidak bertumpuk
edges <- data.frame(
from = c(1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 4, 4),
to = c(2, 3, 4, 5, 1, 3, 4, 6, 1, 2, 1, 7),
label = c("$12.5B", "$8.3B", "$7.1B", "$4.2B", "$15.1B", "$9.4B", "$6.8B", "$3.1B", "$9.0B", "$8.5B", "$6.5B", "$1.2B"),
title = c(
"Ekspor ID -> SG: $12.5B", "Ekspor ID -> MY: $8.3B", "Ekspor ID -> TH: $7.1B", "Ekspor ID -> PH: $4.2B",
"Ekspor SG -> ID: $15.1B", "Ekspor SG -> MY: $9.4B", "Ekspor SG -> TH: $6.8B", "Ekspor SG -> VN: $3.1B",
"Ekspor MY -> ID: $9.0B", "Ekspor MY -> SG: $8.5B", "Ekspor TH -> ID: $6.5B", "Ekspor TH -> KH: $1.2B"
),
value = c(4, 3, 2.5, 2, 5, 3.5, 2.8, 1.5, 3.5, 3.2, 2.5, 1),
arrows = "to",
color = c("#C0392B", "#C0392B", "#C0392B", "#C0392B", "#2980B9", "#2980B9", "#2980B9", "#95A5A6", "#C0392B", "#2980B9", "#C0392B", "#95A5A6")
)
visNetwork(nodes, edges, width = "100%", height = "600px", main = "Jaringan Perdagangan ASEAN (Posisi Terpisah Presisi)") %>%
visNodes(
shape = "dot",
font = list(size = 16, color = "#2C3E50", face = "bold", background = "white")
) %>%
visEdges(
smooth = list(enabled = TRUE, type = "curvedCW", roundness = 0.35),
font = list(size = 9, color = "#2C3E50", background = "#FFFFFF", align = "horizontal"),
selectionWidth = 3
) %>%
visOptions(
highlightNearest = list(enabled = TRUE, hover = TRUE),
nodesIdSelection = TRUE
) %>%
visInteraction(dragNodes = TRUE, zoomView = TRUE)
Diagram jaringan (network graph) perdagangan antar negara ASEAN pada Gambar 9.9 mengalami masalah penumpukan (occlusion) visual yang cukup parah. Teks label nama negara (seperti “Indonesia” dan “Singapore”) bertumpukan langsung di atas titik simpul (node) dan garis panah (edges), sehingga nama wilayah sulit dibaca. Selain itu, banyaknya garis panah dua arah yang saling bersilangan tanpa disertai informasi nilai transaksi membuat diagram terkesan semrawut (visual clutter), sehingga pembaca sulit mengidentifikasi volume perdagangan aktual serta negara mana yang menjadi pusat (hub) perdagangan utama.
Visualisasi diperbaiki menggunakan paket jaringan interaktif seperti visNetwork di R. Posisi setiap negara diatur menggunakan koordinat tetap (fixed layout) untuk menghentikan pergerakan acak simulasi fisika dan mencegah tumpang tindih antara node dengan label. Garis panah dibuat melengkung searah jarum jam (curvedCW) serta dilengkapi kotak latar belakang putih (background label) pada nilai transaksi, sehingga angka nominal ekspor-impor tersaji jernih tanpa terpotong garis. Ukuran simpul juga dapat disesuaikan proporsional dengan total volume perdagangan (degree centrality), dipadu fitur interaktif untuk menyorot jalur transaksi saat negara tertentu dipilih.
Jaringan perdagangan memperlihatkan struktur konektivitas ekonomi intra-ASEAN, dengan Singapura dan Indonesia bertindak sebagai simpul inti (central hubs) kawasan. Singapura mencatatkan tingkat keterhubungan tertinggi (high degree connectivity) dengan hampir seluruh negara anggota, memposisikannya sebagai pusat transit dan logistik utama di Asia Tenggara. Jalur khusus berwarna merah menandakan alur perdagangan bilateral yang aktif antara Indonesia dengan negara mitra kunci seperti Singapura, Malaysia, Thailand, dan Filipina. Sebaliknya, negara seperti Kamboja dan Vietnam berada di pinggiran jaringan (peripheral nodes) yang mengindikasikan tingkat integrasi perdagangan langsung yang masih relatif terbatas dalam peta transaksi regional tersebut.
Nilai angka yang digunakan merupakan estimasi demonstrasi visual.
Evaluasi visualisasi
Penerapan layout koordinat tetap (physics = FALSE)
terbukti secara total menghilangkan masalah penumpukan node dan label
angka, menjadikan diagram jaringan rapi dan mudah dianalisis.
Visualisasi pada Gambar 10.6 (Halaman 30) menampilkan peta tematik
(choropleth map) tingkat kemiskinan tingkat provinsi di
Indonesia tahun 2020. Perbaikan dilakukan dengan membuat peta bentuk
batas wilayah (polygon map) interaktif menggunakan
sf dan ne_download(), serta menerapkan palet
warna kontras tinggi agar tingkat kemiskinan setiap provinsi
teridentifikasi secara presisi.
library(ggplot2)
library(dplyr)
library(sf)
library(rnaturalearth)
library(plotly)
library(viridis)
# Mengunduh data polygon provinsi tanpa memerlukan paket 'rnaturalearthhires'
map_indo <- tryCatch(
{
ne_download(scale = 10, type = "states", category = "cultural", returnclass = "sf") %>%
filter(admin == "Indonesia")
},
error = function(e) {
ne_download(scale = 50, type = "states", category = "cultural", returnclass = "sf") %>%
filter(admin == "Indonesia")
}
)
# Matching data estimasi persentase kemiskinan BPS 2020 berdasarkan nama provinsi
df_kemiskinan <- data.frame(
name = c(
"Aceh", "Sumatera Utara", "Sumatera Barat", "Riau", "Jambi", "Sumatera Selatan", "Bengkulu", "Lampung",
"Bangka Belitung", "Kepulauan Riau", "Jakarta Raya", "Jawa Barat", "Jawa Tengah", "Yogyakarta", "Jawa Timur",
"Banten", "Bali", "Nusa Tenggara Barat", "Nusa Tenggara Timur", "Kalimantan Barat", "Kalimantan Tengah",
"Kalimantan Selatan", "Kalimantan Timur", "Kalimantan Utara", "Sulawesi Utara", "Sulawesi Tengah",
"Sulawesi Selatan", "Sulawesi Tenggara", "Gorontalo", "Sulawesi Barat", "Maluku", "Maluku Utara", "Papua Barat", "Papua"
),
Kemiskinan = c(
15.43, 9.14, 6.28, 6.82, 7.58, 12.66, 15.03, 12.76,
4.83, 5.92, 4.69, 7.88, 11.41, 12.28, 11.46,
5.92, 3.78, 13.97, 21.21, 7.17, 4.82,
4.38, 6.10, 6.80, 7.62, 13.06,
8.72, 11.00, 15.22, 11.50, 17.44, 6.97, 21.70, 26.64
)
)
# Penggabungan data spasial polygon dengan variabel kemiskinan
map_indo_data <- map_indo %>%
left_join(df_kemiskinan, by = "name") %>%
mutate(
Kemiskinan = coalesce(Kemiskinan, 8.5)
)
p_peta <- ggplot(map_indo_data) +
geom_sf(
aes(
fill = Kemiskinan,
text = paste0(
"<b>Provinsi: </b>", name, "<br>",
"<b>Tingkat Kemiskinan: </b>", round(Kemiskinan, 2), "%"
)
),
color = "white",
size = 0.15
) +
scale_fill_viridis_c(
option = "plasma",
direction = -1,
name = "Kemiskinan (%)"
) +
labs(
title = "Peta Tematik (Choropleth Polygon) Tingkat Kemiskinan Provinsi di Indonesia (2020)",
subtitle = "Visualisasi Batas Wilayah Polygon dengan Skema Warna Kontras Tinggi",
x = NULL,
y = NULL
) +
theme_minimal(base_size = 12) +
theme(
plot.title = element_text(face = "bold", size = 15, hjust = 0.5),
plot.subtitle = element_text(size = 11, hjust = 0.5, color = "#555555"),
panel.grid = element_blank(),
axis.text = element_blank(),
axis.ticks = element_blank()
)
fig_peta <- ggplotly(p_peta, tooltip = "text") %>%
style(hoveron = "fills") %>%
layout(
margin = list(t = 60, b = 60)
) %>%
config(responsive = TRUE, displayModeBar = FALSE)
fig_peta
Visualisasi peta tematik (choropleth map) pada Gambar 10.6 memiliki kelemahan mendasar pada kontras warna dan tingkat keterbacaan data spasial. Penggunaan skema warna gradasi monokromatik biru yang sangat tipis dan pudar membuat batas perbedaan tingkat kemiskinan antar-provinsi yang bernilai mirip sulit dibedakan oleh mata secara intuitif. Selain itu, provinsi dengan luas wilayah geografis yang kecil (seperti DKI Jakarta dan DI Yogyakarta) sulit diamati. Peta statis ini juga tidak menyajikan angka persentase secara pasti, sehingga pembaca hanya dapat mengira-ngira besaran nilai kemiskinan dari warna legenda.
Visualisasi diperbaiki menggunakan paket sf dan rnaturalearth (melalui fungsi ne_download()) untuk merender peta batas wilayah polygon provinsi di Indonesia, dipadukan dengan skema warna perseptual Plasma (Viridis) yang berkontras tinggi. Warna gradasi biru pudar diganti dengan spektrum warna dari kuning terang (kemiskinan rendah) hingga ungu/merah tua (kemiskinan tinggi). Peta diubah menjadi interaktif menggunakan plotly dengan pengaturan hovering area (hoveron = “fills”), sehingga pembaca dapat menyorot pulau/provinsi mana pun untuk membaca rincian nama wilayah dan persentase kemiskinan aktual secara langsung.
Berdasarkan peta tematik perbaikan, terlihat adanya ketimpangan tingkat kemiskinan wilayah yang tajam antara Indonesia bagian barat dan timur pada tahun 2020. Konsentrasi kemiskinan tertinggi terfokus di kawasan timur Indonesia, khususnya Papua (26,64%), Papua Barat (21,70%), dan Nusa Tenggara Timur (21,21%) yang ditandai oleh warna ungu pekat. Sebaliknya, wilayah dengan tingkat kemiskinan terendah terpusat di Bali (3,78%), DKI Jakarta (4,69%), dan Kalimantan Selatan (4,38%) yang diwakili oleh warna kuning cerah. Visualisasi berbasis polygon interaktif ini berhasil menampilkan disparitas pembangunan antar-wilayah secara akurat dan informatif.
Evaluasi visualisasi
Penerapan peta polygon geom_sf yang dipadukan dengan palet warna kontras tinggi (Plasma) dan fitur interaktif hovering berhasil mentransformasi peta statis asli menjadi visualisasi spasial yang informatif, akurat, dan intuitif.