Сетка из нескольких графиков 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)

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

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

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

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

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

Спасибо,

Франсуа


person fstevens    schedule 16.02.2012    source источник
comment
Ты на правильном пути. Если вы рисуете много гистограмм для разных случаев, то стандартный подход - это единый график с несколькими аспектами. Вероятно, будет лучше преобразовать вас в подходящую форму для достижения этой цели, чем искать взлом для нескольких сюжетов.   -  person Richie Cotton    schedule 16.02.2012
comment
Спасибо. Я согласен, что это, безусловно, наиболее разумное решение. Дело в том, что для каждого отдельного графика я также хочу выполнить некоторую обработку данных (агрегировать небольшие классы и выполнить полный критерий хи-квадрат) и отобразить p-значение как индивидуальный заголовок графика. Так что это, безусловно, можно включить в метод фасетов, но я думаю, что в какой-то момент мне все равно придется использовать цикл p.   -  person fstevens    schedule 17.02.2012
comment
Вы можете использовать geom_text, чтобы аннотировать каждый фасет значениями p.   -  person Richie Cotton    schedule 17.02.2012


Ответы (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)
person Justin    schedule 16.02.2012
comment
Спасибо. Намного понятнее та информация, которую я читал в справочных руководствах, и иллюстрация функции do.call, которую я никогда не использовал. Я воспользуюсь этим решением, если у меня не получится использовать фасеты. - person fstevens; 17.02.2012
comment
Ваш первый пример создает идентичные графики в случае qplot (c (1:10), c (10: 1) + i, main = i) ' - person Stepan S. Sushko; 02.02.2017
comment
Как я могу использовать это, чтобы добавить параметры grid.arrange, такие как ncol, nrow, height, width и т. Д. - person CrashOverride; 23.03.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)

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

person jiang ziqi    schedule 21.08.2018