Penyajian data merupakan bentuk pengemasan suatu data secara visual sedemikian sehingga data lebih mudah dipahami. Penyajian data bisa dilakukan dalam bentuk tabel, diagram, maupun grafik.
Penyajian data yang baik:
ggplot2 adalah salah satu paket visualisasi data paling
populer di R karena fleksibilitas dan kemampuannya untuk membuat grafik
yang sangat menarik dan informatif. Paket ini didasarkan pada konsep
Grammar of Graphics yang memungkinkan kita untuk
membangun plot dengan menambahkan layer secara bertahap.
Struktur ggplot2
ggplot(data, aes()): Fungsi dasar untuk memulai plot.
Anda menentukan dataset dan mapping estetika (aes) seperti sumbu X dan
Y.geom_*: Fungsi untuk menambahkan layer tipe plot,
seperti geom_point() untuk scatter plot,
geom_bar() untuk bar plot, geom_line() untuk
line plot, dan sebagainya.labs(), theme(), scale_*:
Fungsi tambahan untuk menyesuaikan label, tema, dan skala pada
plot.Silahkan buka pembelajaran saya yang ini dimana di bagian akhir, ada implementasi dataset yang digunakan, yaitu data keuangan.
# Membuat data yang lebih besar dengan memperbanyak jumlah satker, kegiatan, dan akun
set.seed(123) # Untuk menghasilkan data acak yang konsisten
# Contoh data
data_keuangan <- data.frame(
nama_satker = rep(paste("Satker", LETTERS[1:10]), each = 10),
nama_kegiatan = rep(paste("Kegiatan", 1:10), times = 10),
nama_akun = rep(paste("Akun", 1:5), times = 20),
target = sample(100:500, 100, replace = TRUE)
)
data_keuangan$realisasi = data_keuangan$target - sample(-50:50, 100, replace = TRUE)
data_keuangan$persentase_realisasi = (data_keuangan$realisasi / data_keuangan$target) * 100
head(data_keuangan)
## nama_satker nama_kegiatan nama_akun target realisasi persentase_realisasi
## 1 Satker A Kegiatan 1 Akun 1 278 321 115.46763
## 2 Satker A Kegiatan 2 Akun 2 113 113 100.00000
## 3 Satker A Kegiatan 3 Akun 3 294 271 92.17687
## 4 Satker A Kegiatan 4 Akun 4 405 406 100.24691
## 5 Satker A Kegiatan 5 Akun 5 217 170 78.34101
## 6 Satker A Kegiatan 6 Akun 1 398 375 94.22111
# Menghitung data tambahan yang diperlukan
agg_data <- aggregate(cbind(target, realisasi) ~ nama_satker, data = data_keuangan, sum)
agg_data_kegiatan <- aggregate(realisasi ~ nama_kegiatan, data = data_keuangan, sum) # Agregasi per kegiatan
agg_data$selisih <- agg_data$target - agg_data$realisasi
library(ggplot2)
# Membuat scatter plot dengan ggplot2
scatter_plot = ggplot(data_keuangan, aes(x = target, y = realisasi)) +
geom_point(color = "blue", size = 3) +
labs(title = "Scatter Plot Target vs Realisasi",
x = "Target (Juta)",
y = "Realisasi (Juta)") +
theme_minimal()
scatter_plot
Sekarang kita akan membuat bar plot yang menampilkan total realisasi per kegiatan.
# Membuat bar plot dengan ggplot2
bar_plot = ggplot(agg_data_kegiatan, aes(x = nama_kegiatan, y = realisasi)) +
geom_bar(stat = "identity", fill = "darkgreen") +
labs(title = "Total Realisasi per Kegiatan",
x = "Nama Kegiatan",
y = "Total Realisasi (Juta)") +
theme_minimal() +
theme(axis.text.x = element_text(angle = 45, hjust = 1))
bar_plot
Mari kita buat boxplot untuk melihat distribusi realisasi per akun.
# Membuat boxplot dengan ggplot2
box_plot = ggplot(data_keuangan, aes(x = nama_akun, y = realisasi)) +
geom_boxplot(fill = "skyblue") +
labs(title = "Distribusi Realisasi per Akun",
x = "Nama Akun",
y = "Realisasi (Juta)") +
theme_minimal()
box_plot
# Membuat bar plot horizontal dengan ggplot2
bar_plot_horiz = ggplot(agg_data, aes(x = selisih, y = reorder(nama_satker, selisih))) +
geom_bar(stat = "identity", fill = "purple") +
labs(title = "Selisih Target vs Realisasi per Satker",
x = "Selisih (Juta)",
y = "Nama Satker") +
theme_minimal()
bar_plot_horiz
Seperti pada latihan sebelumnya, bahwa dengan par() atau
layout() kita bisa menggabungkan keempat grafik tersebut ke
dalam satu tempat. Pada sesi kali ini kita bisa memanfaatkan library
lain, seperti patchwork yang memungkinkan Anda untuk
menggabungkan beberapa plot ggplot2 dengan mudah. Cukup gunakan operator
+ untuk menggabungkan plot.
library(patchwork)
# Menggabungkan beberapa plot
scatter_plot + bar_plot + box_plot + bar_plot_horiz
Jika dilihat dan dibandingkan dengan penggunaan plot()
sebelumnya, tampilannya lebih tertata rapih untuk penggunaan
ggplot2.
ggplot2Faceting memungkinkan untuk memecah data menjadi subset dan membuat plot terpisah untuk setiap subset dalam satu tampilan. Ini sangat berguna untuk membandingkan beberapa kategori. Dengan faceting, dapat membantu melihat pola atau hubungan dalam data yang berbeda-beda untuk setiap kategori.
Contoh: Memecah scatter plot berdasarkan nama_akun menggunakan
facet_wrap().
faceting_plot <- ggplot(data_keuangan, aes(x = target, y = realisasi)) +
geom_point(color = "blue", size = 3) +
labs(title = "Target vs Realisasi per Akun",
x = "Target (Juta)",
y = "Realisasi (Juta)") +
facet_wrap(~nama_akun) +
theme_minimal()
faceting_plot
Selain facet_wrap, kita dapat menggunakan
facet_grid untuk memfasilitasi pemecahan plot berdasarkan
dua variabel (satu di sumbu X dan satu di sumbu Y).
facetgrid_plot <- ggplot(data_keuangan, aes(x = target, y = realisasi)) +
geom_point(color = "darkred", size = 2) +
labs(title = "Target vs Realisasi per Akun dan Satker",
x = "Target (Juta)",
y = "Realisasi (Juta)") +
facet_grid(nama_satker ~ nama_akun) +
theme_minimal()
facetgrid_plot
Kita dapat membuat tampilan plot lebih konsisten dengan tema khusus
yang disesuaikan dengan gaya atau kebutuhan tertentu.
ggplot2 memungkinkan Anda untuk membuat custom themes.
Contoh: Menggunakan theme_classic() dan menyesuaikan
beberapa elemen. theme_classic() merupakan tema klasik yang
sederhana dan bersih.
custom_plot <- ggplot(agg_data_kegiatan, aes(x = reorder(nama_kegiatan, realisasi), y = realisasi)) +
geom_bar(stat = "identity", fill = "darkgreen") +
labs(title = "Total Realisasi per Kegiatan",
x = "Nama Kegiatan",
y = "Total Realisasi (Juta)") +
theme_classic() +
theme(axis.text.x = element_text(angle = 45, hjust = 1),
plot.title = element_text(hjust = 0.5, size = 16, face = "bold"),
axis.title.x = element_text(size = 12, face = "bold"),
axis.title.y = element_text(size = 12, face = "bold"))
custom_plot
Dengan theme(), kita bisa menyesuaikan hampir setiap
aspek dari plot ggplot2, termasuk elemen-elemen yang
mungkin jarang digunakan.
Contoh: Menyesuaikan elemen tema secara mendetail.
theme_plot <- ggplot(agg_data_kegiatan, aes(x = reorder(nama_kegiatan, realisasi), y = realisasi)) +
geom_bar(stat = "identity", fill = "darkorange") +
labs(title = "Realisasi per Kegiatan",
x = "Nama Kegiatan",
y = "Realisasi (Juta)") +
theme_minimal() +
theme(plot.background = element_rect(fill = "lightyellow"),
panel.grid.major = element_line(color = "gray80"),
panel.grid.minor = element_line(color = "gray90"),
axis.text.x = element_text(color = "blue", angle = 45, hjust = 1),
axis.text.y = element_text(color = "red"),
plot.title = element_text(hjust = 0.5, color = "darkgreen"))
theme_plot
ggplot2 memungkinkan kita untuk mengubah warna pada plot
berdasarkan data, baik menggunakan skala warna kontinu maupun diskret.
Warna dapat membantu untuk memvisualisasikan intensitas atau ukuran
nilai dengan lebih efektif.
Contoh: Menggunakan scale_fill_gradient() untuk bar
plot.
color_plot <- ggplot(data_keuangan, aes(x = nama_kegiatan, y = nama_satker, fill = persentase_realisasi)) +
geom_tile(color = "white") +
scale_fill_gradient(low = "lightblue", high = "darkblue") +
labs(title = "Heatmap Persentase Realisasi per Satker dan Kegiatan",
x = "Nama Kegiatan",
y = "Nama Satker",
fill = "Persentase Realisasi") +
theme_minimal()
color_plot
bubble_plot <- ggplot(data_keuangan, aes(x = nama_satker, y = realisasi, size = target, fill = realisasi)) +
geom_point(shape = 21, color = "black", alpha = 0.7) +
scale_size(range = c(3, 10)) +
scale_fill_gradient(low = "lightgreen", high = "darkgreen") +
labs(title = "Bubble Chart Realisasi per Satker",
x = "Nama Satker",
y = "Realisasi (Juta)",
size = "Target (Juta)",
fill = "Realisasi (Juta)") +
theme_minimal()
bubble_plot
Annotations sangat berguna untuk menyoroti informasi penting langsung di dalam plot, seperti menambahkan teks atau garis referensi.
Contoh: Menambahkan garis referensi dan anotasi teks pada scatter plot.
annotation_plot <- ggplot(data_keuangan, aes(x = target, y = realisasi)) +
geom_point(color = "blue", size = 3) +
geom_smooth(method = "lm", color = "red", linetype = "dashed") + # Menambahkan garis regresi
geom_hline(yintercept = mean(data_keuangan$realisasi), color = "green", linetype = "dotted") + # Garis referensi
annotate("text", x = 300, y = max(data_keuangan$realisasi), label = "Max Realisasi", color = "red", size = 5, hjust = 0) + # Anotasi teks
labs(title = "Target vs Realisasi dengan Anotasi",
x = "Target (Juta)",
y = "Realisasi (Juta)") +
theme_minimal()
annotation_plot
## `geom_smooth()` using formula = 'y ~ x'
geom_smooth adalah cara untuk menambahkan garis tren
atau fit model pada data, dengan opsi untuk menampilkan interval
kepercayaan.
Contoh: Menambahkan garis regresi dengan interval kepercayaan pada scatter plot.
smooth_plot <- ggplot(data_keuangan, aes(x = target, y = realisasi)) +
geom_point(color = "darkblue", size = 3) +
geom_smooth(method = "lm", se = TRUE, color = "red", linetype = "dashed") + # Garis tren dengan interval kepercayaan
labs(title = "Target vs Realisasi dengan Garis Tren",
x = "Target (Juta)",
y = "Realisasi (Juta)") +
theme_minimal()
smooth_plot
## `geom_smooth()` using formula = 'y ~ x'
patchwork or
cowplotUntuk menyusun beberapa plot dalam satu tampilan,
patchwork atau cowplot adalah paket yang
sangat berguna.
Contoh: Menggabungkan beberapa plot dengan
patchwork.
library(patchwork)
scatter_plot <- ggplot(data_keuangan, aes(x = target, y = realisasi)) +
geom_point(color = "blue", size = 3) +
labs(title = "Scatter Plot",
x = "Target (Juta)",
y = "Realisasi (Juta)") +
theme_minimal()
bar_plot <- ggplot(agg_data_kegiatan, aes(x = reorder(nama_kegiatan, realisasi), y = realisasi)) +
geom_bar(stat = "identity", fill = "darkgreen") +
labs(title = "Bar Plot",
x = "Nama Kegiatan",
y = "Realisasi (Juta)") +
theme_minimal()
box_plot <- ggplot(data_keuangan, aes(x = nama_akun, y = realisasi)) +
geom_boxplot(fill = "lightblue") +
labs(title = "Box Plot",
x = "Nama Akun",
y = "Realisasi (Juta)") +
theme_minimal()
# Menggabungkan plot dengan patchwork
combined_plot <- scatter_plot + bar_plot + box_plot + plot_layout(ncol = 1)
combined_plot
coord_flip untuk Membalik Sumbu X dan
YContoh: Membalik plot bar horizontal.
flip_plot <- ggplot(agg_data, aes(x = reorder(nama_satker, selisih), y = selisih, fill = selisih)) +
geom_bar(stat = "identity") +
labs(title = "Selisih Target vs Realisasi per Satker",
x = "Nama Satker",
y = "Selisih (Juta)") +
coord_flip() + # Membalik sumbu X dan Y
theme_minimal()
flip_plot
geom_text untuk Menambahkan Label pada
PlotKita bisa menambahkan label teks pada titik data untuk memberikan informasi tambahan.
Contoh: Menambahkan label pada titik dalam scatter plot.
label_plot <- # Membuat heatmap dengan label
ggplot(data_keuangan, aes(x = nama_kegiatan, y = nama_satker, fill = persentase_realisasi)) +
geom_tile(color = "white") +
geom_text(aes(label = paste0(round(persentase_realisasi, 1), "%")), color = "white", size = 3) + # Menambahkan persentase realisasi
scale_fill_gradient(low = "lightblue", high = "darkblue") +
labs(title = "Heatmap Persentase Realisasi dengan Label",
x = "Nama Kegiatan",
y = "Nama Satker",
fill = "Persentase Realisasi") +
theme_minimal()
label_plot
Kita bisa mengontrol bagaimana legenda ditampilkan, termasuk posisinya, judulnya, dan elemen lain yang terkait.
Contoh: Mengatur legenda di dalam plot.
legend_plot <- ggplot(data_keuangan, aes(x = target, y = realisasi, color = nama_akun)) +
geom_point(size = 3) +
labs(title = "Target vs Realisasi dengan Legenda",
x = "Target (Juta)",
y = "Realisasi (Juta)") +
theme_minimal() +
theme(legend.position = "bottom", # Posisi legenda di bawah plot
legend.title = element_text(face = "bold"),
legend.background = element_rect(fill = "lightgray", color = "black", size = 0.5),
legend.key = element_rect(fill = "white", color = "gray80"))
## Warning: The `size` argument of `element_rect()` is deprecated as of ggplot2 3.4.0.
## ℹ Please use the `linewidth` argument instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.
legend_plot
geom_violin untuk Menampilkan Distribusi
Datageom_violin() adalah alternatif visualisasi yang
menggabungkan boxplot dan density plot, memberikan gambaran distribusi
yang lebih rinci.
Contoh: Menggunakan geom_violin untuk distribusi
realisasi per akun.
violin_plot <- ggplot(data_keuangan, aes(x = nama_akun, y = realisasi, fill = nama_akun)) +
geom_violin() +
labs(title = "Distribusi Realisasi per Akun dengan Violin Plot",
x = "Nama Akun",
y = "Realisasi (Juta)") +
theme_minimal()
violin_plot
RColorBrewerKita bisa menggunakan palet warna dari RColorBrewer untuk membuat grafik lebih menarik secara visual, terutama ketika kita bekerja dengan banyak kategori.
Contoh: Menggunakan palet Set1 untuk bar plot.
library(RColorBrewer)
palet_plot <- ggplot(agg_data_kegiatan, aes(x = reorder(nama_kegiatan, realisasi), y = realisasi, fill = nama_kegiatan)) +
geom_bar(stat = "identity") +
scale_fill_brewer(palette = "Spectral") + # Menggunakan palet warna dari RColorBrewer
labs(title = "Total Realisasi per Kegiatan",
x = "Nama Kegiatan",
y = "Realisasi (Juta)") +
theme_minimal() +
theme(axis.text.x = element_text(angle = 45, hjust = 1))
palet_plot
Sankey diagram adalah jenis diagram alir yang digunakan untuk menggambarkan bagaimana sesuatu (seperti uang, energi, atau sumber daya lainnya) mengalir dari satu titik ke titik lainnya. Ini sangat berguna untuk menunjukkan aliran dalam sistem yang kompleks dan bisa menjadi cara yang sangat efektif untuk memvisualisasikan data keuangan atau aliran lainnya.
Meskipun ggplot2 tidak mendukung Sankey diagram secara
langsung, ada beberapa paket di R yang memungkinkan Anda untuk membuat
Sankey diagram dengan mudah. Salah satu paket yang populer untuk ini
adalah networkD3 dan ggalluvial.
# Menggabungkan data untuk membentuk aliran dari Satker ke Kegiatan dan Kegiatan ke Akun
links <- data.frame(
source = c(rep(data_keuangan$nama_satker, each = 1), rep(data_keuangan$nama_kegiatan, each = 1)),
target = c(data_keuangan$nama_kegiatan, data_keuangan$nama_akun),
value = c(data_keuangan$target / 2, data_keuangan$realisasi / 2)
)
# Menggabungkan semua node ke dalam satu data frame unik
nodes <- data.frame(name = unique(c(links$source, links$target)))
# Mengonversi nama ke indeks untuk digunakan di Sankey diagram
links$source <- match(links$source, nodes$name) - 1
links$target <- match(links$target, nodes$name) - 1
library(networkD3)
# Menentukan warna untuk setiap node berdasarkan kelompok
nodes$group <- as.factor(c(rep("Satker", 10), rep("Kegiatan", 10), rep("Akun", 5)))
# Membuat Sankey diagram
# Menambahkan warna pada Sankey diagram
sankeyNetwork(Links = links, Nodes = nodes, Source = "source", Target = "target", Value = "value", NodeID = "name", units = "Juta", fontSize = 12, nodeWidth = 30, colourScale = JS("d3.scaleOrdinal(d3.schemeCategory10);"))
Chord Diagram adalah jenis visualisasi yang menampilkan hubungan atau
aliran antar kategori dengan menggunakan busur melingkar yang terhubung.
Ini sangat berguna untuk menunjukkan hubungan antar berbagai entitas,
seperti dalam kasus data keuangan untuk menunjukkan aliran dana antara
nama_satker, nama_kegiatan, dan
nama_akun.
Untuk membuat Chord Diagram, kita akan menggunakan paket
circlize di R.
library(circlize)
## ========================================
## circlize version 0.4.16
## CRAN page: https://cran.r-project.org/package=circlize
## Github page: https://github.com/jokergoo/circlize
## Documentation: https://jokergoo.github.io/circlize_book/book/
##
## If you use it in published research, please cite:
## Gu, Z. circlize implements and enhances circular visualization
## in R. Bioinformatics 2014.
##
## This message can be suppressed by:
## suppressPackageStartupMessages(library(circlize))
## ========================================
# Menggabungkan data untuk membentuk matriks relasi antara Satker dan Kegiatan
matriks_chord <- xtabs(target ~ nama_satker + nama_kegiatan, data = data_keuangan)
# Menghitung jumlah sektor
sectors <- rownames(matriks_chord)
sectors <- unique(c(rownames(matriks_chord), colnames(matriks_chord)))
# Menetapkan warna dengan nama sektor
sector_colors <- setNames(rainbow(length(sectors)), sectors)
# Membuat Chord Diagram dengan warna khusus
chordDiagram(matriks_chord, transparency = 0.4, grid.col = sector_colors, annotationTrack = "grid", preAllocateTracks = 1)
# Menambahkan label pada sektor
circos.trackPlotRegion(track.index = 1, panel.fun = function(x, y) {
sector.name = get.cell.meta.data("sector.index")
circos.text(CELL_META$xcenter, CELL_META$ylim[1], sector.name, facing = "clockwise", niceFacing = TRUE, adj = c(0, 0.5))
}, bg.border = NA)
Untuk menyimpan hasil visualisasi ke file, kita bisa menggunakan
ggsave(). Kita bisa menentukan ukuran output dengan
parameter width dan height.
ggsave("palet_plot.png", palet_plot, width = 10, height = 15)