2023年5月9日火曜日

OTU名のみ色を変更

午前
・授業
・授業準備

午後
・授業準備
・データ解析

魔の火曜日だが、週末の準備を進めなければ。

以前から、絶対にやる方法があるはずだと思いつつ、これまで出来ていなかった、ggtree()を用いて系統樹を描く際にOTU名のみ色を変更する方法が、やっと分かった。
groupOTU()を使う方法や、もっとカッコいい方法もあったけど、理解できたのはこれ。
#読み込み方で形式が異なるの注意
tree <- read.beast("AAA.nex") 

#サンプル数が124の場合
#OTU名の列(label)と、blackだけの列(color)を作る;blackに意味はない
d <- data.frame(label=tree@phylo$tip.label, color=c(rep("black", 124)))

#変更したいOTU名(下記だと96、97)のcolor列のblackをmagentaに変更する
#厳密な意味で色指定ではなくグループ指定に過ぎない
dd <- d %>%
  mutate(color =case_when(
    label == 96 ~ "magenta",
    label == 97 ~ "magenta"))
    
 #上記のコマンドを実行すると指定しない行のcolor列にNAが入る
 #NAをblackに変更する
ddd <- dd %>% replace_na(list(color= "black"))

#作図
ggtree(tree, size=2.5) %<+% ddd +
  geom_tiplab(fontface='bold', size=8, aes(col=color), geom="text") +
  scale_color_manual(values=c("black", "magenta")) +  #実際の色はここで指定
  theme(legend.position = "none")
%<+% 」でphyloデータにデータフレームを加えることができるみたい。

それを利用することで、ggplotと同じように扱えるようになる。

コマンドを流れを整理すると、、、

まず、OTU名とグループ名を含むデータフレームを作成する。

その後、case_whenを使って、変更したOTU名のグループ列の名称を変更する。上記は色を名称に使っているけど、グループにすぎないので適当な名前で良い。

(カッコ悪いやり方だけど)case_whenを使用すると、変更の指定をしてない行がNAになってしまう。そこで、NAを適当な名称に置換する。

geom_tiplab()のaes()でグループ名の列をcol=で指定して、scale_color_manual()で色を指定する。実際の色の指定はここで行う。グループ名のアルファベット順に色を指定する。