2016-10-03 146 views
1

我嘗試在面板中繪製疊加條形圖+ 2路互動,其中包括4個實驗的相同圖表。但是,我不能躲避酒吧取決於自變量之一。以下是我的數據。ggplot2:3路互動疊加條形圖的分組條形圖

首先我通過下面的代碼讀取數據。

a<-read.table(file.choose(), header=T, dec=",") 

Exp. \t Gest \t lag \t Sint12 \t Rev12 \t c12 \t t1pi \t t2pi \t t1i \t t2i \t IntWeak \t inc \t Total 
 
1 \t 1 \t 1 \t 15,88 \t 3,28 \t 22,52 \t 11,76 \t 4,08 \t 2,28 \t 16,76 \t 3,24 \t 20,2 \t 100 
 
1 \t 1 \t 3 \t 0,88 \t 1,2 \t 61,36 \t 11,84 \t 8,4 \t 1,84 \t 2,32 \t 0,8 \t 11,36 \t 100 
 
1 \t 1 \t 8 \t 0,24 \t 0,24 \t 65,2 \t 10,24 \t 9,2 \t 1,84 \t 2,4 \t 0,48 \t 10,16 \t 100 
 
1 \t 2 \t 1 \t 14,96 \t 4 \t 25,28 \t 15,12 \t 1,92 \t 0,68 \t 16,8 \t 1,56 \t 19,68 \t 100 
 
1 \t 2 \t 3 \t 1,2 \t 0,72 \t 79,36 \t 8,64 \t 2,88 \t 0,64 \t 0,64 \t 0,64 \t 5,28 \t 100 
 
1 \t 2 \t 8 \t 0,16 \t 0,16 \t 86,72 \t 5,36 \t 3,2 \t 0,08 \t 0,48 \t 0,64 \t 3,2 \t 100 
 
2 \t 1 \t 1 \t 30,6 \t 2,2 \t 24,48 \t 4,56 \t 1,32 \t 0,4 \t 17,8 \t 1 \t 17,64 \t 100 
 
2 \t 1 \t 3 \t 0,96 \t 1,04 \t 87,2 \t 5,04 \t 2,16 \t 0,16 \t 0,4 \t 0,8 \t 2,24 \t 100 
 
2 \t 1 \t 8 \t 0,88 \t 0,24 \t 91,92 \t 3,28 \t 1,52 \t 0 \t 0,32 \t 0,88 \t 0,96 \t 100 
 
2 \t 2 \t 1 \t 20,16 \t 2,32 \t 16,52 \t 14,24 \t 0,72 \t 0,44 \t 15,96 \t 1,76 \t 27,88 \t 100 
 
2 \t 2 \t 3 \t 1,04 \t 0,64 \t 83,84 \t 5,84 \t 2 \t 0,08 \t 0,72 \t 1,12 \t 4,72 \t 100 
 
2 \t 2 \t 8 \t 0,24 \t 0 \t 91,04 \t 4,16 \t 1,52 \t 0,08 \t 0 \t 0,72 \t 2,24 \t 100 
 
3A \t 1 \t 1 \t 35,83 \t 3,92 \t 27,42 \t 2,42 \t 2,08 \t 0,25 \t 7,42 \t 3,63 \t 17,04 \t 100,01 
 
3A \t 1 \t 3 \t 1,58 \t 1 \t 81 \t 4,5 \t 3,33 \t 0,25 \t 0,33 \t 1,08 \t 6,92 \t 99,99 
 
3A \t 1 \t 8 \t 1 \t 0 \t 86,92 \t 3,17 \t 1,75 \t 0,08 \t 0,42 \t 0,33 \t 6,33 \t 100 
 
3A \t 2 \t 1 \t 43,46 \t 2,38 \t 21,29 \t 1,88 \t 1,17 \t 0,17 \t 5,46 \t 4,21 \t 20 \t 100,02 
 
3A \t 2 \t 3 \t 2 \t 0,75 \t 78,67 \t 3,75 \t 3,25 \t 0,17 \t 0,83 \t 0,92 \t 9,67 \t 100,01 
 
3A \t 2 \t 8 \t 1,33 \t 0,33 \t 83,25 \t 3 \t 2,17 \t 0 \t 0,67 \t 0,83 \t 8,42 \t 100 
 
3B \t 1 \t 1 \t 35,5 \t 2,54 \t 29,33 \t 3,04 \t 1,88 \t 0,54 \t 7,46 \t 7,46 \t 12,25 \t 100 
 
3B \t 1 \t 3 \t 1,58 \t 0,67 \t 79,42 \t 4,58 \t 2,83 \t 0,42 \t 0,67 \t 2,75 \t 7,08 \t 100 
 
3B \t 1 \t 8 \t 0,83 \t 0,17 \t 88,83 \t 3,17 \t 2,83 \t 0,08 \t 0,42 \t 0,5 \t 3,17 \t 100 
 
3B \t 2 \t 1 \t 32,33 \t 1,75 \t 17,21 \t 4,5 \t 2,21 \t 0,42 \t 13,21 \t 4,96 \t 23,42 \t 100,01 
 
3B \t 2 \t 3 \t 2,5 \t 0,25 \t 67,58 \t 8,42 \t 4,25 \t 0,5 \t 1 \t 4,58 \t 10,92 \t 100 
 
3B \t 2 \t 8 \t 1 \t 0,08 \t 76,83 \t 6,25 \t 4,5 \t 0,08 \t 0,33 \t 3 \t 7,92 \t 99,99

二我用下面的代碼變換它寬以長格式。

b <- reshape(a, 
     varying = c("Sint12", "Rev12", "c12", "t1pi", "t2pi", "t1i", "t2i", "IntWeak", "inc"), 
     v.names = "score", 
     timevar = "variable", 
     times = c("Sint12", "Rev12", "c12", "t1pi", "t2pi", "t1i", "t2i", "IntWeak", "inc"), 
     new.row.names = 1:1000, 
     direction = "long") 

和改造後的數據看起來象下面這樣:

Exp. Gest lag Total variable score id 
 
1  1 1 1 100.00 Sint12 15.88 1 
 
2  1 1 3 100.00 Sint12 0.88 2 
 
3  1 1 8 100.00 Sint12 0.24 3 
 
4  1 2 1 100.00 Sint12 14.96 4 
 
5  1 2 3 100.00 Sint12 1.20 5 
 
6  1 2 8 100.00 Sint12 0.16 6 
 
7  2 1 1 100.00 Sint12 30.60 7 
 
8  2 1 3 100.00 Sint12 0.96 8 
 
9  2 1 8 100.00 Sint12 0.88 9 
 
10  2 2 1 100.00 Sint12 20.16 10 
 
11  2 2 3 100.00 Sint12 1.04 11 
 
12  2 2 8 100.00 Sint12 0.24 12 
 
13 3A 1 1 100.01 Sint12 35.83 13 
 
14 3A 1 3 99.99 Sint12 1.58 14 
 
15 3A 1 8 100.00 Sint12 1.00 15 
 
16 3A 2 1 100.02 Sint12 43.46 16 
 
17 3A 2 3 100.01 Sint12 2.00 17 
 
18 3A 2 8 100.00 Sint12 1.33 18 
 
19 3B 1 1 100.00 Sint12 35.50 19 
 
20 3B 1 3 100.00 Sint12 1.58 20 
 
21 3B 1 8 100.00 Sint12 0.83 21 
 
22 3B 2 1 100.01 Sint12 32.33 22 
 
23 3B 2 3 100.00 Sint12 2.50 23 
 
24 3B 2 8 99.99 Sint12 1.00 24

我想要的是什麼; 1。 4個繪圖(對於每個實驗),2.通過Gest和滯後來製作交互圖。第3;用變量的顏色填充堆棧。

爲了做到這一點,我使用了下面的代碼。

ggplot(data = b,aes(x = interaction(Gest,lag),y = score,fill = variable,))+ geom_bar(stat =「identity」)+ facet_wrap(〜Exp。,ncol = 2 )

Plot

現在,劇情已準備就緒。但是,當我將position = dodge參數傳遞給geom_bar時;這是行不通的。我想有一個情節,在1.1 & 2.1之間沒有差距; 1.3 & 2.3和1.8 & 2.8(X軸標籤)。另外,我想指定.1-.3和.8之間的差距。

在此先感謝。

回答

0

你是什麼意思的「它不工作」?當我補充說,我得到了正確閃避酒吧的陰謀。

如果您只是想要修改間距,可以通過向沿x繪製的因子添加附加(空)級別來實現。請注意,在每個附加水平的不同數量的空間:

ggplot(data=b 
     , aes(x= factor(interaction(Gest, lag) 
         , levels = c(1.1,2.1," ",1.3,2.3," ",1.8,2.8)) 
      ,y=score, fill = variable)) + 
    geom_bar(stat="identity", position = "dodge") + 
    facet_wrap(~Exp., ncol=2) + 
    scale_x_discrete(drop = FALSE) 

enter image description here

您可以進一步走幾步,如果你使用cowplot包。這裏的優點是,如果分別製作每個實驗圖,則可以在lag變量上進行切面。然後,你可以將它們縫合在一起。在這裏,我壓制了個人傳奇,並在底部添加了一個共同的常見傳奇。

sepPlots <- lapply(unique(b$Exp.), function(thisExp){ 
    b %>% 
    filter(Exp. == thisExp) %>% 
    ggplot(aes(x = as.factor(Gest) 
       , y = score 
       , fill = variable)) + 
    geom_bar(stat="identity", position = "dodge") + 
    facet_wrap(~lag, nrow = 1 
       , labeller = label_both 
       , switch = "x") + 
    xlab("Gest") + 
    ggtitle(paste("Experiment:", thisExp)) 

}) 


expPlots <- 
    plot_grid(plotlist = lapply(sepPlots, function(x){x + guides(fill = "none")})) 

plot_grid(expPlots 
      , get_legend(sepPlots[[1]] + theme(legend.direction = "horizontal")) 
      , nrow = 2 
      , rel_heights = c(1, 0.1)) 

enter image description here

+0

非常感謝馬克,我是想添加這些額外的空白。我將使用您提供的其他信息。再次感謝:) 一個問題,你使用任何其他包你提供的最後一個功能,因爲當我粘貼第一個代碼的最後一個情節(從sePlots開始),我得到一個錯誤,在FUN(X [ [i]],...):找不到函數「%>%」。謝謝你:) –

+0

對不起。 '%>%'是管道字符,'filter'函數來自'dplyr'(它也會加載'%>%',儘管它最初來自'magrittr')。通常我更願意記住列出這些依賴關係。 –

+0

再次感謝它現在的作品:) –