今日任务:
学习quantile(x,probs)
函数
先不要管下面这些代码啥意思,直接复制到RStudio
里运行一下
rm(list=ls()) #清除环境变量
dev.off() #清楚画布
hic_matrix = matrix(c(100,2,5,7,1,150,9,4,11,6,200,6,8,13,3,170),4,4) #自己随便创建了一个矩阵
# 获得矩阵有几行几列
hic_x = dim(hic_matrix)[1]
hic_y = dim(hic_matrix)[2]
# 确定坐标
hic_xleft = rep(c(0:(hic_x-1)),each = hic_x) #获取每一行的xleft
hic_xright = hic_xleft + 1
hic_ybottom = rep(c((hic_y-1):0),hic_y) #获取每一行的ybottom
hic_ytop = hic_ybottom + 1
# 精修
## 得到浓度矩阵
mat.max = max(hic_matrix) # mat.max = quantile(hic_matrix,prob=0.9)
hic_matrix.rate = hic_matrix / mat.max #这步得到的就是颜色的浓度
col.mat = rgb(1,0,0,hic_matrix.rate) #rgb(1,0,0)代表红色,一般再后面的参数放的就是透明度,这里就是颜色的浓度。
## 画图——加颜色、去外边框、内边框、留白
plot(x=c(0:hic_x),y=c(0:hic_y),type="n",frame.plot = F,xaxt="n",yaxt="n",xlab="",ylab="")
rect(xleft = hic_xleft,ybottom = hic_ybottom,xright = hic_xright,ytop = hic_ytop,col=col.mat,border = F)
最后得到热图:
我们发现这图有个毛病,除了对角线,其他地方的颜色太淡了,下面我们对上面代码进行微调:(不问为什么,直接复制过去运行,看图就好)
rm(list=ls())
dev.off()
hic_matrix = matrix(c(80,2,5,7,1,88,9,4,11,6,70,6,8,13,3,77),4,4)
# set image size
hic_x = dim(hic_matrix)[1]
hic_y = dim(hic_matrix)[2]
# 确定坐标
hic_xleft = rep(c(0:(hic_x-1)),each = hic_x) #获取每一行的xleft
hic_xright = hic_xleft + 1
hic_ybottom = rep(c((hic_y-1):0),hic_y) #获取每一行的ybottom
hic_ytop = hic_ybottom + 1
# 精修
## 得到浓度矩阵
mat.max = quantile(hic_matrix,prob=0.75)
hic_matrix.rate = hic_matrix / mat.max #这步得到的就是颜色的浓度
hic_matrix.rate[hic_matrix.rate>1] = 1
col.mat = rgb(1,0,0,hic_matrix.rate)
## 画图——加颜色、去外边框、内边框、留白
plot(x=c(0:hic_x),y=c(0:hic_y),type="n",frame.plot = F,xaxt="n",yaxt="n",xlab="",ylab="")
rect(xleft = hic_xleft,ybottom = hic_ybottom,xright = hic_xright,ytop = hic_ytop,col=col.mat,border = F)
得到图片:
这样得到的图是不是好很多了,其实只是对上面那个进行了微调,只有得到颜色浓度矩阵的那步使用了一下
quantile
函数,其他地方都没有变,为了更直观我们对比下,修改前,得到颜色浓度矩阵的代码:
## 得到浓度矩阵
mat.max = max(hic_matrix)
hic_matrix.rate = hic_matrix / mat.max #这步得到的就是颜色的浓度
col.mat = rgb(1,0,0,hic_matrix.rate) #rgb(1,0,0)代表红色,一般再后面的参数放的就是透明度,这里就是颜色的浓度。
修改后:
## 得到浓度矩阵
mat.max = quantile(hic_matrix,prob=0.75)
hic_matrix.rate = hic_matrix / mat.max #这步得到的就是颜色的浓度
hic_matrix.rate[hic_matrix.rate>1] = 1
col.mat = rgb(1,0,0,hic_matrix.rate)
为什么只是简单使用了
quantile
函数就能让图出现这样的变化呢?
参数解释:
-
quantile(x,probs)
求分位数。其中 x 为待求分位数的数值型向量, probs 为一个由[0,1]之间的概率值组成的数值向量。例子,# 求 x 的 30%和 84%分位点:y <- quantile(x, c(0.3,0.84))
为什么修改后会得到那样的效果?
修改前,画出的图特别的淡,大部分都是白色的区域,造成这样的原因主要是,最大值与平均值之间差距太大了,我们得到颜色浓度的时候,直接用矩阵中的每一个数除以最大值,就会造成把颜色浓度拉的太低的情况。
所以我们用quantile(x,probs)
函数,去矩阵中75%分位点的数,可以这样理解:我们把矩阵中所有的数从大到小进行排序,去掉最大的前25%,求出来的是剩下那75%里最大的数。这样就会避免出现那样的问题。
hic_matrix.rate[hic_matrix.rate>1] = 1
上面是取75%分位点的数,所以必须加上这步操作。颜色浓度矩阵是这样算的:矩阵中每个数除以75%分位点的数hic_matrix / mat.max
得到一个从0-1的分数。所以当遇到最大的前25%的数时,这个比率就会大于1,这样不行,所以我们把所有大于1的强行赋值为1。
以上那些代码,其实是用基础函数在做热图,为什么没有和以前一样把代码掰开揉碎了讲清楚,因为做热图的包有很多很多很多种,很大概率上不需要用基础函数自己写代码做热图。我学的时候也不是为了用它画热图只是用来打基础的,这里也只是为了介绍quantile(x,probs)
函数,所以不用太纠结代码的意思,如果你实在纠结就看我上一篇简书吧(第三部分),里面写的很清楚的,就是有点啰嗦~