knitr::opts_chunk$set(echo = TRUE, warning = FALSE, message = FALSE)

1. Choropleth

Deskripsi chart / jenis visualisasi:
Choropleth adalah peta tematik yang mewarnai area geografis berdasarkan nilai tertentu, misalnya populasi, tingkat pengangguran, atau angka kasus penyakit.

Kapan / untuk apa chart ini digunakan:
Digunakan untuk menampilkan distribusi data kuantitatif secara spasial. Cocok untuk melihat perbedaan antar wilayah secara visual dan cepat.

Penjelasan singkat tentang cara membaca chart:
Warna atau intensitas warna pada tiap area mewakili besarnya nilai. Warna lebih gelap atau lebih terang menunjukkan nilai yang lebih tinggi atau lebih rendah, tergantung skala yang dipilih.

library(ggplot2)
library(dplyr)
library(viridis)
library(maps)

# Data peta dunia
world_map <- map_data("world")

# Data populasi ASEAN (juta jiwa)
asean_pop <- data.frame(
  region = c("Indonesia", "Philippines", "Vietnam", "Thailand",
             "Myanmar", "Malaysia", "Cambodia", "Laos",
             "Singapore", "Timor-Leste", "Brunei"),
  population = c(284, 119, 100, 72, 57, 35, 18, 7.8, 6.2, 1.5, 0.47)
)

# Perbaiki nama negara supaya match peta
world_map <- world_map %>%
  mutate(region = case_when(
    region == "Timor" ~ "Timor-Leste",
    region == "Brunei" ~ "Brunei",
    TRUE ~ region
  ))

# Ambil titik tengah tiap negara untuk label
centroids <- world_map %>%
  filter(region %in% asean_pop$region) %>%
  group_by(region) %>%
  summarise(long = mean(range(long)), lat = mean(range(lat))) %>%
  inner_join(asean_pop, by = "region")

# Gabungkan data populasi dengan peta
map_data_join <- world_map %>%
  filter(region %in% asean_pop$region) %>%
  left_join(asean_pop, by = "region")

# Plot choropleth ASEAN dengan label nama negara saja
ggplot() +
  geom_polygon(
    data = map_data_join,
    aes(long, lat, group = group, fill = population),
    color = "white", linewidth = 0.3
  ) +
  geom_text(
    data = centroids,
    aes(x = long, y = lat, label = region),
    size = 3, color = "black", fontface = "bold"
  ) +
  scale_fill_viridis(
    option = "plasma",
    na.value = "grey90",
    name = "Populasi (juta jiwa)"
  ) +
  labs(
    title = "Populasi Negara ASEAN"
  ) +
  theme_void() +
  theme(
    plot.title = element_text(hjust = 0.5, face = "bold", size = 16),
    legend.title = element_text(face = "bold")
  )

2. Sunburst Chart

Deskripsi chart / jenis visualisasi:
Sunburst chart adalah diagram berbentuk lingkaran konsentris yang menunjukkan data hierarkis. Setiap lingkaran mewakili level hierarki, dari pusat ke luar.

Kapan / untuk apa chart ini digunakan:
Digunakan untuk menampilkan struktur hierarki sekaligus proporsi tiap cabang, misalnya organisasi, wilayah geografis, atau kategori produk.

Penjelasan singkat tentang cara membaca chart:
Ukuran atau panjang tiap segmen mewakili nilai relatif atau proporsi. Cabang dari pusat menunjukkan hubungan hierarki antar level.

library(plotly)

labels <- c("Universitas", 
            "Fakultas Sains", "Fakultas Ekonomi", "Fakultas Teknik",
            "Matematika", "Biologi", "Manajemen", "Akuntansi", "Informatika", "Sipil")

parents <- c("",
             "Universitas", "Universitas", "Universitas",
             "Fakultas Sains", "Fakultas Sains",
             "Fakultas Ekonomi", "Fakultas Ekonomi",
             "Fakultas Teknik", "Fakultas Teknik")

values <- c(NA, 200, 150, 180, 80, 120, 70, 80, 100, 80)

# Tambahkan warna custom
colors <- viridis::viridis(length(labels))

fig <- plot_ly(
  labels = labels,
  parents = parents,
  values = values,
  type = "sunburst",
  branchvalues = "total",
  marker = list(colors = colors)
)

fig <- fig %>% layout(title = "Sunburst Chart: Hierarki Universitas")
fig

3. Heatmap Chart

Deskripsi chart / jenis visualisasi:
Heatmap adalah representasi data dua dimensi menggunakan warna untuk menunjukkan intensitas nilai di setiap kombinasi kategori X dan Y.

Kapan / untuk apa chart ini digunakan:
Cocok untuk menampilkan korelasi, frekuensi, atau distribusi nilai pada dua variabel. Misalnya jumlah penjualan tiap produk per bulan, atau intensitas aktivitas per jam.

Penjelasan singkat tentang cara membaca chart:
Setiap kotak mewakili kombinasi X dan Y. Warna kotak menunjukkan nilai atau intensitas, dengan gradasi warna menandakan tinggi-rendahnya nilai.

library(ggplot2)
library(viridis)

set.seed(123)

# Produk: 6 jenis beras
produk <- c("Pandan Wangi", "Rojolele", "IR 64", "Setra Ramos", "Mentik Wangi", "Beras Merah Organik")
wilayah <- c("Jakarta", "Bandung", "Surabaya", "Medan", "Makassar")

# Buat data simulasi penjualan
heatmap_data <- expand.grid(Produk = produk, Wilayah = wilayah)
heatmap_data$Penjualan <- sample(500:5000, nrow(heatmap_data), replace = TRUE) # dalam kg

# Heatmap
ggplot(heatmap_data, aes(x = Produk, y = Wilayah, fill = Penjualan)) +
  geom_tile(color = "white", linewidth = 0.7) +
  scale_fill_viridis_c(option = "C") +
  labs(title = "Heatmap: Simulasi Penjualan 6 Jenis Beras di 5 Kota Indonesia",
       x = "Jenis Beras", y = "Kota", fill = "Penjualan (kg)") +
  theme_minimal(base_size = 12) +
  theme(
    axis.text.x = element_text(angle = 45, hjust = 1),
    panel.grid = element_blank()
  )

4. Streamgraph

Deskripsi chart / jenis visualisasi:
Streamgraph adalah variasi dari stacked area chart, menampilkan perubahan beberapa kategori sepanjang waktu dalam bentuk aliran yang mengalir dan organik.

Kapan / untuk apa chart ini digunakan:
Digunakan untuk menampilkan tren atau proporsi multikategori sepanjang periode tertentu. Misalnya jumlah penjualan beberapa produk tiap tahun.

Penjelasan singkat tentang cara membaca chart:
Tinggi tiap aliran menunjukkan besarnya nilai untuk kategori tertentu pada titik waktu tertentu. Lebar visual di sepanjang sumbu X menunjukkan variasi atau tren nilai dari waktu ke waktu.

library(ggplot2)
library(ggstream)
library(dplyr)

set.seed(123)

# Data simulasi
stream_data <- data.frame(
  year = rep(2010:2020, each = 4),
  kategori = rep(c("Kursi", "Meja", "Lemari", "Rak Buku"), times = 11),
  value = sample(50:300, 44, replace = TRUE) # jumlah unit terjual
)

# Streamgraph dengan sumbu X hanya menampilkan tahun utuh
ggplot(stream_data, aes(x = year, y = value, fill = kategori)) +
  geom_stream(type = "ridge") +
  scale_fill_manual(values = c("#4B0082", "#1E90FF", "#20B2AA", "#FF8C00")) +
  scale_x_continuous(breaks = 2010:2020) +  # hanya tahun utuh
  theme_minimal(base_size = 14) +
  theme(
    plot.title = element_text(size = 18, face = "bold", hjust = 0.5),
    legend.position = "top",
    legend.title = element_text(face = "bold")
  ) +
  labs(
    title = "Streamgraph: Tren Penjualan Furnitur (2010–2020)",
    x = "Tahun",
    y = "Jumlah Unit Terjual (pcs)",
    fill = "Jenis Furnitur"
  )

5. Topographic Map

Deskripsi chart / jenis visualisasi:
Topographic map adalah peta yang menampilkan elevasi atau relief permukaan tanah menggunakan warna, shading, dan garis kontur.

Kapan / untuk apa chart ini digunakan:
Digunakan untuk melihat variasi ketinggian wilayah, relief bukit dan lembah, serta mempermudah analisis geografi atau perencanaan ruang.

Penjelasan singkat tentang cara membaca chart:
Warna dan garis kontur menunjukkan elevasi; warna lebih gelap atau lebih terang menandakan daerah lebih tinggi atau lebih rendah. Garis kontur membantu membedakan perubahan ketinggian dengan lebih jelas.

library(ggplot2)
library(viridis)

# Simulasi elevasi kecil (misal kabupaten)
set.seed(123)
x <- seq(0, 10, length.out = 50)
y <- seq(0, 10, length.out = 50)
grid <- expand.grid(X = x, Y = y)
grid$Z <- with(grid, 500 + 50*sin(X) + 30*cos(Y) + rnorm(2500,0,5)) # variasi bukit kecil

# Topographic map kabupaten
ggplot(grid, aes(X, Y, fill = Z)) +
  geom_raster() +
  geom_contour(aes(z = Z), color = "black", alpha = 0.5) +
  scale_fill_viridis(option = "terrain") +
  labs(title = "Topographic Map Simulasi Kabupaten",
       fill = "Elevasi (m)") +
  theme_minimal() +
  theme(
    axis.title = element_blank(),
    axis.text = element_blank(),
    axis.ticks = element_blank()
  )