R - (библиотека ggplot2) - легенды не отображаются на графиках - PullRequest
3 голосов
/ 01 марта 2020

Что я делаю

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

Проблема

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

То, что я пробовал

Я установил position вверху / внизу / слева / право, чтобы убедиться, что ничего не было сделано по умолчанию position до none, что скрыло бы его.

Код

# PDF/Plot generation
pdf("activity-plot.pdf")
ggplot(data.frame("Time"=times), aes(x=Time)) +

  #Data Set 1
  geom_density(fill = "#1A3552", colour = "#4271AE", alpha = 0.8) +
  geom_text(x=mean(times)-1, y=max(density(times)$y/2), label="Mean {1} Activity", angle=90, size = 4) +
  geom_vline(aes(xintercept=mean(times)), color="cyan", linetype="dashed", size=1, alpha = 0.5) +

  # Data Set 2
  geom_density(data=data.frame("Time"=timesSec), fill = "gray", colour = "orange", alpha = 0.8) +
  geom_text(x=mean(timesSec)-1, y=max(density(timesSec)$y/2), label="Mean {2} Activity", angle=90, size = 4) +
  geom_vline(aes(xintercept=mean(timesSec)), color="orange", linetype="dashed", size=1, alpha = 0.5) + 

  # Main Graph Info
  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")

dev.off()

Результат

image

1 Ответ

1 голос
/ 02 марта 2020

Как указывает @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")

enter image description here

Это отвечает на ваш вопрос?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...