Создать пользовательскую легенду в ggplot2

#r #ggplot2

#r #ggplot2

Вопрос:

Итак, вот моя проблема. У меня есть данные, похожие на приведенный ниже минимально воспроизводимый пример, с которым я хочу построить график ggplot2 , где фрейм данных содержит один столбец, который я хочу использовать в качестве значений x для каждого geom , и несколько столбцов, которые я хочу использовать в качестве разных значений y. Как вы можете видеть из приведенного ниже примера, я хочу комбинировать geom_line и geom_point с разными формами для geom_point значений.

Теперь мой вопрос заключается в том, как мне вставить легенду, которая сообщает мне, какие столбцы представляет какая фигура. Из того, что я узнал до ggplot2 сих пор, легенда обычно генерируется, если я сопоставляю некоторый фактор (возможно, неправильный термин) с color = или group = , я ошибаюсь? Итак, как я могу получить легенду без этого предварительного условия?

Помощь очень ценится!

 library(tidyverse)

df <- structure(list(rep = c(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
1, 1), Y_1 = c(0.0198, 0.0108, 0, 0.0117, 0.00931, 0.0089, 0.0115, 
0.00509, 0.00831, 0.0158, 0.0437, 0.0953, 0.267, 0.677, 1.81), 
    Y_2 = c(0.025, 0.00249, 0.00303, 0.00268, 0.0102, 0.0112, 
    0.0231, 0.0326, 0.0575, 0.0852, 0.143, 0.219, 0.384, 0.687, 
    1.01), X = c(0.1, 0.164, 0.268, 0.439, 0.72, 1.18, 1.93, 
    3.16, 5.18, 8.48, 13.9, 22.8, 37.3, 61.1, 100)), row.names = c(NA, 
15L), class = "data.frame")

df_plot <- ggplot(data = df)  
  geom_line(mapping = aes(x = X, y = Y_1))  
  geom_point(mapping = aes(x = X, y = Y_1), shape = 15)  
  geom_line(mapping = aes(x = X, y = Y_2))  
  geom_point(mapping = aes(x = X, y = Y_2), shape = 0)  
  scale_x_log10()  
  scale_y_log10()  
  theme_classic()

df_plot
  

Ответ №1:

Способ создания легенды — сопоставить различные уровни переменной с эстетическим масштабом (в вашем случае, масштабом формы). Самый простой способ сделать это ggplot — преобразовать ваши данные в длинный формат, создав Y_1 и Y_2 в один столбец значений y, с новым столбцом, который помечает каждое значение y в соответствии с исходным столбцом, из которого оно было получено. Это означает, что вам нужен только один вызов geom_line и один вызов geom_point :

 ggplot(data = tidyr::pivot_longer(df, c("Y_1", "Y_2")))  
  geom_line(mapping = aes(x = X, y = value, group = name))  
  geom_point(mapping = aes(x = X, y = value, shape = name))  
  scale_shape_manual(values = c(0, 15))  
  scale_x_log10()  
  scale_y_log10()  
  labs(shape = "variable")  
  theme_classic()
  

введите описание изображения здесь