2014-12-06 9 views
1

Возьмите этот пример:qplot не ленивые вычисления х и у

require(ggplot2) 
require(gridExtra) 

data(diamonds) 
name <- c("x","y","z") 
l <- list() 
j <- 1 

for (i in 1:(length(name)-1)){ 
    for (k in (i+1):length(name)){ 
    l[[j]] <- qplot(diamonds[,name[i]], diamonds[,name[k]]) + 
     labs(x = name[i], y = name[k]) 
    j <- j + 1 
    } 
} 

do.call(grid.arrange, l) 

Он печатает 3 раза тот же сюжет: enter image description here

Я думаю, это потому, что qplot не оценивает х и y:

> l[[1]]$mapping 
List of 2 
$ x: language diamonds[, name[i]] 
$ y: language diamonds[, name[k]] 

Так как это сделать Я могу сразу оценить name[i]?

Обходной бы:

for (i in 1:(length(name)-1)){ 
    for (k in (i+1):length(name)){ 
    l[[j]] <- ggplot(diamonds, aes_string(x=name[i], y=name[k])) + 
     geom_point() 
    j <- j + 1 
    } 
} 

Но тогда полные данные посаженные сохраняются в список-элементов:

> str(l[[1]]$data) 
'data.frame': 53940 obs. of 10 variables: 
$ carat : num 0.23 0.21 0.23 0.29 0.31 0.24 0.24 0.26 0.22 0.23 ... 
$ cut : Ord.factor w/ 5 levels "Fair"<"Good"<..: 5 4 2 4 2 3 3 3 1 3 ... 
$ color : Ord.factor w/ 7 levels "D"<"E"<"F"<"G"<..: 2 2 2 6 7 7 6 5 2 5 ... 
$ clarity: Ord.factor w/ 8 levels "I1"<"SI2"<"SI1"<..: 2 3 5 4 2 6 7 3 4 5 ... 
$ depth : num 61.5 59.8 56.9 62.4 63.3 62.8 62.3 61.9 65.1 59.4 ... 
$ table : num 55 61 65 58 58 57 57 55 61 61 ... 
$ price : int 326 326 327 334 335 336 336 337 337 338 ... 
$ x  : num 3.95 3.89 4.05 4.2 4.34 3.94 3.95 4.07 3.87 4 ... 
$ y  : num 3.98 3.84 4.07 4.23 4.35 3.96 3.98 4.11 3.78 4.05 ... 
$ z  : num 2.43 2.31 2.31 2.63 2.75 2.48 2.47 2.53 2.49 2.39 ... 
+0

содержимого 'л [1] 'и' l [2] '** ** различны, что можно увидеть, посмотрев на них или построив их самостоятельно. Это что-то о том, что делает ваш do.call (grid.arrange, l) '. Я еще не понял эту часть. –

+0

Документация на 'organizGrob' менее полезна, но если я пишу явно« grid.arrange »(l [[1], l [[2]]), неверные данные накладываются, что указывает на необходимость добавления большего количества параметров в функция. Вероятно, лучше всего использовать инструменты построения графиков из пакетов 'ggplot2' или' grid', которые лучше известны и понятны. –

+0

@CarlWitthoft 'print (l [[1]])' и 'print (l [[2]])' производят один и тот же сюжет; насколько я могу сказать, это не имеет ничего общего с grid.arrange – baptiste

ответ

4

Ваш «обходной путь» является правильный путь в моем мнение. qplot - функция удобства, которую я считаю совершенно ненужной и никогда не использую. Тем не менее, проблема связана с qplot создающего data.frame, если вы не укажете, и вы можете использовать его с обходным путем, как это:

require(ggplot2) 
require(gridExtra) 

data(diamonds) 
name <- c("x","y","z") 
l <- list() 
j <- 1 

for (i in 1:(length(name)-1)){ 
    for (k in (i+1):length(name)){ 
    l[[j]] <- qplot(x, y, data = data.frame(x = diamonds[,name[i]], 
              y = diamonds[,name[k]])) + 
     labs(x = name[i], y = name[k]) 
    j <- j + 1 
    } 
} 

do.call(grid.arrange, l) 

enter image description here