2017-08-15 73 views
3

我正在繪製ggplot2中的堆棧barplot。我的數據集是一樣,如何控制ggplot2中堆棧欄之間的空間?

var1   var2 var3  value 
treatment1 group_1 C8.0 0.010056478 
treatment2 group_1 C8.0 0.009382918 
treatment3 group_2 C8.0 0.003014983 
treatment4 group_2 C8.0 0.005349631 
treatment5 group_2 C8.0 0.005349631 

var1包含5個處理,這五個處理屬於兩個組var2,每次治療在var3 14次測量,其值存儲在value

我想做一個陰謀比較這五種治療方法,以及他們的測量。 所以我堆棧柱狀圖中繪製這樣的數字:enter image description here

我的代碼:

library(ggplot2) 
colourCount = length(unique(mydata$var3)) 
getPalette = colorRampPalette(brewer.pal(14, "YlGnBu")) #get more color from palette 

ggplot(data=mydata, aes(x=var1, y=value, fill=var3))+ 
    geom_bar(stat="identity", position="stack", colour="black", width=.2)+ 
    *#geom_errorbar(aes(ymax=var3+se, ymin=var3-se, width=.1))+* 
    scale_fill_manual(values = getPalette(colourCount))+ 

    scale_y_continuous(expand = c(0, 0))+ 
    mytheme 

我怎麼能組前兩分堆疊列在一起,其他三列在一起嗎?因爲它們屬於var2中的兩個組。

+0

的可能的複製[用於GGPLOT2組合重組數據分組和堆積條形圖使用Tidyverse](https://stackoverflow.com/questions/44106032/restructuring-data-for-ggplot2-combination-grouped-and-stacked-條形圖使用ti) – Masoud

+0

[如何在R中的分組條形圖中生成堆積條形圖]的可能副本(https://stackoverflow.com/questions/18774632/how-to-produce-stacked-bars-within-grouped-barchart -in-R?noredirect = 1&LQ = 1) – Masoud

回答

3

「複製問題」的評論將導致你的答案像這樣的:

library(dplyr) 
library(ggplot2) 
dummydf <- expand.grid(var1 = paste0("trt", 1:5), 
      var3 = paste0("C_", 11:15)) %>% 
    mutate(value = runif(length(var1)), 
     var2 = ifelse(var1 %in% c("trt1", "trt2"), "grp1", "grp2")) 


    ggplot(dummydf, aes(var1, value, fill = var3)) + 
    geom_col(position = "stack") + 
    facet_grid(~var2, scales = "free_x", space = "free_x") 

enter image description here

而且這種解決方案有時是偉大的!其優點是:

  1. 它的簡單實現
  2. 包含使用分級分組標籤頂部
  3. 通常看起來不錯
  4. 很容易定製。

例如:

ggplot(dummydf, aes(var1, value, fill = var3)) + 
    geom_col(position = "stack") + 
    facet_grid(~var2, scales = "free_x", space = "free_x") + 
    theme(panel.spacing = unit(3, "cm"), 
     strip.text = element_text(size = 12, family = "mono")) 

enter image description here

主要缺點這種方法:

  1. 如果這已經是一個小鑲板的陰謀的一部分,它使 全事情混亂。
  2. 如果您的等級組顯然來自治療,您可能不需要明確的標籤,只是一個快速的視覺區別。例如,假設這些小組是控制/干預,並且您的治療是「無藥物,安慰劑」和「藥物1,2和3」。

因此,這裏是另一種方法:

dummydf %>% 
    bind_rows(data_frame(var1 = "trt99")) %>% 
    ggplot(aes(var1, value, fill = var3)) + 
    geom_col(position = "stack") + 
    scale_x_discrete(limits = c("trt1", "trt2", "trt99", "trt3", "trt4", "trt5"), 
        breaks = c("trt1", "trt2",  NA, "trt3", "trt4", "trt5"), 
        labels = c("trt1", "trt2",  "", "trt3", "trt4", "trt5")) 

enter image description here

該解決方案具有其自身的缺點,主要是你只能自定義空間以有限的方式。您可以創建一個「假」條,該條等於您已獲得的條的寬度的整數倍,方法是向限制,中斷和標籤添加更多的假級別。但是你不能創造出只有半個酒吧寬的空間。

你可以在錯誤的酒吧空間,雖然提供了更多的信息:

  1. 添加文本註釋在繪圖區
  2. trt99"<-group1 | group2->"或類似的東西替換breaksNA""labels
0

我認爲你只需要爲你的數據集創建一個新的列,其標籤的一切是「治療3」和「不治療3」。我用dplyr包:以上

df1 = dplyr::mutate(mydata, 
    var4 = ifelse(var1 == "treatment3", "treatment3", "not treatmeant3"))