見出し画像

【R言語】ggplot2|geom_signifを使っスターとpの値をグラフに書き込む

こんにちは。プログラミング超初心者のえいこです。

前回の記事で、とりあえず「棒グラフ+ドットプロット+スター+pの値」という論文に載せられるレベルのグラフを描くコードを書いてきました。

でも、"annotate"を使って手書きで書き込んだのが気に入らない!

だってせっかく"geom_signif"を導入したんだからもっと活用したい!!

ということで、今回はgeom_signifを使ってスターを書き込む再挑戦をしたいと思います。

結論から言うと、

「棒グラフ+スターを書き込むができたんだから、棒グラフの後にスターを書き込んで、ドットプロットを描けばよいんじゃない?」

という発想でやってみたらできたという感じです。

"geom_signif"を使う順番が大事!

まずは、棒グラフにスターを入れるところまでやっておきます。

棒グラフに"geom_signif"を使ってスターを入れたのはこちら。

これで書いたコードに、ドットプロットのコードを足し算するだけ。

+geom_jitter(
   data=rawdata,
   aes(x= treatment,  #xはtreatmentのfactorによって分ける
       y= value, #Y軸で使う値
       shape=treatment),
   stat="identity",
   size=3,
   position=position_jitter(0.17)
   )

これだけで、できてしまいました...

今までの苦労は何だったんだ...

ちょっと、"geom_signif"で書いたコードを振り返ってみましょう。

geom_signif(
  y_position=ylim*0.8, #高さの設定
  xmin=1.0, #線の始点の設定
  xmax=2.0, #終点の設定
  annotation= #if文を使ってスターの数を変える
    if(pvalue<0.001){
      "***"
    }else if(pvalue<0.01){
      "**"
    }else if(pvalue<0.05){
      "*"
    }else{
      "n.s."
    },
  tip_length=0.05, #棒の下向きの線の長さ
  textsize=7 #スターの大きさ
  )

今後のことを考えると、

・いちいちXの値を入力するのってめんどくさい
・どの群とどの群を比較するのか書いておく

をしておいたほうが良いかなと思うのでコードを見直したいと思います。

座標を指定しないコードにする

座標を指定しているのは、

y_position=ylim*0.8, #高さの設定
xmin=1.0, #線の始点の設定
xmax=2.0, #終点の設定

この部分。ということで、この部分を削除して実行してみると...

案の定エラーが出ます。

どの群とどの群を比較するのかを書いておけば、自動的に書き込んでくれるようなので、こんなコードを追加してみました。

comparisons = list(c("placebo", "X")),

これを実行すると、こんなグラフが描けます。

画像2

エラーバーとスターを示す線が合体してしまいました。

どうやらy軸の設定はしなければいけないみたい。。

ということで"y_position=ylim*0.8"は残すことにしました。

これで実行すると、

画像1

"geom_signif()"の中のコードを再確認しておきます。

geom_signif(
   comparisons = list(c("placebo", "X")),
   y_position = ylim*0.8,
   annotation=
     if(pvalue<0.001){
       "***"
     }else if(pvalue<0.01){
       "**"
     }else if(pvalue<0.05){
       "*"
     }else{
       "n.s."
     },
   tip_length=0.05, #棒の下向きの線の長さ
   textsize=7)

スターの数を自動に表示させたくて、

map_signif_level = TRUE,

とかを書き込んでみたりしたのですが、あんまりうまく動かず...

とりあえずif文で何とかスターを表示させています。

公式のサンプルとか見ていると、いろいろできそうなので多群比較とかでもう少し活用できたら良いなーと思ったり...

pの値を"annotate"を使って書き入れる

で、pの値を手書きで書き入れます。(geom_signifでpの値を直接入れられるみたいなのですが、もう少し模索してみます)

とりあえず、書いたコードはこちら↓

annotate("text", #グラフの中にテキストを入れるよ
           x=2.0, #xの場所
           y=ylim*0.87, #高さを調節
           label=p.pvalue, #書き入れる文字列
           fontface="italic", #書体はイタリックに変更
           size=3) #文字サイズ

前回の記事で書いていたのコードとほぼ変わりません。

画像3

ここまでは、棒グラフにスターを書き入れるのとほぼ一緒です。

最後にドットプロットを足し合わせます。

ドットプロットを重ねる

あとは、ドットプロットのコードを足し合わせるだけ。

+
 geom_jitter(
   data=rawdata,
   aes(x= treatment,  #xはtreatmentのfactorによって分ける
       y= value, #Y軸で使う値
       shape=treatment),
   stat="identity",
   size=3,
   position=position_jitter(0.17)
 )

出力すると...

画像4

行けたじゃん!前回記事の苦労は何だったんだ...

まぁ、この試行錯誤はきっと今後に役に立つと思います。

geom_sginifを使ったコードの振り返り

複数のグラフを重ね合わせるときに、geom_sginfを使ってスターなどを書き入れたいときに注意することは

一つ目のグラフを描いた後に挿入する

本当にシンプルですが、これだけです。

できて良かった!

ということで、次回は多群比較をしていきたいなと思います。

それでは、また!


今回書いたコードはこちら↓

#棒グラフとドットプロットが一緒になったものを描いていくよ

bdp1<- ggplot(data=data_mean_sd,
             aes(x= treatment, #X軸はtreatment
                 y=mean)) #geom_signifのコードをシンプルにするために入れておくよ

#グラフのベースを作っていくよ
bdp2<- bdp1+
 labs(x="treatment", y="expression level")+
 scale_y_continuous(expand = c(0,0), limits = c(0,ylim))+
 theme_classic()
bdp2

#棒グラフを描くよ
bdp3<-bdp2+
 geom_bar(
   aes(fill=treatment),
   stat="identity", #統計処理はしないでグラフを表示する
   color="black", #線の色は黒
   position="dodge" #棒グラフの間の調整はここを使う
 )+
 scale_fill_manual(values=c("gray","white"))+
 geom_errorbar( #エラーバーを描くよ
   aes(ymin=mean-sd,
       ymax=mean+sd),
   width=0.17
 )
bdp3

bdp4<-bdp3+
 geom_signif( #geom_signif登場だよ
   comparisons = list(c("placebo", "X")),
   y_position = ylim*0.8,
   annotation=
     if(pvalue<0.001){
       "***"
     }else if(pvalue<0.01){
       "**"
     }else if(pvalue<0.05){
       "*"
     }else{
       "n.s."
     },
   tip_length=0.05, #棒の下向きの線の長さ
   textsize=7)+
 annotate("text", #グラフの中にテキストを入れるよ
           x=2.0, #xの場所
           y=ylim*0.87, #高さを調節
           label=p.pvalue, #書き入れる文字列
           fontface="italic", #書体はイタリックに変更
           size=3) #文字サイズ
bdp4 
bdp5<- bdp4+
 geom_jitter( #ドットプロットを重ね合わせるよ
   data=rawdata,
   aes(x= treatment,  #xはtreatmentのfactorによって分ける
       y= value, #Y軸で使う値
       shape=treatment),
   stat="identity",
   size=3,
   position=position_jitter(0.17)
 )
bdp5

最後までお読みいただきありがとうございます。よろしければ「スキ」していただけると嬉しいです。 いただいたサポートはNGS解析をするための個人用Macを買うのに使いたいと思います。これからもRの勉強過程やワーママ研究者目線のリアルな現実を発信していきます。