Мой код не работает Как сделать сетку в формате pdf в R?

Я ломаю голову над следующим кодом.

Я следую этому примеру:

Как я могу упорядочить произвольное количество ggplots с помощью grid.arrange?

Я хотел собрать сюжеты и разложить их по сетке 3х9 и каждую сетку с подходящими метками...

Но это не работает. Сгенерированный PDF-файл по-прежнему представляет собой один график на страницу, поэтому создается 27 страниц.

Я пытаюсь использовать "grid.arrange", однако функция "plotFunctionWrittenByOtherPeople" была написана другими людьми, и она не возвращает дескриптор сюжета... и это довольно сложно.

Как красиво оформить участки?

Может ли кто-нибудь пролить свет на это?

Большое спасибо!


pdf("mytry1.pdf", width = 11, height = 8.5)
par(mfrow=c(3, 9))
for (a in seq(100, 900, by=100))
    for (b in c(1, 3, 6))
    {
         plotFunctionWrittenByOtherPeople(a, b)     
    }
dev.off()

person Luna    schedule 20.07.2012    source источник
comment
Я запутался, вы говорите, что следуете коду в этом вопросе, но ни один из этих кодов не появляется в вашем вопросе. И как мы должны помочь с большой сложной функцией, для которой у нас нет кода?   -  person joran    schedule 20.07.2012


Ответы (1)


Я думаю, что вы хотите создать сетку из множества графиков, созданных ggplot2. К сожалению, par(mfrow=) — это базовая графическая функция, которая не работает с ggplot2. Используйте grid.arrange в пакете gridExtra.

library(ggplot2)
library(gridExtra)

# Completely fake plotting function.
makePlot = function(a, b) {
    dat = data.frame(x=rnorm(a), y=rnorm(a))
    p = ggplot(dat, aes(x=x, y=y)) + 
        geom_point(size=b, alpha=1/b) +
        opts(title=paste("a = ", a, ", b = ", b, sep="")) +
        opts(plot.title=theme_text(size=12))
    return(p)
}

plot_list = list() # Create an empty list to hold plots.

for (b in c(1, 3, 6)) {                   # I switched a and b loops
    for (a in seq(100, 900, by=100)) {    # to make the final layout neater.
        p = makePlot(a, b)
        plot_list = c(plot_list, list(p)) # Add new plot to list.
    }
}

pdf("mytry1.pdf", width = 14, height = 6)
do.call(grid.arrange, c(plot_list, list(nrow=3, ncol=9, main="Grid of Plots")))
dev.off()

введите здесь описание изображения

Изменить: можно ли сделать это более кратким?

plot_list можно создавать и выводить в pdf намного компактнее. Спасибо @baptiste за предложение mlply, ggsave и arrangeGrob.

library(plyr)
plot_list = mlply(expand.grid(a=seq(100, 900, by=100), b=c(1, 3, 6)), makePlot)

ggsave(filename="grid_1.pdf", height=6, width=14, 
       plot=do.call(arrangeGrob, c(plot_list, nrow=3, main="Grid of Plots")))
person bdemarest    schedule 20.07.2012
comment
ggsave будет работать с arrangeGrob; grid.arrange только рисует и ничего не возвращает. - person baptiste; 20.07.2012