Cara mudah membuat plot relief di r menggunakan ggplot2


Bagan tambahan adalah jenis bagan yang menunjukkan peringkat kelompok yang berbeda dari waktu ke waktu, bukan nilai absolut, untuk menekankan urutan kelompok, bukan jumlah perubahannya.

Tutorial ini menjelaskan cara mudah membuat bump plot di R menggunakan ggplot2.

Contoh: membuat grafik relief

Untuk membuat diagram bump di R, pertama-tama kita perlu memuat dua paket: dplyr dan ggplot2 :

 library(ggplot2) #for creating bump chart
library(dplyr) #for manipulating data

Selanjutnya, kita akan membuat beberapa data untuk digunakan:

 #set the seed to make this example reproducible
set.seed(10)

data <- data.frame(team = rep(LETTERS[1:5], each = 10),
                   random_num = runif(50),
                   day = rep(1:10, 5))

data <- data %>%
  group_by(day) %>%
  arrange(day, desc(random_num), team) %>% 
  mutate(rank = row_number()) %>%
  A group()

head(data)

# team random_num day rank          
#1 C 0.865 1 1
#2 B 0.652 1 2
#3 D 0.536 1 3
#4 A 0.507 1 4
#5 E 0.275 1 5
#6 C 0.615 2 1

Basis data ini hanya menampilkan “peringkat” lima tim berbeda selama periode 10 hari.

Kita dapat menggunakan ggplot2 untuk membuat bagan kemajuan guna memvisualisasikan peringkat setiap tim setiap hari selama periode ini:

 ggplot(data, aes(x = day, y = rank, group = team)) +
  geom_line(aes(color = team, alpha = 1), size = 2) +
  geom_point(aes(color = team, alpha = 1), size = 4) +
  scale_y_reverse(breaks = 1:nrow(data))

Bagan tambahan ini menampilkan data dalam format yang Anda inginkan, tetapi cukup jelek. Dengan sedikit perubahan estetika kita bisa membuat lukisan ini menjadi lebih baik.

Sesuaikan gaya grafis benjolan

Untuk menyempurnakan tampilan grafik, kita dapat menggunakan tema berikut yang dibuat oleh Dominik Koch :

 my_theme <- function() {

  # Colors
  color.background = "white"
  color.text = "#22211d"

  # Begin construction of chart
  theme_bw(base_size=15) +

    # Format background colors
    theme(panel.background = element_rect(fill=color.background,
                                          color=color.background)) +
    theme(plot.background = element_rect(fill=color.background,
                                          color=color.background)) +
    theme(panel.border = element_rect(color=color.background)) +
    theme(strip.background = element_rect(fill=color.background,
                                          color=color.background)) +

    # Format the grid
    theme(panel.grid.major.y = element_blank()) +
    theme(panel.grid.minor.y = element_blank()) +
    theme(axis.ticks = element_blank()) +

    # Format the legend
    theme(legend.position = "none") +

    # Format title and axis labels
    theme(plot.title = element_text(color=color.text, size=20, face = "bold")) +
    theme(axis.title.x = element_text(size=14, color="black", face = "bold")) +
    theme(axis.title.y = element_text(size=14, color="black", face = "bold",
                                          vjust=1.25)) +
    theme(axis.text.x = element_text(size=10, vjust=0.5, hjust=0.5,
                                          color = color.text)) +
    theme(axis.text.y = element_text(size=10, color = color.text)) +
    theme(strip.text = element_text(face = "bold")) +

    # Plot margins
    theme(plot.margin = unit(c(0.35, 0.2, 0.3, 0.35), "cm"))
}

Kita akan membuat bagan tambahan lagi, namun kali ini kita akan menghapus legenda, menambahkan beberapa label bagan, dan menggunakan tema yang ditentukan dalam kode di atas:

 ggplot(data, aes(x = as.factor(day), y = rank, group = team)) +
  geom_line(aes(color = team, alpha = 1), size = 2) +
  geom_point(aes(color = team, alpha = 1), size = 4) +
  geom_point(color = "#FFFFFF", size = 1) +
  scale_y_reverse(breaks = 1:nrow(data)) + 
  scale_x_discrete(breaks = 1:10) +
  theme(legend.position = 'none') +
  geom_text(data = data %>% filter(day == "1"),
            aes(label = team, x = 0.5), hjust = .5,
            fontface = "bold", color = "#888888", size = 4) +
  geom_text(data = data %>% filter(day == "10"),
            aes(label = team, x = 10.5), hjust = 0.5,
            fontface = "bold", color = "#888888", size = 4) +
  labs(x = 'Day', y = 'Rank', title = 'Team Ranking by Day') +
  my_theme()

Kita juga dapat dengan mudah menyorot salah satu baris dengan menambahkan argumen scale_color_manual() . Misalnya, dalam kode berikut, kita membuat garis Tim A menjadi ungu dan semua garis lainnya menjadi abu-abu:

 ggplot(data, aes(x = as.factor(day), y = rank, group = team)) +
  geom_line(aes(color = team, alpha = 1), size = 2) +
  geom_point(aes(color = team, alpha = 1), size = 4) +
  geom_point(color = "#FFFFFF", size = 1) +
  scale_y_reverse(breaks = 1:nrow(data)) + 
  scale_x_discrete(breaks = 1:10) +
  theme(legend.position = 'none') +
  geom_text(data = data %>% filter(day == "1"),
            aes(label = team, x = 0.5), hjust = .5,
            fontface = "bold", color = "#888888", size = 4) +
  geom_text(data = data %>% filter(day == "10"),
            aes(label = team, x = 10.5), hjust = 0.5,
            fontface = "bold", color = "#888888", size = 4) +
  labs(x = 'Day', y = 'Rank', title = 'Team Ranking by Day') +
  my_theme() +
  scale_color_manual(values = c('purple', 'grey', 'grey', 'grey', 'grey'))

Kita juga dapat menyorot beberapa baris jika kita ingin:

 ggplot(data, aes(x = as.factor(day), y = rank, group = team)) +
  geom_line(aes(color = team, alpha = 1), size = 2) +
  geom_point(aes(color = team, alpha = 1), size = 4) +
  geom_point(color = "#FFFFFF", size = 1) +
  scale_y_reverse(breaks = 1:nrow(data)) + 
  scale_x_discrete(breaks = 1:10) +
  theme(legend.position = 'none') +
  geom_text(data = data %>% filter(day == "1"),
            aes(label = team, x = 0.5), hjust = .5,
            fontface = "bold", color = "#888888", size = 4) +
  geom_text(data = data %>% filter(day == "10"),
            aes(label = team, x = 10.5), hjust = 0.5,
            fontface = "bold", color = "#888888", size = 4) +
  labs(x = 'Day', y = 'Rank', title = 'Team Ranking by Day') +
  my_theme() +
  scale_color_manual(values = c('purple', 'steelblue', 'grey', 'grey', 'grey'))

Tambahkan komentar

Alamat email Anda tidak akan dipublikasikan. Ruas yang wajib ditandai *