R dplyr热图处理缺失值

时间:2017-10-11 11:58:46

标签: r dplyr heatmap

所以我在使用geom_tile()和dplyr包绘制热图时遇到了一个小问题。我认为这是一个简单的解决方案,但我还没能在任何地方找到答案。抱歉,如果有一个,我就错过了。

所以下面的代码是一个简单的例子:

Trivial <- tibble(
  Name1 = c("a","b","c"),
  Name2 = c("x","y","z"),
  Value = c(1,2,3)
)
Trivial %>%
  ggplot(aes(Name1, Name2)) +
    geom_tile(aes(fill = Value)) +
    scale_fill_gradient(low = "white", high = "green")

由此产生的热图显示灰色/空白空间,其中没有Name1和Name2组合的信息。有没有办法代替显示空白,我可以用白色(或任何其他颜色)填充它?或者,我可以在情节上加上“NA”来表明这些空格确实是空白的吗?

我尝试在scale_fill_gradient中使用na.value参数,但它不起作用。我假设因为表中没有NA。但是,我认为这可能是一种前进的方式。我会继续尝试,但任何帮助将不胜感激!

谢谢!

2 个答案:

答案 0 :(得分:2)

或者您只需添加them_classic()

Trivial %>%
    ggplot(aes(Name1, Name2)) +
    geom_tile(aes(fill = Value)) +
    scale_fill_gradient(low = "gray", high = "green") + 
    theme_classic()

image

我刚用low= "gray"因为背景为白色。

你也可以改变背景:

Trivial %>%
    ggplot(aes(Name1, Name2)) +
    geom_tile(aes(fill = Value)) +
    scale_fill_gradient() + 
    theme_classic() +
    theme(panel.background = element_rect(fill = "white", colour = "white"))

image2

答案 1 :(得分:1)

您可以使用expand()中的tidyr获取Name1Name2的所有组合,然后使用NA填充所有0,然后绘制热图:

library(tidyr)      
Trivial %>% expand(Name1, Name2) %>% 
  left_join(Trivial, by = c("Name1", "Name2")) %>%
  mutate( Value = ifelse(is.na(Value), 0, Value)) %>%
  ggplot(aes(Name1, Name2)) +
  geom_tile(aes(fill = Value)) +
  scale_fill_gradient(low = "white", high = "green")

结果如下:

output