R
bioinformatics

【R】PDB形式ファイルを3d-plotで表示する

目的

タンパク質の立体構造に座標軸を串刺しに通した図を描きたかった
PyMOLでどうやるかわからなかったのでRを使った

表示してみたもの

  • Sirtuin1 (PDBID:5BTR) ...緑色のline
  • resveratrol ...青色のdot

Rについて

  • R version 3.4.1

使用したパッケージ

  • bio3d
  • scatterplot3d

コード

pdb_lineplot3d.r
#パッケージ読み込み
library(bio3d)
library(scatterplot3d)

#ファイルの読み込み
pdb <- read.pdb("5btr") #RCSB PDBのIDを指定

#A鎖のCαの座標をdata.frameにする
ca.inds <- atom.select(pdb, "calpha",chain = "A")
pdb_xyz <- matrix(pdb$xyz[, ca.inds$xyz],ncol=3,byrow=T)
pdb_xyz <- data.frame(pdb_xyz)

#resveratrolの座標
stl.inds <- atom.select(pdb,resid = "STL",chain = "A")
stl_xyz <- matrix(pdb$xyz[, stl.inds$xyz],ncol=3,byrow=T)
stl_xyz <- data.frame(stl_xyz)

#3D plot
colnames(pdb_xyz) <- c("x","y","z")

scatterplot3d(pdb_xyz,type="l",color="#b2df8a",lwd=3,
              xlim=c(min(pdb_xyz$x),max(pdb_xyz$x)),
              ylim=c(min(pdb_xyz$y),max(pdb_xyz$y)),
              zlim=c(min(pdb_xyz$z),max(pdb_xyz$z)),
              col.axis="gray",col.lab="gray")
par(new=T)
scatterplot3d(stl_xyz,type="p",color="#1f78b4",pch=16,
              xlim=c(min(pdb_xyz$x),max(pdb_xyz$x)),
              ylim=c(min(pdb_xyz$y),max(pdb_xyz$y)),
              zlim=c(min(pdb_xyz$z),max(pdb_xyz$z)),
              axis = FALSE,grid=FALSE)

#串刺し
axis_line <- rbind(c(min(pdb_xyz$x),60,0),c(max(pdb_xyz$x),60,0),
                   c(-10,min(pdb_xyz$y),-0),c(-10,max(pdb_xyz$y),0),
                   c(-10,60,min(pdb_xyz$z)),c(-10,60,max(pdb_xyz$z)))
par(new=T)
scatterplot3d(axis_line[1:2,],type="l",color=1,
              xlim=c(min(pdb_xyz$x),max(pdb_xyz$x)),
              ylim=c(min(pdb_xyz$y),max(pdb_xyz$y)),
              zlim=c(min(pdb_xyz$z),max(pdb_xyz$z)),
              axis = FALSE,grid=FALSE)
par(new=T)
scatterplot3d(axis_line[3:4,],type="l",color=1,
              xlim=c(min(pdb_xyz$x),max(pdb_xyz$x)),
              ylim=c(min(pdb_xyz$y),max(pdb_xyz$y)),
              zlim=c(min(pdb_xyz$z),max(pdb_xyz$z)),
              axis = FALSE,grid=FALSE)
par(new=T)
scatterplot3d(axis_line[5:6,],type="l",color=1,
              xlim=c(min(pdb_xyz$x),max(pdb_xyz$x)),
              ylim=c(min(pdb_xyz$y),max(pdb_xyz$y)),
              zlim=c(min(pdb_xyz$z),max(pdb_xyz$z)),
              axis = FALSE,grid=FALSE)

結果

できた。
5btr_3dplot.png