Выделение отдельных точек данных с помощью ggplot, созданного из каналов

У нас есть этот простой фрейм данных:

data <- data.frame(ID = rep(c("a","b"), each = 500),
                   time = 1:500,
                val = rnorm(1000, mean=1, sd = 0.3))

У нас есть данные для 2 человек (ID == a а также b). Мы хотим разделить данные для отдельныхb и сделайте диаграмму рассеяния val против data_point с помощью dplyr а также ggplot2:

library(ggplot2)
library(dplyr)
data%>%
  filter(ID == "b")%>%
  mutate(data_point = c(1:500))%>%
  ggplot(.,)+
    geom_point(aes(x=data_point, y=val), size = 0.5)

Теперь предположим, что мы хотим сделать одну точку данных (скажем, самую первую точку / строку данных) больше, чем остальные, и другого цвета. Как мы можем сделать это изнутри этой трубы, не создавая объект вне трубы?

2 ответа

Решение

Вы можете создать две переменные внутри трубы: одну для цвета выделения, а другую - для его размера.

library(ggplot2)
library(dplyr)

data %>%
  filter(ID == "b") %>%
  mutate(data_point = 1:500) %>%
  mutate(highlight = data_point == 1,
         size = 0.5 + 10*highlight) %>%
  ggplot(aes(x = data_point, y = val)) +
  geom_point(aes(color = highlight, size = size), show.legend = FALSE) +
  scale_color_manual(values = c("black", "red"))

Другой способ, без создания этих двух переменных, - применить ту же логику к вызову эстетики в geom_point.

data %>%
  filter(ID == "b") %>%
  mutate(data_point = 1:500) %>%
  ggplot(aes(x = data_point, y = val)) +
  geom_point(aes(color = data_point == 1, 
                 size = 0.5 + 10*(data_point == 1)), 
             show.legend = FALSE) +
  scale_color_manual(values = c("black", "red"))

В обоих случаях результат будет следующим.

редактировать

Спасибо @Allan Cameron за то, что он отметил в комментарии, что:

В первой версии вам понадобится только одна новая переменная, затем используйте scale_size

Результат почти такой же, с разницей 0,5 size для выделенной точки.

data %>%
  filter(ID == "b") %>%
  mutate(data_point = 1:500) %>%
  mutate(highlight = data_point == 1) %>%
  ggplot(aes(x = data_point, y = val)) +
  geom_point(aes(color = highlight, size = highlight), show.legend = FALSE) +
  scale_color_manual(values = c("black", "red")) +
  scale_size_manual(values = c(0.5, 10*highlight))

Вы можете создать еще один столбец внутри mutate()для обработки размера точки. В этом примере sizing_point - это вектор, начинающийся с 5, за которым следует повторяющееся число 0,5.nrow(.)-1 раз, или в данном случае 499 раз.

 #multiple columns can be defined in mutate() separated by a comma
 data %>% 
      filter(ID == "b") %>%
      mutate(sizing_point = c(5,rep(0.5,nrow(.)-1)), data_point = c(1:500))%>%
      ggplot(.,)+
      geom_point(aes(x=data_point, y=val, size= sizing_point)

Конечно, вы можете выделить другой момент. Допустим, вы хотели выделить 75-ю точку. Вот один пример того, как можно указать размер пункта для этого элемента.

  #repeats .05 74 times, followed by 5, then repeats 0.5 again to the end of the vector
  c(rep(0.5,74),5,rep(0.5,nrow(.)-75))

И чтобы добавить цвета выделенной точке:

data %>% 
  filter(ID == "b") %>%
  mutate(sizing_point = c(5,rep(0.5,nrow(.)-1)), data_point = c(1:500))%>%
  ggplot(.,)+ geom_point(aes(x=data_point, y=val, size= sizing_point, color=factor(sizing_point)))+
  scale_color_manual(values = c("black", "red"))

 
Другие вопросы по тегам