Pie chart asli menggabungkan persentase dari empat tanggal yang tidak membentuk satu total. Efek 3D juga mengganggu pembacaan luas. Pie buatan pada tugas awal bukan salinan persis slide; pembanding di atas adalah slide asli.
library(ggplot2)
data_rs <- data.frame(
tanggal = factor(
c("29 Januari", "30 Januari", "31 Januari", "1 Februari"),
levels = c("29 Januari", "30 Januari", "31 Januari", "1 Februari")
),
keterisian = c(54, 57, 57, 60)
)grafik_benar <- ggplot(
data_rs,
aes(x = tanggal, y = keterisian, group = 1)
) +
geom_line(
color = "#0072B2",
linewidth = 1.2
) +
geom_point(
color = "#0072B2",
size = 4
) +
geom_text(
aes(label = paste0(keterisian, "%")),
vjust = -1,
size = 5,
fontface = "bold"
) +
scale_y_continuous(
limits = c(0, 100),
breaks = seq(0, 100, 20),
labels = function(x) paste0(x, "%")
) +
labs(
title = "Tingkat Keterisian Tempat Tidur RS di DKI Jakarta",
subtitle = "Perbaikan: perubahan keterisian berdasarkan waktu",
x = NULL,
y = "Keterisian tempat tidur (%)",
caption = "Sumber: Dinas Kesehatan DKI Jakarta"
) +
theme_minimal(base_size = 13) +
theme(
plot.title = element_text(face = "bold", size = 15),
panel.grid.minor = element_blank(),
panel.grid.major.x = element_blank(),
axis.text.x = element_text(color = "black"),
plot.caption = element_text(hjust = 0)
)
grafik_benarAlasan perbaikan: Pie chart tidak memperlihatkan urutan dan perubahan waktu secara jelas. Persentase keterisian pada tanggal berbeda juga bukan bagian dari satu total yang sama.
Perbaikan yang dilakukan: Menggunakan titik yang dihubungkan garis menurut urutan tanggal, serta menambahkan label persentase. Penyajian ini memudahkan pembaca mengikuti perubahan harian.
Interpretasi: Keterisian meningkat dari 54% pada 29 Januari menjadi 57% pada 30 Januari, tetap pada 31 Januari, kemudian meningkat menjadi 60% pada 1 Februari. Secara keseluruhan, terjadi kenaikan sebesar 6 poin persentase.
ggplot(data_rs, aes(x = tanggal, y = keterisian)) +
geom_col(
fill = "#0072B2",
width = 0.6
) +
geom_text(
aes(label = paste0(keterisian, "%")),
vjust = -0.6,
size = 5,
fontface = "bold"
) +
scale_y_continuous(
limits = c(0, 100),
breaks = seq(0, 100, 20),
labels = function(x) paste0(x, "%"),
expand = expansion(mult = c(0, 0.02))
) +
labs(
title = "Tingkat Keterisian Tempat Tidur RS di DKI Jakarta",
subtitle = "Perbandingan keterisian harian, 29 Januari–1 Februari",
x = NULL,
y = "Keterisian tempat tidur (%)",
caption = "Sumber: Dinas Kesehatan DKI Jakarta"
) +
theme_minimal(base_size = 13) +
theme(
plot.title = element_text(face = "bold", size = 15),
panel.grid.minor = element_blank(),
panel.grid.major.x = element_blank(),
plot.caption = element_text(hjust = 0)
)Alasan perbaikan: Perbedaan nilai lebih mudah dibandingkan melalui panjang batang pada sumbu yang sama daripada melalui sudut atau luas irisan pie chart.
Perbaikan yang dilakukan: Menggunakan batang dengan sumbu dimulai dari nol, mempertahankan urutan tanggal, dan menambahkan label persentase. Warna yang seragam menjaga fokus pada perbedaan tinggi batang.
Interpretasi: Keterisian tertinggi terjadi pada 1 Februari sebesar 60%, sedangkan terendah pada 29 Januari sebesar 54%. Pada 30 dan 31 Januari, keterisian sama-sama sebesar 57%.
Pie chart tetap sesuai untuk komposisi ini. Perbaikan utama adalah warna dan label. Diagram batang disertakan sebagai alternatif pembandingan, bukan karena pie chart selalu salah. Klaim mengenai alasan memilih M-Banking tidak dapat disimpulkan dari proporsi saja.
library(ggplot2)
data_bayar <- data.frame(
metode = factor(
c("M-Banking", "COD", "Paylater/Cicilan", "Lainnya"),
levels = c("M-Banking", "COD", "Paylater/Cicilan", "Lainnya")
),
persentase = c(64, 20, 2, 14)
)
# Posisi tengah setiap irisan
data_bayar$posisi <- cumsum(data_bayar$persentase) -
data_bayar$persentase / 2
ggplot(
data_bayar,
aes(x = 1, y = persentase, fill = metode)
) +
geom_col(
width = 1,
color = "white",
linewidth = 1,
position = position_stack(reverse = TRUE)
) +
# Garis penghubung menuju label
geom_segment(
aes(
x = 1.5, xend = 1.65,
y = posisi, yend = posisi
),
inherit.aes = FALSE,
color = "#777777",
linewidth = 0.5
) +
# Nama kategori dan persen di luar pie
geom_text(
aes(
x = 1.9,
y = posisi,
label = paste0(metode, "\n", persentase, "%")
),
inherit.aes = FALSE,
size = 4.5,
fontface = "bold",
lineheight = 0.95,
color = "#222222"
) +
coord_polar(theta = "y", clip = "off") +
scale_x_continuous(limits = c(0.5, 2.4)) +
scale_y_continuous(
limits = c(0, 100),
expand = c(0, 0)
) +
scale_fill_manual(
values = c(
"M-Banking" = "#0072B2",
"COD" = "#E69F00",
"Paylater/Cicilan" = "#009E73",
"Lainnya" = "#CC79A7"
),
guide = "none"
) +
labs(
title = "Pilihan Metode Pembayaran",
subtitle = "Persentase menurut metode pembayaran"
) +
theme_void(base_size = 13) +
theme(
plot.title = element_text(
face = "bold", size = 18, hjust = 0.5
),
plot.subtitle = element_text(
color = "#555555", hjust = 0.5,
margin = margin(t = 5, b = 15)
),
plot.margin = margin(20, 35, 20, 35),
plot.background = element_rect(
fill = "white", color = NA
)
)Alasan perbaikan:
Warna kategori perlu mudah dibedakan. Label pada irisan kecil juga membutuhkan ruang agar dapat dibaca dengan jelas.
Perbaikan yang dilakukan:
Mempertahankan pie chart, menggunakan warna yang berbeda antarkategori, memberi batas putih antaririsan, serta menempatkan nama kategori dan persentase di luar lingkaran dengan garis penghubung.
Interpretasi:
M-Banking mendominasi pilihan pembayaran sebesar 64%, diikuti COD 20%, Paylater/Cicilan 2%, dan lainnya 14%.
library(ggplot2)
# Data pilihan metode pembayaran
data_bayar <- data.frame(
metode = c("M-Banking", "COD", "Paylater/Cicilan", "Lainnya"),
persentase = c(64, 20, 2, 14)
)
# Mengurutkan kategori berdasarkan persentase
data_bayar$metode <- with(
data_bayar,
reorder(metode, persentase)
)
# Membuat diagram batang horizontal
ggplot(
data_bayar,
aes(
x = persentase,
y = metode,
fill = metode == "M-Banking"
)
) +
geom_col(width = 0.6) +
geom_text(
aes(label = paste0(persentase, "%")),
hjust = -0.25,
size = 5,
fontface = "bold",
color = "#222222"
) +
scale_fill_manual(
values = c(
"TRUE" = "#0072B2",
"FALSE" = "#BDBDBD"
),
guide = "none"
) +
scale_x_continuous(
limits = c(0, 100),
breaks = seq(0, 100, 20),
labels = function(x) paste0(x, "%"),
expand = expansion(mult = c(0, 0.02))
) +
labs(
title = "Pilihan Metode Pembayaran",
subtitle = "M-Banking menjadi pilihan utama dengan persentase 64%",
x = "Persentase",
y = NULL
) +
theme_minimal(base_size = 13) +
theme(
plot.title = element_text(
face = "bold",
size = 18,
color = "#222222"
),
plot.subtitle = element_text(
color = "#555555",
margin = margin(b = 15)
),
axis.text.y = element_text(
size = 12,
color = "#222222"
),
panel.grid.major.y = element_blank(),
panel.grid.minor = element_blank(),
panel.grid.major.x = element_line(color = "#EAEAEA"),
plot.margin = margin(15, 20, 15, 15)
)Alasan perbaikan:
Diagram batang memudahkan pembaca membandingkan nilai, terutama kategori dengan persentase kecil. Pie chart sebenarnya dapat digunakan karena data membentuk satu total 100%, tetapi perbandingan antarkategori lebih jelas melalui panjang batang.
Perbaikan yang dilakukan:
Mengganti pie chart menjadi diagram batang horizontal, mengurutkan kategori dari terbesar ke terkecil, serta menampilkan persentase langsung pada batang. Warna biru menonjolkan M-Banking, sementara kategori lainnya menggunakan abu-abu.
Interpretasi:
M-Banking menjadi pilihan utama sebesar 64%, diikuti COD 20%, Paylater/Cicilan 2%, dan metode lainnya 14%. Persentase M-Banking melampaui gabungan seluruh metode lainnya yang sebesar 36%.
library(ggplot2)
# 1. Simulasi data kasus harian
set.seed(123)
tanggal <- seq(
as.Date("2020-01-01"),
as.Date("2020-10-31"),
by = "day"
)
n <- length(tanggal)
# Pola dasar kasus
pola <- approx(
x = c(1, 40, 70, 100, 130, 160, 190, 220, 250, 280, n),
y = c(
200, 1000, 15000, 75000, 85000, 120000,
200000, 270000, 260000, 310000, 400000
),
xout = seq_len(n)
)$y
# Fluktuasi mingguan dan variasi acak
kasus <- round(
pmax(
0,
pola * (
1 +
0.14 * sin(2 * pi * seq_len(n) / 7) +
rnorm(n, mean = 0, sd = 0.07)
)
)
)
data_kasus <- data.frame(
tanggal = tanggal,
kasus = kasus
)
# 2. Moving average berdasarkan hari ini dan hari sebelumnya
data_kasus$ma3 <- as.numeric(
stats::filter(
data_kasus$kasus,
filter = rep(1 / 3, 3),
sides = 1
)
)
data_kasus$ma7 <- as.numeric(
stats::filter(
data_kasus$kasus,
filter = rep(1 / 7, 7),
sides = 1
)
)
# 3. Membuat grafik seperti contoh
ggplot(data_kasus, aes(x = tanggal)) +
# Batang kasus harian sebagai latar
geom_col(
aes(y = kasus, fill = "Daily Cases"),
width = 0.85
) +
# Garis rata-rata bergerak 3 hari
geom_line(
aes(y = ma3, color = "3-day moving average"),
linewidth = 0.8,
na.rm = TRUE
) +
# Garis rata-rata bergerak 7 hari
geom_line(
aes(y = ma7, color = "7-day moving average"),
linewidth = 1.2,
na.rm = TRUE
) +
scale_fill_manual(
name = NULL,
values = c("Daily Cases" = "#D0D0D0")
) +
scale_color_manual(
name = NULL,
breaks = c(
"3-day moving average",
"7-day moving average"
),
values = c(
"3-day moving average" = "#D55E00",
"7-day moving average" = "#0072B2"
)
) +
scale_x_date(
date_breaks = "1 month",
date_labels = "%d %b",
expand = expansion(mult = c(0.005, 0.005))
) +
scale_y_continuous(
breaks = seq(0, 500000, 100000),
labels = function(x) {
ifelse(x == 0, "0", paste0(x / 1000, "k"))
},
expand = expansion(mult = c(0, 0.05))
) +
labs(
title = "Noise vs Signal",
subtitle = paste(
"Novel Coronavirus Daily Cases",
"Daily New Cases",
"Cases per Day | Simulated data",
sep = "\n"
),
x = NULL,
y = NULL,
caption = "Data simulasi untuk latihan visualisasi"
) +
theme_minimal(base_size = 12) +
theme(
plot.title = element_text(
size = 22,
face = "bold",
hjust = 0
),
plot.subtitle = element_text(
size = 12,
lineheight = 1.3,
color = "#444444",
margin = margin(t = 8, b = 15)
),
axis.text.x = element_text(
angle = 45,
hjust = 1,
color = "#555555"
),
axis.text.y = element_text(color = "#555555"),
panel.grid.major.x = element_blank(),
panel.grid.minor = element_blank(),
panel.grid.major.y = element_line(
color = "#E5E5E5",
linewidth = 0.4
),
legend.position = "bottom",
legend.box = "horizontal",
legend.text = element_text(size = 10),
plot.caption = element_text(
hjust = 0,
color = "#777777"
),
plot.background = element_rect(
fill = "white",
color = NA
),
plot.margin = margin(15, 20, 15, 15)
)Alasan perbaikan:
Batang dan garis yang berdekatan memerlukan warna berbeda agar fluktuasi kasus harian dan pola rata-ratanya mudah dibedakan.
Perbaikan yang dilakukan:
Batang harian menggunakan abu-abu agar tidak mendominasi. Moving average 3 hari menggunakan oranye tua, sedangkan moving average 7 hari menggunakan biru dengan garis lebih tebal untuk menonjolkan pola yang lebih halus.
Interpretasi:
Pada data simulasi, kasus harian berfluktuasi dengan kecenderungan meningkat. Moving average 3 hari lebih cepat mengikuti perubahan harian, sedangkan moving average 7 hari meredam fluktuasi sehingga kecenderungan perubahan lebih mudah terlihat.
Moving average menggunakan jendela ke belakang, termasuk hari berjalan. Dua nilai pertama MA-3 dan enam nilai pertama MA-7 tidak tersedia karena jendela belum lengkap; nilai tersebut tidak diisi nol.
# Jalankan sekali jika paket belum terpasang
# install.packages(c("sf", "geodata", "ggplot2"))
library(sf)dir.create("cache_peta", showWarnings = FALSE)
library(ggplot2)
# 1. Mengunduh batas provinsi
# Menggunakan versi batas lama untuk contoh peta
provinsi <- geodata::gadm(
country = "IDN",
level = 1,
version = "3.6",
path = "cache_peta"
)peta_prov <- st_as_sf(provinsi)
# 2. Simulasi persentase kemiskinan
set.seed(123)
peta_prov$kemiskinan <- round(
runif(nrow(peta_prov), min = 4, max = 28),
digits = 1
)
# 3. Membuat peta dengan warna berurutan
ggplot(peta_prov) +
geom_sf(
aes(fill = kemiskinan),
color = "white",
linewidth = 0.25
) +
scale_fill_gradient(
low = "#DEEBF7",
high = "#08519C",
limits = c(0, 30),
breaks = seq(0, 30, 5),
labels = function(x) paste0(x, "%"),
name = "Persentase kemiskinan",
na.value = "#D9D9D9",
guide = guide_colorbar(
direction = "horizontal",
title.position = "top",
title.hjust = 0.5,
barwidth = grid::unit(10, "cm"),
barheight = grid::unit(0.4, "cm")
)
) +
coord_sf(
datum = NA,
expand = FALSE
) +
labs(
title = "Persentase Kemiskinan Menurut Provinsi",
subtitle = "Semakin gelap warna, semakin tinggi persentase kemiskinan",
caption = paste(
"Data kemiskinan: simulasi untuk latihan",
"Batas wilayah: GADM",
sep = " | "
)
) +
theme_void(base_size = 13) +
theme(
plot.title = element_text(
face = "bold",
size = 18,
hjust = 0.5
),
plot.subtitle = element_text(
size = 11,
color = "#555555",
hjust = 0.5,
margin = margin(t = 6, b = 15)
),
legend.position = "bottom",
legend.title = element_text(size = 11),
legend.text = element_text(size = 10),
plot.caption = element_text(
size = 9,
color = "#666666",
hjust = 0
),
plot.background = element_rect(
fill = "white",
color = NA
),
plot.margin = margin(15, 20, 15, 20)
)Alasan perbaikan: prinsip gradasi pada peta asli sudah tepat, tetapi rentang warna pucat dan legenda kecil membatasi keterbacaan.
Perbaikan yang dilakukan: memperlebar kontras biru muda–tua, memperjelas legenda persen, serta menambahkan batas provinsi tipis. Data simulasi memakai batas GADM versi lama; tidak digunakan untuk membuat klaim wilayah administratif terkini.
Interpretasi: semakin gelap warna provinsi, semakin tinggi persentase kemiskinan simulasi. Luas wilayah bukan jumlah penduduk miskin. Peta tidak membuktikan adanya autokorelasi spasial, dan angka simulasi tidak mewakili kondisi resmi tahun 2020.
Slide 8–9 sebenarnya sudah mengajarkan perbaikan orientasi dan urutan. Bagian ini menerapkan prinsip tersebut lebih lanjut dengan label nilai; tidak menyatakan seluruh contoh dosen salah.
nama <- 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")
set.seed(918)
komputer <- data.frame(provinsi=nama, persen=round(runif(34, 4, 24), 1))
ggplot(komputer, aes(persen, reorder(provinsi, persen))) +
geom_col(fill="#147D92", width=.7) +
geom_text(aes(label=paste0(persen,"%")), hjust=-.15, size=3.3) +
scale_x_continuous(limits=c(0,28), breaks=seq(0,25,5),
labels=function(x) paste0(x,"%"), expand=c(0,0)) +
labs(title="Penggunaan komputer menurut provinsi",
subtitle="Urutan menurun • data simulasi, bukan angka BPS 2019",
x="Persentase", y=NULL, caption="Simulasi dengan seed 918") +
theme(panel.grid.major.y=element_blank(), panel.grid.minor=element_blank())Alasan perbaikan: label provinsi yang panjang sulit dibaca ketika diputar vertikal. Urutan geografis tidak langsung menunjukkan peringkat jika tujuan pembaca adalah membandingkan nilai.
Perbaikan yang dilakukan: menggunakan batang horizontal, mengurutkan berdasarkan persentase, menyediakan tinggi gambar yang cukup untuk 34 label, dan menambahkan nilai langsung. Sumbu batang dimulai dari nol.
Interpretasi: dalam simulasi ini, persentase tertinggi terdapat di Kep. Bangka Belitung sebesar 23.5%, sedangkan terendah di Kalimantan Timur sebesar 4.1%. Peringkat ini hanya hasil simulasi.