Fishplot 鱼图学习
碎碎念
第一次接触R语言,这个画图包也很新,五六年前开始用的感觉。因为我本身不是做肿瘤基因相关的内容,所以主要用于刻画肿瘤生长的fishplot对我来说重点是了解它的使用方法和输入输出的抽象意义。
【学习资料】
Github
RDocumentation
论文 Visualizing tumor evolution with the fishplot package for R
初识
论文理解
we have developed an R package(“fishplot”) that takes estimates of subclonal prevalence at different timepoints, and outputs publication-ready images that accurately represent subclonal relationships and their relative proportions.
fishplot的主要功能是在肿瘤生长的过程中,估计不同时间点上肿瘤的亚克隆流行率,输出的图像主要体现了亚克隆群体的比例以及相关关系。
亚克隆(subclonal)指的是肿瘤生长的过程中,肿瘤细胞会发生分裂增殖,其中基因片段或者其他大分子会发生变异,使得尽管该细胞仍然是肿瘤的一部分,但是其生长速度、侵袭能力、对药物的敏感性均可能出现差异,即肿瘤异质性产生。流行率(prevalence)的含义是在某个时间点新旧病例的比例。(本人并不是医学相关专业,这些名词的理解均来自于百度和知乎)
抽象来说,可以理解为群体A随着时间推进逐渐产生了群体B,AB之间即为亲子代的关系,在时刻t采样,B有b1个样本,时刻t+1采样,B有b2个样本,则在t+1时刻,流行率为(b2-b1)/ b1。而fish plot就是将群体的占比随时间的变化刻画出来。
R安装
install.packages("devtools")
library(devtools)
library(usethis) # 这一步是我自己运行后一条出现的提示,才运行的
install_github("chrisamiller/fishplot")
使用
根据官方给出的实例,首先需要构建一个object,然后进行画图。
createFishObject
输入数据,创建基础的Fish结构数据。
fish = createFishObject(frac.table, parents, timepoints = NULL,
col = NULL, clone.labels = NULL, fix.missing.clones = FALSE)
- timepoints:数字向量,表示采用时间点。
timepoints=c(0,34,69,187,334,505,530)
- parents:数字向量,表示亚群之间的亲代和子代关系,pi=j,表示第i个亚群的上一代是第j个亚群,若pi=0,则表示该亚群为初始族群。如下所示,记亚群为Vi,i= 1,2,3,……,7:
parents=c(0,1,1,1,3,4,0)
- frac.table:数字矩阵,表示所有时间点上所有亚群的fraction估计。每一列代表一个亚群,每一行代表每个时间点上的亚群占比。
frac.table = matrix(
c(99, 30, 2, 60, 0, 2, 1,
1, 0, 0.1, 00, 0, 0, 1,
3, 0, 2.5, 00, 0, 0, 1,
1, 0, 0.9, 00, 0, 0, 10,
3, 0, 0.9, 00, 0.1, 0, 20,
80, 0, 76, 00, 60, 0, 15,
0.1, 0, 0.005, 00, 0.001, 0, 0),
ncol=length(timepoints))
构建这个矩阵时需要注意:在每一个时间点上
1、每一层之间的占比之和不能超过100,例如V1和V7、V5和V6
2、子代的占比之和不能超过亲代,例如第一行中 V2 + V3 + V4 = 92 < 99 = V1
- clone.labels:标签名称。
- fix.missing.clones:布尔值,是否需要纠正非零时间点之间出现0的种群数据,默认FALSE。
- col:颜色向量,可以后续通过setCol进行设置,col=颜色向量。
fish = setCol(fish, col = NULL)
layoutClones
生成将用于绘图的布局关键点。
fish = layoutClones(fish, separate.independent.clones = FALSE)
- separate.independent.clones:布尔值,控制父节点(parents=0)之间是否需要在画图时用空格分离开。默认FALSE,不分离。
fishPlot
fishPlot(fish, shape = "polygon",
border = 0.5, col.border = "#777777", pad.left = 0.2,ramp.angle = 0.5,
vlines = NULL, col.vline = "#FFFFFF99", vlab = NULL, cex.vlab = 0.7,
title = NULL, title.btm = NULL, cex.title = NULL,
bg.type = "gradient", bg.col = c("bisque","darkgoldenrod1", "darkorange3"))
1、图形
- shape:构建的鱼图形状。
名称 | 示例 |
---|---|
polygon | |
spline | |
bezier |
- border:该多边形的边框大小。
- col.border:边框的颜色。
- pad.left:第一个时间点左侧扩展的幅度,默认为0.2。
- ramp.angle:shape=‘ploygon’,取值在0-1之间,表示从原点到第一个时间点之间的扩展幅度。
2、划线与标签
- vlines:数字向量,指示画线的位置。
- col.vlines:划线的颜色。
- vlab:划线位置的标签。
- cex.vlab:标签的缩放大小。
3、标题
- title:位于上方的标题,在图片外部。
- title.btm:位于左下方的标题,在图片内部。
- cex.title:标题的缩放大小。
4、背景
- bg.type:背景的类型选择,“gradlent” (默认)or “solld”。
- bg.col:背景的颜色选择,“gradlent” 需要三种颜色选择,"solld"需要一种。
drawLegend
设置图例。
drawLegend(fish, xpos = 0, ypos = -5, nrow = NULL, cex = 1)
- xpos:x轴坐标,默认0,以左为原点。
- ypos:y轴坐标,默认-5,以图片下方为原点。
- nrow:图例的行数。
- cex:缩放大小。
其他函数
调用方法:
fishplot:::<name>
validateInputs
检查关键的数据是否符合fish结构数据的要求。如果满足要求则不返回任何值。
validateInputs(frac.table, parents, nest.level,
clone.labels, clone.annots)
- clone.labels:每一个种群的标签名称
- clone.annots:注释
fixDisappearingClones
用于修复分次矩阵。其基础理论是:在一个时间点上具有非零值的种群不可能在一秒钟内完全消失,然后在第三个时间点再次出现。那个种群肯定一直都在那里。此函数将“修复”任何此类实例,方法是将中间的零值替换为非常小的值。
frac.table = fixDisappearingClones(frac.table, nest.level)
getInnerSpace
获取一个亚群中只有该亚群且未被亚克隆占据的百分比,即纯占比。
getInnerSpace(clone, fish)
- clone:需要检查的种群编号。
- fish:检查的fish对象。
例子:
timepoints=c(0,34,69,187,334,505,530)
parents = c(0,1,1,1,3,4,0)
frac.table = matrix(
c(99, 30, 2, 60, 0, 2, 1,
1, 0, 0.1, 00, 0, 0, 1,
3, 0, 2.5, 00, 0, 0, 1,
1, 0, 0.9, 00, 0, 0, 10,
3, 0, 0.9, 00, 0.1, 0, 20,
80, 0, 76, 00, 60, 0, 15,
0.1, 0, 0.005, 00, 0.001, 0, 0),
ncol=7)
fish = createFishObject(frac.table,parents,timepoints=timepoints)
fishplot:::getInnerSpace(3, fish)
<返回值>
0 34 69 187 334 505 530
2.000 0.100 2.500 0.900 0.800 16.000 0.004
505所对应的值为16,这是因为V3的76中,有60属于它的子类,也就是V5,因此使用该函数查询出的纯占比为16。
getOuterSpace
获取非肿瘤空间,即每个时间点处,100 - 初始父类种群(parents为0)占比之和。
getOuterSpace(fish)
<返回值>
0 34 69 187 334 505 530
0.0 98.0 96.0 89.0 77.0 5.0 99.9
getNestLevel
查询在当前的亲子代关系中,x位于哪一层。
getNestLevel(parents, x)
- parents:种群之间的亲子代关系。
- x:查询的种群。
例子:
parents = c(0,1,1,1,3,4,0)
fishplot:::getNestLevel(parents, 3)
<返回值> 1
fishplot:::getNestLevel(parents, 1)
<返回值> 0
fishplot:::getNestLevel(parents, 6)
<返回值> 2
getAllNestLevels
获取所有种群的嵌入位置。
fishplot:::getAllNestLevels(parents)
<返回值> 0 1 1 1 2 2 0
annotClone
插入注释。
annotClone(
x, y, annot,
angle = 0, col = "black", cex = 0.5,
pos = 4, offset = 0.5
)
- x:注释的起始位置x轴,原点在0时间点处
- y:注释的起始位置y轴,原点在图像最下方
- annot:注释的内容
- angle:角度
- col:颜色
- pos:整数,表示位置,1=below, 2=left, 3=above, 4=right
- cex:字体大小
- offset:从起始位置偏移量
drawClustPolygon、drawClustSpline、drawClustBezler
基于已有的fishplot,绘制单个集群。注意该绘图会覆盖原始的图像,并且并不会将这个集群插入到fish object中,因此我个人并不建议使用这些指令。
drawClustPolygon(xpos, ytop, ybtm, color, nest.level,
pad.left = 0, ramp.angle = 0.5,
border = 1, col.border = NULL)
- xpos:x轴的控制点位置,相当于fishobject中的timepoints。
- ytop:y轴控制点起始位置。
- ybtm:y轴控制点结束位置。
注意:ytop、ybtm长度应与xpos保持一致;ytop-ybtm=每个时间点处的占比。 - color:颜色。
- nest.level:描述其嵌套深度的整数 。
createBackgroundImage
创造背景图像。返回值为创建图像的储存路径。
createBackgroundImage(col)
- col:用于渐变的三种颜色的向量
代码
这里就不贴代码了,可以直接从论文中的附录下载,附录二就是。