1
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Rで論文っぽい図を描く⑤ ggplot2のグラフ上に2way ANOVAのp値を半自動的に表示する

Last updated at Posted at 2021-04-06

今回はTwo-way ANOVAの結果を図に直接示すようなことをしたいと思います。
全ての値をannotateしていると大変なのと、Rにやってもらうことで打ち間違いも防げます。

##データ読み込み

data(iris)
head(iris) #確認

Two-way ANOVAをしたいので、今回も、例によって架空のTemperature列を入れていきます。
元から2要因あるデータを持っている場合はこれは必要ありません。

iris$Temperature <- rep(c(rep("High", 25), rep("Low", 25)), 3)

##Two-way ANOVA

#Two-way ANOVAをやる
anovasummary <- summary(aov(Sepal.Length ~ Species * Temperature, data = iris)) 
anovasummary <- anovasummary[[1]]
#p値を抜き出す
anovap <- as.data.frame(anovasummary[1:3,5])
#要因の名前の列を作る
anovap$factor <- as.character(row.names(anovasummary)[1:3])
#謎に要因の後ろにスペースができる場合があるので消しておく
anovap$factor <- sub(" .*", "", anovap$factor) 
#交互作用のところを良い感じにしてみた。
anovap$factor <- sub(":", " × ", anovap$factor) 
colnames(anovap) <- c("p-value", "factor")

#確認
head(anovap)

追記。以下の方法でもスペースを消せるようです。@dfghdfdjftyfghvgjhk様より教えていただきました。また、本題とは関係ないですがTemperature列を作った際のrep()にも、もっと簡潔に書くやり方があるようです。詳細はコメント欄を参照してください。

anovap$factor <- trimws(anova$factor)

##p値の大きさを判別し、全要因の結果を返す関数を作る

changep <- function(a) {
    #p値の大きさによって、返す文字列を決める
    p <- function(a) {
        if (a < 0.001) {
            return("p < 0.001")
        } else if (a < 0.01){
            return("p < 0.01")
        } else if (a < 0.05) {
            return("p < 0.05")
        } else {
            return("n.s.")
        }
    }

    #全要因に対して上の関数を当てはめ、結果を返す
    c <- NULL
    for (i in 1:nrow(a)){
        c <- paste0(c, "\n", a[i, 2], " : ", p(a[i, 1]))
    }
    return(c)
}

@dfghdfdjftyfghvgjhk様にコメントを頂き修正しました。

##ggplot2で図示

#結果入れる用の場所の確保のために、y軸の最大値より少し大きい値を格納しておく
yRoof <- max(iris$Sepal.Length)*1.2

#plot
library(ggplot2)
g <- ggplot(iris, aes(x=Species, y=Sepal.Length, fill=Temperature)) + 
  geom_boxplot(lwd=1.5) + 
  theme(panel.grid = element_blank()) +
   scale_fill_manual(values = c("grey", "white")) + 
  labs(y="Sepal Length (cm)", x=NULL) + 
  theme(axis.text=element_text(size=20, face = "bold", colour = "black"), 
        axis.title=element_text(size=25,face="bold", colour = "black"),
        axis.line = element_line(size = 1.2, colour = "black"), 
        panel.grid.major = element_blank(), 
        panel.grid.minor = element_blank(),
        panel.background = element_blank(),
        legend.position = "none")
g <- g +
  annotate("text", x=Inf, y=yRoof,
           label=changep(anovap),
           hjust="right",
           size = 4)
#保存
ggsave("xxx.png", plot = g, width = 8, height = 8)

image.png

大きさとかは適宜調整が必要かもしれないです。
快適なggplotライフを送りたいですね。

1
3
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?