Radi_tech’s blog

Radiological technologist in Japan / MRI / AI / Deep learning / MATLAB / R / Python

【R】Rを使って箱ヒゲ図を作成し,有意差のマークをつける方法(1)

R boxplot
R boxplot

Rで箱ヒゲ図を作成し、有意差のマーク(* や n.s)をつけます。
今回は、自分で一本一本線や記号を書き足していく方法を紹介します。

統計計算から、有意差の表示まで自動でやってくれる方法もあります。

手順

  • csv file読み込み
  • 必要なライブラリの読み込み
  • 統計処理を行い, p値などを得る
  • ggplotでグラフを書く
  • 手動で線やテキストを書き足す

ggplotはレイヤーのように一つ一つの処理を足していくことが可能です。
p <- ggplot (dat) #グラフを書く。変数はplotの”p”
p <- p + geom_text(○○○)   #テキストの書き足し
p <- p + geom_segment(○○○) #線の書き足し
p

こんな感じ。。。

Sequence A, B, Cの画質評価を5pointでscaleで行った想定です。
今回はp値などを取得済みの仮定で進めます。

データはこちらから↓↓↓
test_data.csv - Google ドライブ

#ライブラリを読み込み
library(ggplot2)
library(ggsignif)
library(gridExtra)
library(ggpubr)
library(rstatix)

# ファイル読み込み
dat <- read.csv("csv_file_path", header=TRUE)
# NA の値を消去
dat <- no.omit(dat)
#attachで扱いやすく
attach(dat)

#Sequenceでグループ分け
Sequence <- as.factor(Sequence)
dat_2<- data.frame (Score, Sequence)

# boxplotを表示
p <- ggplot(dat_2 , mapping = aes(x = Sequence, y = Score)) +
  geom_boxplot(fill = "lightblue") 

# dotでデータを表示
p <- p + geom_point()

#とりあえず確認
p


〜

この時点でこんな感じ
f:id:radi_tech:20211023105823p:plain


このままだとダサいので色々と調整していく
調整は"p"に処理を足していく形式でかく
いわゆる、レイヤー処理と同様

#点の分布を表示する (今回は離散データなのであまり意味ない)
p <- p + geom_point()

# y軸を調整する
p <- p + ylim(0, 6.5)

# x軸の名前を変えてみる(今回は"_"を入れるだけ)
p <- p + scale_x_discrete("Images", labels = c("Sequence A" = "Sequence_A", "Sequence B" = "Sequence_B", "Sequence C" = "Sequence_C"))

p
〜

ここまででこんな感じ

R boxplot 有意差
R boxplot


有意差を示す線やtextを加えていく

# Sequence A - Sequence B間
p <- p + geom_text(x = 1.5, y = 4.6, label = "** p < 0.01", fontface="italic", alpha = 0.7, color = "grey28", size = 6)
p <- p + geom_segment(x = 1, xend = 1, y = 4.2, yend = 4.4, alpha = 0.5, color = "grey28")
p <- p + geom_segment(x = 1.9, xend = 1.9, y = 4.2, yend = 4.4, alpha = 0.5, color = "grey28")
p <- p + geom_segment(x = 1, xend = 1.9, y = 4.4, yend = 4.4, alpha = 0.5, color = "grey28")

# Sequence B - Sequence C間
p <- p + geom_text(x = 2.5, y = 5.6, label = "** p < 0.01", fontface="italic", alpha = 0.7, color = "grey28", size = 6)
p <- p + geom_segment(x = 2.1, xend = 3, y = 5.4, yend = 5.4, alpha = 0.5, color = "grey28")
p <- p + geom_segment(x = 2.1, xend = 2.1, y = 5.2, yend = 5.4, alpha = 0.5, color = "grey28")
p <- p + geom_segment(x = 3, xend = 3, y = 5.2, yend = 5.4, alpha = 0.5, color = "grey28")

#Sequence A - Sequence C間
p <- p + geom_text(x = 2, y = 6.3, label = "** p < 0.01", fontface="italic", alpha = 0.7, color = "grey28", size = 6)
p <- p + geom_segment(x = 1, xend = 3, y = 6, yend = 6, alpha = 0.5, color = "grey28")
p <- p + geom_segment(x = 1, xend = 1, y = 5.8, yend = 6, alpha = 0.5, color = "grey28")
p <- p + geom_segment(x = 3, xend = 3, y = 5.8, yend = 6, alpha = 0.5, color = "grey28")


# 背景のグリッド消し、フォントを調整
p <- p + theme_classic() + theme(text = element_text(size = 20))
p

〜

f:id:radi_tech:20211023113643p:plain


これで完成(p値はてきとーに書いてます)
その他色々と調整可能です