Как легко создать рельефный график в 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()) %>%
  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))

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

Стилизация изображения рельефа

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

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

Мы также можем легко выделить одну из строк, добавив аргумент 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'))

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *