2015-06-02 71 views
1

我正在繪製幾個ggparcoord(從GGally包)子圖到一個大的陰謀。一般來說,除了其中一個子圖來自同一個數據集(x),最後一個來自不同的數據集(y)。使用grid.arrange與多個圖

我希望每個子圖都是不同的顏色。奇怪的是,我能得到這個,當我這樣做不是在一個for循環如下(我有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

的唯一缺少的是當你一個重新輸入多個圖,他們需要在列表結構中。

如果更改從代碼

最後一行: P = do.call( 「grid.arrange」,C(plot_1 [[1]],plot_1 [[2]],plot_2,NcoI位= 1))

到: p = do.call( 「grid.arrange」,C(列表(plot_1 [[1]],plot_1 [[2]],plot_2),NcoI位= 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:nPlot,「]]」,sep =「,」),plot_filtered), NcoI位= 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

相關問題