こんにちは、eURO2023です!
趣味(?)でRstudioをしています。
Riverplotなるものを描いてみたので、備忘録としてあげておきます。
下準備
# まず今回使用するパッケージをインストールしましょう!
install.packages("riverplot")
install.packages("RColorBrewer")
# libraryで呼び出し
library("riverplot")
library(RColorBrewer)
# RColorBrewerを呼び出して、どの色合いがよいか決めます
display.brewer.all()
すると こんなパレットが書き出されるので、この中から好きな組み合わせを選びます。
“Spectral”というパレットにしてみました。
# 使用するパレットの決定
colA <- brewer.pal(10, "Spectral")
“Spectral”には色が11種類あります。10と設定すると、真ん中の色が抜けるのかな?
colA[1]は一番左側の色、colA[2]は左から2番目の色…
という風に認識されるようです。
枠組みの作成
とりあえず、テーマを化学療法の推移、にしてみます。
まず、ざっくりと絵を描いてみましょう。
Riverplotを描く場合、この手書きの絵がカギになるのではと思います。
x軸と、それぞれのx軸において使用された化学療法をまず描きます。
x=1は1次化学療法、x=2は2次化学療法…という感じで、4次化学療法まで設定します。
化学療法は”A”、”B”、”C”、”D”という4種類を設定します。
一次化学療法でAを行った場合は”A1″になります。3次化学療法でDを行った場合は”D3″ですね。
残念ながら死亡された場合は、”E”に組み込みます。
そして、ここが少し複雑なのですが、みんなが4次化学療法まで進むわけではないですよね。
1次化学療法をずっと続けている方もいるし、2次化学療法を続けている方もいるはず。
その場合のカテゴリー、「前回と同じ」も作成します。”F”としましょう。
上の図の意味
- 一次化学療法は”A”と”D”が用いられた(A1, D1)。
- “二次化学療法”は”A”, “B”, “C”が用いられた(A2, B2, C2)。残念ながら一次化学療法までで亡くなられた方が”E2″、一次化学療法をそのまま継続されて今に至る方が”F2″に入る。
- “三次化学療法”は”B”が用いられた(B3)。残念ながら二次化学療法までで亡くなられた方が”E3″、二次化学療法をそのまま継続されて今に至る方が”F3″に入る。
- “四次化学療法”は”A”と”D”が用いられた(A4, D4)。残念ながら三次化学療法までで亡くなられた方が”E4″、三次化学療法をそのまま継続されて今に至る方が”F4″に入る。
- “五次化学療法”までされた方はおらず、四次化学療法までで亡くなられた方が”E5″、四次化学療法をそのまま継続されて今に至る方が”F5″に入る。
次に色を決めます。同じ化学療法は同じ色にしましょう。
ここでは、”A”はcolA[2]、”B”はcolA[3]、”C”はcolA[4]、”D”はcolA[5]と設定します。
“E”は勝手なイメージですが濃い紫のcolA[10]にしました。
また、”F”については”white”と設定します。この理由は最後にわかります。
# nodesの設定
nodes <- data.frame(ID= c("A1","D1",
"A2","B2","C2","E2","F2",
"B3","E3","F3",
"A4","D4","E4","F4",
"E5","F5"),
x= c(1,1,
2,2,2,2,2,
3,3,3,
4,4,4,4,
5,5),
col= c(col=colA[2],col=colA[5],
col=colA[2],col=colA[3],col=colA[4],col=colA[10],"white",
col=colA[3],col=colA[10],"white",
col=colA[2],col=colA[5],col=colA[10],"white",
col=colA[10],"white"),
stringsAsFactors= FALSE)
点と点の推移を描く
次からがちょっと煩雑になってきます。
化学療法を施行された20人の患者さんの推移を追うことにしましょう。
“A”という化学療法が、一次化学療法として15人に施行されたとします。
そして”D”という化学療法は、一次化学療法として5人に施行されました。
合わせて20人ですね。
この15人、5人が次のフェーズでどのようになったかを記載する必要があります。
上の図の意味
- “A”の15名のうち、次治療として”B”が10人に、”C”が3人に施行されたとします。
- また、1名は残念ながらAの治療中の亡くなられ、1名は”A”を継続中とします。
- つまり”A1″から、“B2″に10人、“C2″に3人、“E2″に1人、“F2″に1人と移動することになりました。
- また、一次化学療法で”D”が5人に施行され、1人は亡くなられ、4人は次治療として”A”が選択されたとします。
- “D1″から“A2″に4人、“E2″に1人移動することになります。
ここで、”A1″からは4本の手が伸びており、”D1″からは2本の手が伸びていることがわかりますよね。
この、「手」の部分は
N1=c("A1","A1","A1","A1","D1","D1",…)
と表現します。N1が始点、ということになります。
さらに、”A1″からは”B2″,”C2″,”E2″,”F2″へ手が伸びており、”D1″からは”A2″,”E2″へ手が伸びてます。
ここは
N2=c("B2","C2","E2","F2","A2","E2",…)
と表現します。N2は終点ですね。
次に移動した数を表現します。
Value=c(10,3,1,1,4,2,…)
と表現することで、A1→B2へ10の移動、A1→C2へ3の移動、…と表すことができます!
この推移を最後まで完成させると、以下の図のようになります!
最終的には以下のスクリプトになります。
edges <- data.frame(N1= c("A1","A1","A1","A1","D1","D1",
"A2","B2","B2","C2","E2","F2",
"B3","B3","E3","F3",
"A4","D4","D4","E4","F4"),
N2= c("B2","C2","E2","F2","A2","E2",
"B3","E3","F3","F3","E3","F3",
"A4","D4","E4","F4",
"E5","E5","F5","E5","F5"),
Value= c(10,3,1,1,4,1,
4,7,3,3,2,1,
1,3,9,7,
1,1,2,9,7))
Riverplotの書き出し
いよいよLiverplotの書き出しです。
# 図の書き出し
r <- makeRiver(nodes,edges)
plot(r)
A1、とかD1、とか文字が邪魔ですよね…
実は、ラベルの消去を行うことができます。
nodes$labels = c("","","","",…
ラベルは16個あったので、””,が16個あればOKですね。
“”の中になにもいれないことで、空白にすることができるようです。
他に文字を入れたいときは、その文字を入力すればよさそうですね!
# 図の書き出し
nodes$labels=c("","","","","","","","","","","","","","","","")
r <- makeRiver(nodes,edges)
plot(r)
最終的に、このようになりました!
Rstudioを使うと、きれいな図が描けますね。
治療継続中のヒトを”white”にすることで、(白背景に限りますが)うっすら消えていくように見えます。
色の設定を変えることで、工夫ができそうですね。
さいごに
# スクリプト全景
install.packages("riverplot")
install.packages("RColorBrewer")
library("riverplot")
library(RColorBrewer)
display.brewer.all()
colA <- brewer.pal(10, "Spectral")
nodes <- data.frame(ID= c("A1","D1",
"A2","B2","C2","E2","F2",
"B3","E3","F3",
"A4","D4","E4","F4",
"E5","F5"),
x= c(1,1,
2,2,2,2,2,
3,3,3,
4,4,4,4,
5,5),
col= c(col=colA[2],col=colA[5],
col=colA[2],col=colA[3],col=colA[4],col=colA[10],"white",
col=colA[3],col=colA[10],"white",
col=colA[2],col=colA[5],col=colA[10],"white",
col=colA[10],"white"),
stringsAsFactors= FALSE)
edges <- data.frame(N1= c("A1","A1","A1","A1","D1","D1",
"A2","B2","B2","C2","E2","F2",
"B3","B3","E3","F3",
"A4","D4","D4","E4","F4"),
N2= c("B2","C2","E2","F2","A2","E2",
"B3","E3","F3","F3","E3","F3",
"A4","D4","E4","F4",
"E5","E5","F5","E5","F5"),
Value= c(10,3,1,1,4,1,
4,7,3,3,2,1,
1,3,9,7,
1,1,2,9,7))
nodes$labels=c("","","","","","","","","","","","","","","","")
r <- makeRiver(nodes,edges)
plot(r)
参考にしたブログ・HP
- シンペのアイロニカルデスク(https://shimpei.fun/?p=974)
- バイオインフォ道場 [bioinfo-Dojo] (https://bioinfo-dojo.net/2017/08/18/r-rcolorbrewer_alpha/)
コメント