Pendahuluan

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

Contoh 1: Scatter plot sederhana

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

Contoh 2: Bar Plot untuk Perbandingan

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

Contoh 3: Boxplot untuk Distribusi

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

Contoh 4: Bar Plot Horizontal

# 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.

Fitur Lanjutan ggplot2

1. Faceting: Membuat Subplots Berdasarkan Kategori

Faceting 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

2. Custom Themes: Mengkustomisasi Tampilan 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

3. Color Scales: Mengatur Warna Berdasarkan Data

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

4. Annotations: Menambahkan Teks dan Garis pada 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'

5. Plot Kombinasi dengan patchwork or cowplot

Untuk 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

6. Penggunaan coord_flip untuk Membalik Sumbu X dan Y

Contoh: 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

7. Menggunakan geom_text untuk Menambahkan Label pada Plot

Kita 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

8. Kustomisasi Legends

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

9. Menggunakan geom_violin untuk Menampilkan Distribusi Data

geom_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

10. Menggunakan Palet Warna RColorBrewer

Kita 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

11. Sankey Diagram

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);"))

12. Chord Diagram

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)

13. Menyimpan Plots: Menyimpan Hasil Visualisasi

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)