R dplyr处理缺失值的热图

R dplyr处理缺失值的热图,r,dplyr,heatmap,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)) + g

因此,在使用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")
微不足道的%
ggplot(aes(名称1、名称2))+
geom_瓷砖(aes(填充=值))+
比例填充梯度(低=白色,高=绿色)
由此生成的热图显示灰色/空白区域,其中没有名称1和名称2组合的信息。有没有办法用白色(或任何其他颜色)来代替显示空白?或者,我可以在情节上加上一个“NA”来表示这些空白确实是空白的吗

我曾尝试在scale\u fill\u gradient中使用na.value参数,但它不起作用。我假设,因为表中没有NAs。然而,我认为这可能是一条前进的道路。我会继续尝试,但任何帮助都将不胜感激

谢谢大家!

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

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")
结果如下所示:

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

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")
结果如下所示:


或者您可以添加
它们\u classic()

我只是使用了
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"))

或者您可以添加
它们\u classic()

我只是使用了
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"))

你知道这将如何扩展到数千种组合吗?它将扩展到ok ish,我想乔治提供的答案是一种更有效的方式。是的,两个答案都有效,我只是想找出在我的真实场景中哪一个最适合实施……我更喜欢这个解决方案,所以现在就实施它。然而,如果可伸缩性被证明是一个问题,我可能需要重新考虑。谢谢你的帮助:)你知道这将如何扩展到数千个组合吗?它将扩展到ok ish,我想乔治提供的答案是一种更有效的方式。是的,两个答案都有效,我只是想找出哪一个最适合在我的真实场景中实现…我更喜欢这个解决方案,因此,我们现在将实施它。然而,如果可伸缩性被证明是一个问题,我可能需要重新考虑。谢谢你的帮助:)