วิธีสร้างแผนบรรเทาทุกข์ใน r อย่างง่ายดายโดยใช้ ggplot2


Bump Chart คือแผนภูมิประเภทหนึ่งที่แสดงการจัดอันดับของกลุ่มต่างๆ ในช่วงเวลาหนึ่ง แทนที่จะเป็นค่าสัมบูรณ์เพื่อเน้นลำดับของกลุ่มมากกว่าจำนวนการเปลี่ยนแปลง

บทช่วยสอนนี้จะอธิบายวิธีสร้าง Bump Plot ใน R อย่างง่ายดายโดยใช้ ggplot2

ตัวอย่าง: การสร้างกราฟิกนูน

ในการสร้างแผนภูมิ Bump ใน R ก่อนอื่นเราต้องโหลดสองแพ็กเกจ: dplyr และ ggplot2 :

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

ต่อไป เราจะสร้างข้อมูลบางอย่างเพื่อใช้งาน:

 #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

ฐานข้อมูลนี้แสดง “อันดับ” ของห้าทีมที่แตกต่างกันในช่วง 10 วัน

เราสามารถใช้ ggplot2 เพื่อสร้างแผนภูมิความคืบหน้าเพื่อแสดงภาพอันดับของแต่ละทีมในแต่ละวันในช่วงเวลานี้:

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

แผนภูมิชนนี้แสดงข้อมูลในรูปแบบที่คุณต้องการ แต่ก็ค่อนข้างน่าเกลียด ด้วยการเปลี่ยนแปลงด้านสุนทรียภาพเล็กน้อย เราจึงสามารถทำให้ภาพวาดนี้ดีขึ้นได้มาก

ตกแต่งกราฟิกบริเวณกันกระแทก

เพื่อปรับปรุงรูปลักษณ์ของแผนภูมิ เราสามารถใช้ธีมต่อไปนี้ที่สร้างโดย 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"))
}

เราจะสร้าง Bump Chart อีกครั้ง แต่คราวนี้เราจะลบคำอธิบาย เพิ่มป้ายกำกับแผนภูมิ และใช้ธีมที่กำหนดไว้ในโค้ดด้านบน:

 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() ตัวอย่างเช่น ในโค้ดต่อไปนี้ เราทำให้เส้นของทีม A เป็นสีม่วง และเส้นอื่นๆ ทั้งหมดเป็นสีเทา:

 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'))

นอกจากนี้เรายังสามารถเน้นหลายบรรทัดได้หากต้องการ:

 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'))

เพิ่มความคิดเห็น

อีเมลของคุณจะไม่แสดงให้คนอื่นเห็น ช่องข้อมูลจำเป็นถูกทำเครื่องหมาย *