Сетка из нескольких графиков ggplot2, которые были сделаны в цикле for
как новый пользователь 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])
}}
здесь p перезаписывается, но я хотел бы иметь вместо этого матрицу или список, в котором Я могу поместить все p, как они производятся, а затем простую функцию, такую как
display_in_a_grid(list_of_ggplot_plots)
но насколько я пытался, я не смог составить список матрица сюжета, ни найти функцию, которая принимает только один аргумент для ввода.
о вещах, на которые я посмотрел:
"arrangeGrob" из пакета gridExtra не работает,потому что для каждого участка требуется явное имя (например: p1,p2, p3,...) как в http://code.google.com/p/gridextra/wiki/arrangeGrob
метод "фасет" ggplot2 не адаптирован к организации моего набора данных (или наоборот :p )
- у вас есть простой способ справиться с этим ?
спасибо,
Франсуа
2 ответов
Я был бы склонен согласиться с Ричи, но если вы хотите расположить их к себе:
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
для способов устранения цикла for В целом:
plots = lapply(1:5, function(.x) qplot(1:10,rnorm(10),main=paste("plot",.x)))
require(gridExtra)
do.call(grid.arrange, plots)
Это мое решение. Крошечные изменения в до aes_string
.
library(gridExtra)
library(ggplot2)
p <- list()
for(i in 1:4){
p <- ggplot(data=df,aes_string(x=df$x,y=df$y) +geom_bar(aes_string(x=class.names[i],fill=var.names[j])
}
do.call(grid.arrange,p)
надеюсь, что это помогает!