2017-08-15 8 views
3

私はggplot2にスタックバープロットをプロットしています。 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つのトリートメントが含まれている、ように私のデータセットがあり、これらの5回の治療は var2に二つのグループに属し、各治療は var3で14回の測定値を持って、その価値は valueに保存されています。

私はこれらの5つの治療法とその測定値を比較するプロットを作りたいと思います。 ので、私はこの図のようにスタックバープロットでプロットします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 

どのように一緒に私のグループ一緒に最初の二つの積み重ねられた列、および他の3つの列だろうか?var2の2つのグループに属しているためです。

+0

可能な重複(https://stackoverflow.com/questions/44106032/restructuring-data-for-ggplot2-combination-grouped-and-stacked- barchart-using-ti) – Masoud

+0

[Rのグループ化されたバーチャル内に積み重なったバーを作成する方法](https://stackoverflow.com/questions/18774632/how-to-produce-stacked-bars-within-grouped-barchart -in-rnoredirect = 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

、この溶液時々素晴らしいです私はdplyrパッケージを使用しました!利点は以下のとおりである。それは

  • がトップ
  • で階層グループのラベルが含まれている実装するのは簡単です

    1. 一般的に良さそうに見えます
    2. を簡単にカスタマイズ可能です。たとえば、

    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. trt99"<-group1 | group2->"または類似した何かをNA""breaks中とlabelsの交換プロットエリア
    2. にテキスト注釈を追加します。 [Tidyverseを使用Ggplot2コンビネーショングループ化された積層棒グラフのためにデータを再構築]の
  • 0

    データセットに「treatment3」と「not treatment3」というラベルが付いた新しい列を作成するだけでよいと思います。

    df1 = dplyr::mutate(mydata, 
        var4 = ifelse(var1 == "treatment3", "treatment3", "not treatmeant3")) 
    
    関連する問題