我有一个带有p-values列的大数据框架,看起来像下面的代码片段
myPvalues<-data.frame(pvalues=c(0.00431279265850473,NA,0.00067818958352233,NA,NA,NA,0.00826354450511943,0.00605467431746949,0.00518801869607421,0.00896893103806155))
我想通过使用已经定义或要创建的热图将这些值映射到颜色。我知道如何制作一个图表,以适当的方式为数据着色,但我不知道如何在数据框架中添加一列,以保存这些颜色的值,这样数据框架现在也有一个列,如
myPvalues$Colors<-c("#75F4A1","#FFFFFFFF","#547CB8","#FFFFFFFF","#FFFFFFFF","#FFFFFFFF","#F9A13A","#D6F667","#92FC79","#F58046")
,"white"是NA值,其他值是颜色的代码(在这里,我放了任意代码,但它们需要来自颜色梯度的颜色,极值由min(myPvalues$pvalues)和max(myPvalues$pvalues)定义。
我一直在寻找,但没有找到完全解决这个问题的解决方案。有人能给我点指示吗?
首先定义渐变颜色。我随机选择了红色和绿色
library(tidyverse)
colfunc <- colorRampPalette(c('red', 'green'))
然后你需要计算当前颜色的排名。需要注意的是,colorRampPalette()
需要一个整数输入,因此值之间颜色的差异并不总是正确的。
pvalue_forColors <- myPvalues %>%
drop_na(pvalues) %>%
arrange(pvalues) %>%
mutate(rank = row_number())
myPvalues <- left_join(myPvalues, pvalue_forColors, by = 'pvalues')
生成渐变
the_colors <- tibble(rank = 1:max(myPvalues$rank, na.rm = T), color_code = colfunc(max(myPvalues$rank, na.rm = T)))
最后一列称为color_code
,用渐变和白色表示缺失值。
myPvalues %>%
left_join(the_colors, by = 'rank') %>%
mutate(color_code = if_else(is.na(pvalues), '#FFFFFFFF', color_code))