关于 ggplot2:R ggplot: 热图。如果值 = \\’X\\’,则为特定颜色

R+ggplot: Heatmap. Specific color if value = 'X'

我正在使用 ggplot 和 RColorBrewer 在 R 中制作一些热图。我正在绘制一系列整数值,但其中一些值是"无",我想将这些值着色为特定颜色。有人可以就修改我的代码以添加此功能的最合适方法提出建议,包括添加显示"新颜色标签"无"的第二个图例?我对 R 很陌生,所以没有太多运气靠自己搞定这个。

非常感谢!! :)

示例数据

1
2
3
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

情节代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
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")

我不确定您是如何将"无"与数值混合在一起的。那些被读入的因素?您可能希望将 "None" 值设置为 NA,这是 R\\ 的特殊缺失值。您可以通过设置 na.strings=c("","None").

read.table 期间执行此操作

但最后似乎 scale_fill_gradient2 函数有一个 na.value = 参数。因此,如果您将值转换为真正的 NA 值,那么您可以为它们设置颜色,就像为 highmid 等所做的一样。

示例:

1
2
3
4
5
6
#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

现在做一个情节

1
2
3
4
5
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