首页 文章

R ggplot:热图 . 特定颜色,如果值= 'X'

提问于
浏览
2

我正在使用ggplot和使用RColorBrewer在R中制作一些热图 . 我有一系列整数值,我正在绘制,但有些值是'无',我想为这些特定的颜色着色 . 有人可以建议最合适的方式来修改我的代码以添加此功能,包括添加第二个图例,显示“新颜色标签”无'?我对R很陌生,所以没有太多运气可以让我自己解决这个问题 .

非常感谢!! :)

示例数据

Target  A.tg_t0_rep_A   B.tg_t0_rep_B   C.tg_t0_rep_C   D.tg_t0_rep_D   E.tg_w2_rep_A   F.tg_w2_rep_B   G.tg_w2_rep_C   H.tg_w2_rep_D   I.tg_w4_rep_A   J.tg_w4_rep_B
1 : 12110501    None    0.5625  0.25    0.5714  None    None    0.5 None    None    0.2857
1 : 27262099    0.3333  0.8889  0.6667  0.9231  None    None    0.5556  0.6667  None    0.375

情节代码

library(ggplot2)
library(RColorBrewer)

data <- read.csv('test.csv', header =TRUE)
rownames(data)=data[,1]
data_shaped <- data.frame(sample = rep(colnames(data), each = nrow(data)),
                          dmr = rownames(data),
                          methylation_level = unlist(data))
# remove first n rows from dataset(first col header mistakenly being analysed)
data_shaped <- data_shaped[-c(1:2), ] 

# set colour palette
jBuPuFun <- colorRampPalette(brewer.pal(n = 9, "RdBu"))
paletteSize <- 256
jBuPuPalette <- jBuPuFun(paletteSize)

# heatmap!
ggplot(data_shaped, aes(x = sample, y = dmr, fill = methylation_level)) +
  theme(axis.text.x = element_text(angle = 90, hjust = 1, vjust = 0.5)) +
  geom_tile() +
  scale_fill_gradient2(high = jBuPuPalette[1],
                       mid = jBuPuPalette[paletteSize/2],
                       low = jBuPuPalette[paletteSize],
                       midpoint = (max(data_shaped$methylation_level) +
                                     min(data_shaped$methylation_level)) / 2,
                       name = "methylation_level")

1 回答

  • 3

    我不会引用你如何将"None"与数值混合 . 那些被读入的因素是什么?您可能希望将"None"值设置为 NA ,这是R的特殊缺失值 . 您可以通过设置 na.strings=c("","None")read.table 期间执行此操作 .

    但最后看起来 scale_fill_gradient2 函数有一个 na.value = 参数 . 因此,如果将值转换为true NA 值,则可以为它们设置颜色,就像对 highmid 等一样 .

    例:

    #sample data with missing values
    dd<-data.frame(
        expand.grid(x=1:10, y=1:10),
        value=rpois(10*10, 10)
    )
    dd$value[c(5,10,55,77)] <- NA
    

    现在做一个情节

    ggplot(dd, aes(x=x, y=y, fill=value)) +
       geom_tile() +
       scale_fill_gradient2(high="red",mid="white",low="blue", 
           na.value="yellow", midpoint=mean(dd$value, na.rm=T)
    )
    

    sample plot

相关问题