Сетка из нескольких графиков ggplot2, созданных в цикле for - PullRequest
23 голосов
/ 16 февраля 2012

как новый пользователь 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)

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

О вещах, на которые я смотрел:

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

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

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

Спасибо,

François

Ответы [ 2 ]

37 голосов
/ 16 февраля 2012

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

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)
0 голосов
/ 21 августа 2018

Это моё решение. Крошечное изменение в функции ggplot с параметром mapping на aes_string.

library(gridExtra)
library(ggplot2)
p <- list()
for(i in 1:4){
p[[i]] <- 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)

Надеюсь, это поможет!

...