Как вручную добавить легенду о типах линий в ggplot? - PullRequest
0 голосов
/ 03 августа 2020

У меня есть сюжет с двумя типами линий, но я не могу заставить его отображаться в легенде, как это делают цвета. Мои наборы данных выглядят так:

Role <- LETTERS[1:3]
df1 <- data.frame (totalFemByLevel = c(104,23,9),
                   totalMalByLevel = c(48,30,12),
                   Role)
df2 <- data.frame (totalFemByLevel = c(100,30,6),
                   totalMalByLevel = c(44,25,10),
                   Role)

Один из них - с 2016 года, а другой - с 2019 года, оба структурированы одинаково.

CompareTotalPlot <- function(df1, df2, title) {   Plot <- ggplot(data
= df1, aes(x = factor(Role), group = 1))+  #female=red, male = steelblue
    geom_line(aes(y=totalFemByLevel, col = "red"), size = 1.5) +
    geom_point(aes(y=totalFemByLevel, col = "red"), size = 7)+
    geom_text(aes(y=totalFemByLevel, label = totalFemByLevel))+
    
    geom_line(aes(y=totalMalByLevel, col ="steelblue"), size = 1.5) +
    geom_point (aes(y=totalMalByLevel,col = "steelblue"), size = 7)+
    geom_text(aes(y=totalMalByLevel, label = totalMalByLevel))+
    scale_linetype_manual(name = "Year",
                          values = c(1,2), 
                          labels = c("2019", "2016"))+ #l
    scale_colour_manual(name = "Gender",
                        labels = c("Women","Men"),
                        values = c("red","steelblue"))+
    labs(x= "Level",
         y= "Total",
         title = title
    )
    
     Plot <- Plot+geom_line(data=df2, aes(y=totalFemByLevel, col = "red"), size = 1, linetype = 2)+
       geom_line(data=df2, aes(y=totalMalByLevel, col = "steelblue"), size = 1, linetype = 2 )
    
        }

участок

Это сюжет, который выводит мой текущий код. Я доволен всем, кроме легенды.

1 Ответ

0 голосов
/ 03 августа 2020

У вас нет ничего сопоставленного с типом линии aestheti c, поэтому даже если бы у вас была легенда, у вас не было бы разных типов линий на вашем графике.

Обычно лучше, если вы вы хотите сопоставить эстетику с переменными с целью создания легенды, лучше всего сделать это, создав один фрейм данных «длинного формата». Вот полностью воспроизводимый пример (я использовал ваш график для восстановления приблизительных точек данных, а не примеров кадров данных):

df1  <- data.frame(totalFemByLevel = c(56, 51, 16, 8, 6),
                   totalMalByLevel = c(59, 49, 21, 15, 23),
                   Role = LETTERS[1:5])

df2  <- data.frame(totalFemByLevel = c(62, 43, 14, 4, 1),
                   totalMalByLevel = c(56, 35, 34, 7, 18),
                   Role = LETTERS[1:5])

library(ggplot2)
library(dplyr)

bind_rows(df2, df1) %>%
  mutate(Year = factor(c(rep(2019, 5), rep(2016, 5)))) %>%
  tidyr::pivot_longer(cols = c("totalFemByLevel", "totalMalByLevel")) %>%
  ggplot(aes(x = Role, y = value, color = name, group = paste(Year, name))) +
  geom_line(aes(linetype = Year, size = Year)) +
  geom_point(size = 7, aes(alpha = Year)) +
  geom_text(aes(label = value, alpha = Year), colour = "black") +
  scale_linetype_manual(values = c(1, 2)) +
  scale_size_manual(values = c(1.5, 0.75)) +
  scale_alpha_manual(values = c(1, 0), guide = guide_none()) +
  scale_colour_manual(name = "Gender",
                      labels = c("Women", "Men"),
                      values = c("red", "steelblue")) +
  labs(x= "Level", y= "Total", title = "2016/2019 Comparison")

Created on 2020-08-03 by the пакет реплекс (v0.3.0)

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