基础函数画热图里特别有用的函数——quantile(x,probs)

今日任务:
学习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函数后

这样得到的图是不是好很多了,其实只是对上面那个进行了微调,只有得到颜色浓度矩阵的那步使用了一下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)函数,所以不用太纠结代码的意思,如果你实在纠结就看我上一篇简书吧(第三部分),里面写的很清楚的,就是有点啰嗦~

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容