Как добавить слои stat_function () в ggplot2, используя цикл for? - PullRequest
1 голос
/ 28 октября 2019

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

Как получить тот же результат для функций, что и для меня? для очков?

MWE:

library(ggplot2)
# Colors vector
hues = seq(15, 375, length = 10 + 1)
cols = hcl(h = hues, l = 65, c = 100)[1:10]

# Create plot and add first layer
p <- ggplot(data = data.frame(x = 1:10, y = 10 + 1:10), 
             aes(x = x, y = y, color = cols[i])) +
      geom_point()

# Add points of other datasets
for (i in 1:9) {
  p <- p + geom_point(data = data.frame(x = 1:10, y = i + 1:10), color = cols[i])   
}
print(p)

# This for cycle only seems to work for the last layer
for (i in 1:10) {
  p <- p + stat_function(fun = function(x) (i + x), color = cols[i]) 
}
print(p)

Заранее спасибо.

Ответы [ 2 ]

2 голосов
/ 28 октября 2019

Цикл for не создает среды для сбора значений i для вас. Таким образом, вы создаете одну и ту же функцию каждый раз со свободным varaible i, и это значение не «просматривается» до тех пор, пока график не будет напечатан, а после цикла for значение i равно просто 10.

Вместо этого вы должны зафиксировать значение в слое с помощью команды args=. Они будут оцениваться во время цикла, а не во время розыгрыша. Затем просто добавьте в функцию переменную, которую вы записали в качестве параметра.

for (i in 1:10) {
  p <- p + stat_function(fun = function(x, i) (i + x), color = cols[i], args=list(i=i)) 
}
print(p)
1 голос
/ 28 октября 2019

При динамическом добавлении слоев я предпочитаю думать об объекте ggplot как о списке слоев, так что речь идет о встраивании слоев в список. Вы можете использовать lapply() или purrr::map(), здесь я выбираю последнее:

lines <- purrr::map(1:10, function(y) stat_function(fun = function(x) (y + x), color = cols[y]))

p + lines

enter image description here

...