Rで動かせる三次元プロット



















二面角とラマチャンドランプロットでRamachandran Sphereを描いてみた話の続き。
Pythonではmatplotlibという標準ライブラリで図を描いていました。この方法だと(知る限りは)三次元のグラフを描いたとしてもマウスでグリグリ回したり出来ず、プログラム上で角度を指定する必要がありました。これでは面白くない。
ということで、Rを使ってマウスで動かせるグラフを描いてみました。

結果のファイルはここからダウンロードできます
https://drive.google.com/open?id=1BYonqzjTAmGfzANZtpnrV_naoI3F2tZu

参考にした記事
http://kohske.github.io/ESTRELA/201501/index.html
http://stackoverflow.com/questions/39778093/how-to-increase-smoothness-of-spheres3d-in-rgl/

#rglライブラリのインストール(初回だけ、コンソールで実行すればいい)
#install.packages("rgl")
#rglライブラリを読み込む
library(rgl)

#二面角を保存したcsvファイルがある場所を作業ディレクトリにする
setwd("~/hogehoge/")

#csvファイルを読み込む
#一行目のヘッダーは i-1, i, i+1, phi, psi
#phi, psiは0~1に正規化されている
data <- read.csv("nimenkaku_no_file.csv", header=T, encoding="UTF-8")

#極座標を直交座標に変換する
#phi は 0->1 を 0->2piに
#psi は 0->1 を pi->0に
x <- sin((data$psi-1)*-pi)*cos((data$phi-0.5)*2*pi)
y <- sin((data$psi-1)*-pi)*sin((data$phi-0.5)*2*pi)
z <- cos((data$psi-1)*-pi)

#点を打つ
points3d(x, y, z, add=T)
#中央のアミノ酸 i の一文字表記をプロットする
#text3d(x, y, z, text=data$i, add=T, cex=0.5)

#お手軽に球体を描く関数をそのまま使うと凸凹した汚い球になってしまう。
#spheres3d(x=0, y=0, z=0, radius=1, color="red", alpha="1", add=T)

#キレイな球体を描く
#http://stackoverflow.com/questions/39778093/how-to-increase-smoothness-of-spheres3d-in-rgl/
sphere.f <- function(x0 = 0, y0 = 0, z0 = 0, r = 1, n = 101, ...){
  f <- function(s,t){
    cbind(   r * cos(t)*cos(s) + x0,
             r *        sin(s) + y0,
             r * sin(t)*cos(s) + z0)
  }
  persp3d(f, slim = c(-pi/2,pi/2), tlim = c(0, 2*pi), n = n, add = T, ...)
} 

sphere.f(col = rainbow, r=0.99, alpha=1)

#ブラウザで見れる形式で保存する(とても便利
writeWebGL(width=800, height=800)

#おまけ
#点を打っていく処理がおそすぎて動画になる
# for ( i in seq(0,360, by=10)){
#     for ( l in seq(0,360, by=10)){
#         points3d(x=sin(i*2*pi/360)*cos(l*2*pi/360),y=sin(i*2*pi/360)*sin(l*2*pi/360),z=cos(i*2*pi/360), add=T)
#     }
# }



ちなみに上のプログラムはrglのバージョンが0.96以降でないとエラーがでる。
Error in seq.default(0, 1, length.out = nrow(z)) : argument 'length.out' must be of length 1.
これは、引数に関数(f)を持ってくるpersp3d()が古いバージョンには無いので、fを数値だか行列として扱おうとするため。
最近のmacからはX11と呼ばれるGUIシステムがデフォルトでインストールされなくなったので、代わりとしてX-Quartzをインストールしないと使えない。古い科学計算ソフトを使う時にもしばしば必要になる。
光源の設定か球の素材の設定をちゃんとしないとやてらテカりすぎている。

コメント

このブログの人気の投稿

Excelで近似直線の傾きと切片を得る

塩基配列のデータを扱うときは専用エディタ ApE を使おう

Illustrator で稲妻マークを描く