2012-02-16 3 views
14

как новый пользователь ggplot2, я немного потерялся с количеством возможностей и изо всех сил пытаюсь найти в сети простой ответ на то, что я считаю простой проблемой ,Сетка из нескольких графиков ggplot2, которые были сделаны в цикле

Я хотел бы отобразить несколько графиков из ggplot2 на одном листе, НО зная, что эти графики поступают из цикла for.

Следующий пример не компилируется, только для иллюстрации:

for(i in c(1:n)){         
    for(j in c(1:m)){ 
    .......... # some data production 
    p <- ggplot(df.all) + geom_bar(aes_string(x=class.names[i],fill=var.names[j]) 
}} 

Здесь р переписывается, но я хотел бы вместо того, чтобы иметь матрицу или список, в котором я могу положить все р как они производятся, то простая функция, как

display_in_a_grid(list_of_ggplot_plots) 

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

О вещах, которые я имел взглянуть на:

«arrangeGrob» из пакета gridExtra не работает, потому что он требует явного имя для каждого участка (например, p1, p2, p3, ...) как в http://code.google.com/p/gridextra/wiki/arrangeGrob

«фаска» метод ggplot2 не приспособлен к организации моего набора данных (или наоборот: р)

ли вы иметь простой способ справиться с этим?

Спасибо,

Франсуа

+1

Вы находятся на правильном пути. Если вы рисуете множество гистограмм разных случаев, то стандартный график с несколькими гранями является стандартным подходом. Вероятно, вам лучше всего манипулировать вами в подходящей форме, чтобы добиться этого, вместо того, чтобы искать хак для нескольких сюжетов. –

+0

Спасибо. Я согласен, что это, безусловно, самое разумное решение. Дело в том, что для каждого отдельного сюжета я также хочу сделать некоторую обработку данных (совокупные мелкие классы и полный тест с квадратным квадратом) и отобразить значение p как induvidual title title. Так что, конечно, можно включить в фасетный метод, но я думаю, что в какой-то момент мне придется использовать цикл p. – fstevens

+0

Вы можете использовать 'geom_text' для аннотации каждой грани с значениями p. –

ответ

26

я был бы склонен согласиться с Ричи, но если вы хотите, чтобы организовать их самостоятельно:

library(gridExtra) 
library(ggplot2) 
p <- list() 
for(i in 1:4){ 
    p[[i]] <- qplot(1:10,10:1,main=i) 
} 
do.call(grid.arrange,p) 

посмотрите на примеры в конце от ?arrangeGrob для способов полного устранения петли для петли:

plots = lapply(1:5, function(.x) qplot(1:10,rnorm(10),main=paste("plot",.x))) 
require(gridExtra) 
do.call(grid.arrange, plots) 
+0

Спасибо. Гораздо яснее эта информация, которую я читаю в справочных руководствах, и иллюстрация функции do.call, которую я никогда не использовал. Я буду использовать это решение, если не получится использовать грани. – fstevens

+3

Ваш первый пример дает идентичные графики в случае «qplot (c (1:10), c (10: 1) + i, main = i) '" –