2015-02-16 4 views
4

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

чтения TXT файл с предметами имя

subjs <- scan ("ListSubjs.txt", what = "") 

Создание списка для хранения объектов сюжета

pltList <- list() 

for(s in 1:length(subjs)) 
{ 

    setwd(file.path("C:/Users/", subjs[[s]])) #load subj directory 
    ifile=paste("Co","data.txt",sep="",collapse=NULL) #Read subj file 
    dat = read.table(ifile) 
    dat <- unlist(dat, use.names = FALSE) #make dat usable for ggplot2 
    df <- data.frame(dat) 

    pltList[[s]]<- print(ggplot(df, aes(x=dat)) + #save each plot with unique name 
    geom_histogram(binwidth=.01, colour="cyan", fill="cyan") + 
    geom_vline(aes(xintercept=0), # Ignore NA values for mean 
       color="red", linetype="dashed", size=1)+ 
    xlab(paste("Co_data", subjs[[s]] , sep=" ",collapse=NULL))) 

} 

На данный момент я могу отобразить сингл графики, например,

print (pltList[1]) #will print first plot 
print(pltList[2]) # will print second plot 

Я хотел бы иметь решение, с помощью которого se Veral участки отображаются в одной и той же странице, Я пытался что-то вдоль линий предыдущих постов, но я не смог заставить его работать

, например:

for (p in seq(length(pltList))) { 
    do.call("grid.arrange", pltList[[p]]) 
} 

дает мне следующую ошибку

Error in arrangeGrob(..., as.table = as.table, clip = clip, main = main, : input must be grobs!

можно использовать более основные функции графического, но я хотел бы добиться этого с помощью ggplot. Большое спасибо за внимание Матильды

ответ

0
library(gridExtra) # for grid.arrange 
library(grid) 
grid.arrange(pltList[[1]], pltList[[2]], pltList[[3]], pltList[[4]], ncol = 2, main = "Whatever") # say you have 4 plots 

ИЛИ

do.call(grid.arrange,pltList) 
+0

Спасибо за помощь, но это не похоже на работу Ошибка в arrangeGrob (..., as.table = as.table, клип = clip, main = main,: Вход должен быть grobs! – Matilde

+0

Я предполагаю, что это связано с вашим расположением. Посмотрите: http://stackoverflow.com/questions/21343372/arrangegrob-error-when-using- ggplot2-в-функции – Metrics

0

Я хотел бы я имел достаточно репутацию прокомментировать вместо ответа, но в любом случае вы можете использовать следующее решение, чтобы заставить его работать.

Я бы сделал именно то, что вы сделали, чтобы получить pltList, а затем используйте функцию мультимножества от this recipe. Обратите внимание, что вам нужно будет указать количество столбцов. Например, если вы хотите построить все участки в списке на две колонки, вы можете сделать это:

print(multiplot(plotlist=pltList, cols=2)) 
3

Ваша ошибка происходит от индексации список с [[:

считают

pl = list(qplot(1,1), qplot(2,2)) 

pl[[1]] возвращает первый участок, но do.call ожидает list аргументов. Вы можете сделать это с (без ошибок), но это, вероятно, не то, что вы хотите (он устраивает один сюжет на странице, в этом мало смысла).Предположительно вы хотите, чтобы все участки,

grid.arrange(grobs = pl) 

или, что то же самое,

do.call(grid.arrange, pl) 

Если вы хотите выбор этого списка, используйте [,

grid.arrange(grobs = pl[1:2]) 
do.call(grid.arrange, pl[1:2]) 

Дальнейшие параметры могут быть переданы тривиальным с первый синтаксис; с do.call необходимо соблюдать осторожность, чтобы убедиться, что список находится в правильной форме,

grid.arrange(grobs = pl[1:2], ncol=3, top=textGrob("title")) 
do.call(grid.arrange, c(pl[1:2], list(ncol=3, top=textGrob("title")))) 
Смежные вопросы