Как указывает @Ben, вы должны передать цвет в aes
, чтобы получить отображаемую легенду.
Однако лучший способ получить ggplot
- это объединить два значения «Time» и «Timese c» в один кадр данных и преобразовать его в более длинный формат. Здесь, чтобы проиллюстрировать это, я создал этот фиктивный фрейм данных:
Time = sample(1:24, 200, replace = TRUE)
Timesec = sample(1:24, 200, replace = TRUE)
df <- data.frame(Time, Timesec)
Time Timesec
1 22 23
2 21 9
3 19 9
4 10 6
5 7 24
6 15 9
... ... ...
Итак, первый шаг - преобразовать ваш фрейм данных в более длинный формат. Здесь я использую функцию pivot_longer
из пакета tidyr
:
library(tidyr)
library(dplyr)
df %>% pivot_longer(everything(), names_to = "var",values_to = "val")
# A tibble: 400 x 2
var val
<chr> <int>
1 Time 22
2 Timesec 23
3 Time 21
4 Timesec 9
5 Time 19
6 Timesec 9
7 Time 10
8 Timesec 6
9 Time 7
10 Timesec 24
# … with 390 more rows
Чтобы добавить geom_vline
и geom_text
на основе среднего значения, хороший способ сделать это легко чтобы создать второй фрейм данных, собирающий среднее и максимальное значения плотности, необходимые для построения графика:
library(tidyr)
library(dplyr)
df_lab <- df %>% pivot_longer(everything(), names_to = "var",values_to = "val") %>%
group_by(var) %>%
summarise(Mean = mean(val),
Density = max(density(val)$y))
# A tibble: 2 x 3
var Mean Density
<chr> <dbl> <dbl>
1 Time 11.6 0.0555
2 Timesec 12.1 0.0517
Таким образом, используя df
и df_lab
, вы можете создать весь график. Здесь мы передали color
и fill
аргументы в aes
и используем scale_color_manual
и scale_fill_manual
для установки соответствующих цветов:
library(dplyr)
library(tidyr)
library(ggplot2)
df %>% pivot_longer(everything(), names_to = "var",values_to = "val") %>%
ggplot(aes(x = val, fill = var, colour = var))+
geom_density(alpha = 0.8)+
scale_color_manual(values = c("#4271AE", "orange"))+
scale_fill_manual(values = c("#1A3552", "gray"))+
geom_vline(inherit.aes = FALSE, data = df_lab,
aes(xintercept = Mean, color = var), linetype = "dashed", size = 1,
show.legend = FALSE)+
geom_text(inherit.aes = FALSE, data = df_lab,
aes(x = Mean-0.5, y = Density/2, label = var, color = var), angle = 90,
show.legend = FALSE)+
labs(title="Activity in the past 48 hours", subtitle="From {DATE 1} to {DATE 2}", caption="{LOCATION}") +
scale_x_continuous(name = "Time of Day", breaks=seq(c(0:23))) +
scale_y_continuous(name = "Activity") +
theme(legend.position="top")
Это отвечает на ваш вопрос?