Выделение отдельных точек данных с помощью 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"))