2015-06-02 5 views
1

Я планирую несколько ggparcoord (из пакета GGally) подзаголовки в один большой участок. В общем случае все, кроме одного из подзадач, получают один и тот же набор данных (x), а последний - из другого набора данных (y).Использование grid.arrange с несколькими графиками

Я хочу, чтобы каждый подзарядок был другого цвета. Как ни странно, я могу получить эту работу, когда я делаю это не в цикле следующим образом (в данном случае у меня есть 3 подзаговоры):

library(GGally) 
library(ggplot2) 
library(gridExtra) 

set.seed(1) 
colList = scales::hue_pal()(3) 
plot_i = vector("list", length=2) 

x = data.frame(a=runif(100,0,1),b=runif(100,0,1),c=runif(100,0,1),d=runif(100,0,1)) 
x$cluster = "color" 
x$cluster2 = factor(x$cluster) 
plot_i[[1]] = ggparcoord(x, columns=1:4, groupColumn=6, scale="globalminmax", alphaLines = 0.99) + xlab("Sample") + ylab("log(Count)") + scale_colour_manual(values = c("color" = colList[1])) 

plot_i[[2]] = ggparcoord(x, columns=1:4, groupColumn=6, scale="globalminmax", alphaLines = 0.99) + xlab("Sample") + ylab("log(Count)") + scale_colour_manual(values = c("color" = colList[2])) 

y = data.frame(a=runif(100,5,6),b=runif(100,5,6),c=runif(100,5,6),d=runif(100,5,6)) 
y$cluster = "color" 
y$cluster2 = factor(y$cluster) 
plot_i[[3]] = ggparcoord(y, columns=1:4, groupColumn=6, scale="globalminmax", alphaLines = 0.99) + xlab("Sample") + ylab("log(Count)") + scale_colour_manual(values = c("color" = colList[3])) 


p = do.call("grid.arrange", c(plot_i, ncol=1)) 

Однако я пытаюсь автоматизировать все делянок, которые приходят из тот же набор данных (x) и сталкивается с трудностями. В приведенном выше примере это было всего 2 подзаголовка. Но я буду увеличивать это число. Однако в любом случае последний подзаговор всегда будет из другого набора данных (y). По этой причине я пытаюсь создать цикл, чтобы пройти через множество подзадач набора данных (x).

library(ggplot2) 
library(GGally) 
library(gridExtra) 

set.seed(1) 
colList = scales::hue_pal()(3) 
plot_1 = vector("list", length=2) 
plot_2 = vector("list", length=1) 
plot_1 <- lapply(1:2, function(i){ 
    x = data.frame(a=runif(100,0,1),b=runif(100,0,1),c=runif(100,0,1),d=runif(100,0,1)) 
    x$cluster = "color" 
    x$cluster2 = factor(x$cluster) 
    ggparcoord(x, columns=1:4, groupColumn=6, scale="globalminmax", alphaLines = 0.99) + xlab("Sample") + ylab("log(Count)") + theme(legend.position = "none", axis.title=element_text(size=12), axis.text=element_text(size=12)) + scale_colour_manual(values = c("color" = colList[i])) 
}) 
p = do.call("grid.arrange", c(plot_1, ncol=1)) 

y = data.frame(a=runif(100,5,6),b=runif(100,5,6),c=runif(100,5,6),d=runif(100,5,6)) 
y$cluster = "color" 
y$cluster2 = factor(y$cluster) 
plot_2 = ggparcoord(y, columns=1:4, groupColumn=6, scale="globalminmax", alphaLines = 0.99) + xlab("Sample") + ylab("log(Count)") + theme(legend.position = "none", axis.title=element_text(size=12), axis.text=element_text(size=12)) + scale_colour_manual(values = c("color" = colList[3])) 

p = do.call("grid.arrange", c(plot_1[[1]], plot_1[[2]], plot_2, ncol=1)) 

Однако я получаю сообщение об ошибке:

Error in arrangeGrob(..., as.table = as.table, clip = clip, main = main, : 
    input must be grobs! 

Я попытался подобные идеи (grid.arrange using list of plots):

plist <- mget(c(plot_1[[1]], plot_1[[2]], plot_2)) 
do.call(grid.arrange, plist, ncol = 1) 

И получил ошибку:

Error in mget(c(plot_1[[1]], plot_1[[2]], plot_2)) : 
    invalid first argument 

ответ

2

единственное, чего не хватает, - это когда вы повторно вводя несколько графиков, они должны быть в структуре списка.

Если вы измените последнюю строку кода

от: р = do.call ("grid.arrange", с (plot_1 [[1]], plot_1 [[2]], plot_2, Ncol = 1))

к: р = do.call ("grid.arrange", C (список (plot_1 [[1]], plot_1 [[2]], plot_2), Ncol = 1))

Я считаю, что это решит проблему.

+0

Это работает как шарм. Интересно, могу ли я спросить здесь: можно ли это назвать без жесткого кодирования в plot_1 [[1]] и plot_1 [[2]]? Причина в том, что у меня не всегда будет ровно два подзаголовка в plot_1 (хотя у меня всегда будет один подзаговор в plot_2). –

+0

Например, я бы определил переменную nPlots. В приведенном выше примере nPlots = 2. Я пробовал делать вещи, которые явно не жестко кодируются в числе 2, например: 1) p = do.call ("grid.arrange", c (list (plot_clusters, plot_filtered), ncol = 1)), 2) p = do.call ("grid.arrange", c (list (paste0 ("plot_clusters [[", 1: nPlots, "]]", sep = ","), plot_filtered), Ncol = 1)). –

0
library(ggplot2) 
library(GGally) 
library(gridExtra) 

set.seed(1) 
colList = scales::hue_pal()(3) 
nPlots = 3 #new code# - chose a random number for nPlots (3) 
#plot_1 = vector("list", length=nPlots) #new code# - length = nPlots 
#plot_2 = vector("list", length=1) 
plot_1 <- lapply(1:nPlots, function(i){ #new code# - 1:nPlots 
    x = data.frame(a=runif(100,0,1),b=runif(100,0,1),c=runif(100,0,1),d=runif(100,0,1)) 
    x$cluster = "color" 
    x$cluster2 = factor(x$cluster) 
    ggparcoord(x, columns=1:4, groupColumn=6, scale="globalminmax", alphaLines = 0.99) + xlab("Sample") + ylab("log(Count)") + theme(legend.position = "none", axis.title=element_text(size=12), axis.text=element_text(size=12)) + scale_colour_manual(values = c("color" = colList[i])) 
}) 
p = do.call("grid.arrange", c(plot_1, ncol=1)) 

y = data.frame(a=runif(100,5,6),b=runif(100,5,6),c=runif(100,5,6),d=runif(100,5,6)) 
y$cluster = "color" 
y$cluster2 = factor(y$cluster) 
plot_2 = ggparcoord(y, columns=1:4, groupColumn=6, scale="globalminmax", alphaLines = 0.99) + xlab("Sample") + ylab("log(Count)") + theme(legend.position = "none", axis.title=element_text(size=12), axis.text=element_text(size=12)) + scale_colour_manual(values = c("color" = colList[3])) 

p = do.call("grid.arrange", c(append(plot_1, list(plot_2)), ncol=1)) #new code# 
+0

Я написал # новый код #, где есть изменения. Примечание * Я прокомментировал, где вы инициализируете plot_1 и plot_2. Это не обязательно, потому что вы позже перезаписываете plot_1 и plot_2 в коде. Однако, оставляя это в коде, отображается ваше намерение для этих объектов, что никогда не бывает плохим. – easports611

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