Как легко создать диаграмму рельефа в R с помощью ggplot2


Рельефная диаграмма — это тип диаграммы, которая показывает ранжирование различных групп с течением времени вместо абсолютных значений, чтобы подчеркнуть порядок групп, а не величину изменений.

В этом руководстве объясняется, как легко создать диаграмму рельефа в R с помощью ggplot2.

Пример: создание диаграммы рельефа

Чтобы создать диаграмму рельефа в 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()) %>%
 ungroup()

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)) 
Рельефная диаграмма в R, сделанная с помощью ggplot2

Эта рельефная диаграмма показывает данные в том формате, который нам нужен, но он довольно уродлив. С некоторыми эстетическими изменениями мы можем сделать эту диаграмму намного лучше.

Стилизация диаграммы рельефа

Чтобы диаграмма выглядела лучше, мы можем использовать следующую тему, созданную Домиником Кохом :

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

Мы снова создадим диаграмму рельефа, но на этот раз мы удалим легенду, добавим несколько меток диаграммы и используем тему, определенную в приведенном выше коде:

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()
Рельефная диаграмма в R с пользовательской темой

Мы также можем легко выделить одну из строк, добавив аргумент scale_color_manual().Например, в следующем коде мы делаем линию для команды А фиолетовой, а линию для всех остальных строк серой:

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')) 
Рельефная диаграмма с двумя выделенными линиями в R
Замечательно! Вы успешно подписались.
Добро пожаловать обратно! Вы успешно вошли
Вы успешно подписались на кодкамп.
Срок действия вашей ссылки истек.
Ура! Проверьте свою электронную почту на наличие волшебной ссылки для входа.
Успех! Ваша платежная информация обновлена.
Ваша платежная информация не была обновлена.