2016-08-09 2 views
1

Я пытаюсь построить несколько функций с пакетом ggplot2 с использованием stat_function. Поскольку у меня есть несколько параметров параметров, которые я использую для цикла. Я сохраняю свои графики в переменной списка myplot. Проблема возникает, когда я пытаюсь их распечатать. Использование print все кажется ОК, но когда я использую только параметр, например. myplot[[1]] линии те же, что и для myplot[[2]] и т. Д., Однако точки построены правильно. Такую же проблему можно наблюдать, когда я пытаюсь построить все мои графики с помощью одной цифры, используя функцию grid.arrange.stat_function и grid.arrange in for loop

Смотрите мой пример:

library("ggplot2") 
myfun <- function(x, group, a, b, e){ 
    a * x + b + group * e 
} 
abe <- rbind(c(1, 2, 3), c(7, 0, -4), c(-1, -5, 8)) 
myplot <- list() 
for (i in 1:3){ 
    x1 <- rnorm(10, 0, 1) 
    x2 <- rnorm(10, 1, 1) 
    num <- runif(20, -10, 10) 
    df <- cbind(rbind(data.frame(x = x1, group = "group 1"), 
        data.frame(x = x1, group = "group 2")), 
       num) 
    myplot[[i]] <- ggplot(df, aes_string("x", "num")) + 
        geom_point(aes_string(colour = "group")) + 
        stat_function(aes(colour = "group 1"), 
           fun = function(x) 
           myfun(x, 0, abe[i, 1], abe[i, 2], abe[i, 3]), 
           geom = "line") + 
        stat_function(aes(colour = "group 2"), 
           fun = function(x) 
           myfun(x, 1, abe[i, 1], abe[i, 2], abe[i, 3]), 
           geom = "line") + 
        ylim(c(-10, 10)) + xlim(c(-2, 2)) 
} 

### everything OK 
for (i in 1:3){ 
    print(myplot[[i]]) 
} 
### points are changing but lines remain the same 
myplot[[1]]; myplot[[2]]; myplot[[3]] 
### again points are changing but lines remain the same 
grid.arrange(myplot[[1]], myplot[[2]], myplot[[3]], ncol = 3) 

Как я хочу, чтобы сохранить все цифры в один файл, я хотел бы, чтобы правильно сделать grid.arrange сюжетные линии.

ответ

2

Когда вы печатаете графики, i == 3, и ваша функция будет только оценивать параметры и с этим значением i. Используйте правильный синтаксис stat_function:

myplot[[i]] <- ggplot(df, aes_string("x", "num")) + 
    geom_point(aes_string(colour = "group")) + 
    stat_function(aes(colour = "group 1"), 
        fun = myfun, 
        args = list(a = abe[i, 1], b = abe[i, 2], 
           e = abe[i, 3], group = 0), 
        geom = "line") + 
    stat_function(aes(colour = "group 2"), 
        fun = myfun, 
        args = list(a = abe[i, 1], b = abe[i, 2], 
           e = abe[i, 3], group = 1), 
        geom = "line") + 
    ylim(c(-10, 10)) + xlim(c(-2, 2)) 
+0

Спасибо, это решило мою проблему! – Adela