2013-12-11 6 views
2

Я создаю список объектов (gg) и затем пытаюсь просмотреть все графики в одном графике. Из вопросов: How can I arrange an arbitrary number of ggplots using grid.arrange?, и How do I arrange a variable list of plots using grid.arrange?, я надеялся, что следующий код выполнит трюк (Перейти к последнему ряду строк для кода, который на самом деле делает многостраничную вещь).Построение нескольких графиков в R/ggplot2 и сохранение результата

#!/usr/bin/Rscript 
library(ggplot2) 
library(reshape) 
library(gridExtra) 
args <- commandArgs(TRUE); 
# Very first argument is the directory containing modelling results 
setwd(args[1]) 
df = read.table('model_results.txt', header = TRUE) 
df_actual = read.table('measured_results.txt', header = TRUE) 
dfMerge = merge(df, df_actual, by = c("Clients", "MsgSize", "Connections")) 

# All graphs should be stored in the directory pointed by second argument 
setwd(args[2]) 

# Plot the results obtained from model for msgSize = 1, 1999 
# and connections = 10, 15, 20, 25, 30, 50 

msgSizes = c(1, 1999) 
connVals = c(5, 10, 15, 20, 25, 30, 50) 

cmp_df = data.frame(dfMerge$Clients, dfMerge$MsgSize, dfMerge$Connections, dfMerge$PThroughput, dfMerge$MThroughput) 
colnames(cmp_df) = c("Clients", "MsgSize", "Connections", "ModelThroughput", "MeasuredThroughput") 
cmp_df_melt = melt(cmp_df, id = c("Clients", "MsgSize", "Connections")) 
colnames(cmp_df_melt) = c("Clients", "MsgSize", "Connections", "Variable", "Value") 

plotList = list() 
for (i in msgSizes) { 
    msg_Subset = subset(cmp_df_melt, MsgSize == i) 

    for (j in connVals) { 
     plotData = subset(msg_Subset, Connections == j) 

     filename = paste("Modelling.",i, ".", j, ".png", sep = '') 
     list_item = ggplot(data = plotData, aes(Clients, y = Value, color = Variable)) + 
      geom_point() + 
      geom_line() + 
      xlab("Number of Clients") + 
      ylab("Throughput (in ops/second)") + 
      labs(title = paste("Message Size = ", i, ", Connections = ", j), color = "Legend") 

     plotList = c(plotList, list_item) 
     # ggsave(file = filename) 

    } 
} 

# Plot all graphs together 
pdf("Summary.pdf") 
list_len = length(plotList) 
nCol = floor(sqrt(list_len)) 
do.call(grid.arrange, c(plotList, list(ncol = nCol))) 
dev.off() 

Вместо этого я попал следующее сообщение об ошибке:

Error in arrangeGrob(..., as.table = as.table, clip = clip, main = main, : 
    input must be grobs! 
Calls: do.call -> <Anonymous> -> grid.draw -> arrangeGrob 
Execution halted 

Что я делаю не так, тем более, что эти два взаимосвязанных вопроса предлагают то же самое? Кроме того, какие изменения должны быть сделаны для фактического сохранения графика в файле?

+0

Не могу проверить свой код, так как вы не предоставили образцы данных, но это выглядит, как в Примеры, которые вы назвали 'plotList' - это список. –

+0

Дикая догадка, но, возможно, переход на 'do.call (grid.arrange, c (plotList, ncol = nCol))' поможет? – TheComeOnMan

+0

Кроме того, попробуйте 'lapply (plotlist, class)' просто подтвердить, действительно ли каждый элемент является сюжетом или нет. На всякий случай. – TheComeOnMan

ответ

4

Как уже было сказано, невозможно проверить свой код, поскольку вы не предоставляете данные образца. Однако grid.arrange(...) ожидает список, содержащий либо grobs, либо ggplot объектов. Вы предоставляете список с количеством объектов ggplot и числовым. Вы попробовали это?

do.call(grid.arrange, plotlist) # untested 
5

Вот минимальный, воспроизводимый пример вашей проблемы. Он воспроизводит сообщение об ошибке и может быть легко запущен всеми заинтересованными пользователями, вставив код в новый сеанс R. Ошибка вызвана неожиданным поведением plot_list = c(plot_list, new_plot).

library(ggplot2) 
library(gridExtra) 

dat = data.frame(x=1:10, y=1:10) 

plot_list = list() 
nplot = 3 

for (i in seq(nplot)) { 
    new_plot = ggplot(dat, aes(x=x, y=y)) + 
       geom_point() + 
       labs(title=paste("plot", i)) 
    plot_list = c(plot_list, new_plot) 
} 

png("plots.png", width=10, height=5, units="in", res=150) 
do.call(grid.arrange, c(plot_list, list(ncol=nplot))) 
dev.off() 
# Error in arrangeGrob(..., as.table = as.table, clip = clip, main = main, : 
# input must be grobs! 

Ошибка будет решена путем оборачивания new_plot с list():

plot_list = c(plot_list, list(new_plot)) 

enter image description here

Смежные вопросы