Доступ к полям по имени в цикле с помощью ggplot

#r #ggplot2

#r #ggplot2

Вопрос:

Давайте составим некоторые данные, которые являются зашумленным синусом:

 xx <- sort(runif(125, 0, 2 * pi))
yy <- sin(xx)   rnorm(length(xx), sd = 0.3)
data <- data.frame(x = xx, y = yy)
  

Добавьте соответствие по lowess для разных параметров:

 ff <- c(2/3, 1/3, 1/10)
for (n in 1:length(ff)) {
  data[[paste("f", n, sep="")]] <- lowess(data$y ~ data$x, f = ff[n])$y
}
  

Теперь постройте график на одной диаграмме:

 ggplot(data)   
  geom_point(aes(x = x, y = y, color = "samples"))  
  geom_function(fun = sin, aes(x = x, color = "original sine"))  
  geom_line(aes(x = x, y = f1, color = "f1"))   
  geom_line(aes(x = x, y = f2, color = "f2"))  
  geom_line(aes(x = x, y = f3, color = "f3"))
  

С этим связано несколько проблем.

Прежде всего, как заменить последнюю часть циклом for? Т.е. что-то вроде:

 p <- ggplot(data)   
  geom_point(aes(x = x, y = y, color = "samples"))  
  geom_function(fun = sin, aes(x = x, color = "original sine"))

for (f in ff) {
  p <- p   geom_line(aes(x = x, y = f))
}

p
  

Во-вторых, это color = не похоже на правильный способ прикрепления метки легенды.
Как получить разные цвета и прикрепить метку?

Наконец, я хотел бы изменить тип строки на пунктирную для строк в цикле.

Спасибо.

Комментарии:

1. Преобразуйте ширину в длину, затем постройте график.

Ответ №1:

Получить столбцы, начинающиеся с "f" в длинном формате, а затем отобразить :

 library(tidyr)
library(ggplot2)

data %>%
  pivot_longer(cols = starts_with('f')) %>%
  ggplot()   geom_point(aes(x = x, y = y, color = "samples"))  
  geom_function(fun = sin, aes(x = x, color = "original sine"))  
  geom_line(aes(x = x, y = value, color = name), linetype = 'dashed')
  

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

Комментарии:

1. да, это выглядит лучше, чем мои попытки; как удалить / заменить «цвет» чем-то значимым? кроме того, в легенде тип строки не показан.

2. вы можете добавить labs(color='legend title') , чтобы включить заголовок легенды.