【问题标题】:How to change fill colour of empty cells in ggplot heatmap如何更改ggplot热图中空单元格的填充颜色
【发布时间】:2017-11-08 06:09:04
【问题描述】:

我有一个数据集,其中 x 变量有一些缺失值。例如,下面的数据框显示 181930 和 610 有一组完整的 x 变量,1-7,而 1044,1114 等只有一个。

label   xvar value
181930  1    0
181930  2    0
181930  3    1
181930  4    0
181930  5    0
181930  6    0
181930  7    1
610  1    0
610  2    0
610  3    0
610  4    0
610  5    1
610  6    1
610  7    0
1044  1    0
1114  1    0
1156  1    1
1378  1    0
1834  1    1

我想使用 ggplot 生成一个热图,显示值为 1 的单元格。到目前为止,这是我的代码,但是对于只有一个 xvar 的标签显示一个空白单元格,而我希望它有一个颜色(白色)以匹配 0 值。

ggplot(activeDF,aes(xvar,factor(label)))+
  geom_tile(aes(fill=value),colour='white')+ 
  scale_x_continuous(breaks=round(seq(0,7)))+
  scale_fill_gradient(high=brewer.pal(10,'PiYG')[8],low='white',na.value = 'white')

不幸的是,na.value 对我不起作用。这是一张照片:

【问题讨论】:

    标签: r ggplot2 heatmap


    【解决方案1】:

    有时在 ggplot2 中做某事的直接方法是在绘图之前操作您的数据集。在这种情况下,扩展您的数据集使其包含您要绘制的所有组合是一种选择。

    我使用 tidyr::complete 以及包 dplyr 中的分组。这会为每个label 添加一个从 1 到 7 的 xvar 行。如果该行当前不存在,它将用NA 填充缺失值。 NA 似乎足以满足您的用例,但您也可以使用 fill 参数将缺失值设置为 0 或其他值。

    library(dplyr)
    library(tidyr)
    
    longdf = activeDF %>%
         group_by(label) %>%
         complete(xvar = 1:7)
    
    longdf
    
    # A tibble: 49 x 3
    # Groups:   label [7]
       label  xvar value
       <int> <int> <int>
     1   610     1     0
     2   610     2     0
     3   610     3     0
     4   610     4     0
     5   610     5     1
     6   610     6     1
     7   610     7     0
     8  1044     1     0
     9  1044     2    NA
    10  1044     3    NA
    # ... with 39 more rows
    

    使用扩展的数据集,您的绘图现在扩展到整个数据范围,因此平铺已完成。

    ggplot(longdf, aes(xvar, factor(label)) ) +
         geom_tile(aes(fill = value), colour = 'black') + 
         scale_x_continuous(breaks = round(seq(0, 7))) +
         scale_fill_gradient(high = brewer.pal(10, 'PiYG')[8], low='white', na.value = 'white')
    

    【讨论】:

    • 太好了,效果很好。感谢您的建议!而不是scale_fill_gradient,我最终切换到scale_fill_manual,因为我的值是0或1。但是ggplot2为NA值添加了一个图例条目。您是否也知道如何防止ggplot2 添加这个单独的图例条目?提前致谢。
    • @SpencerTrinh 您应该能够设置您的breaks 以从图例中删除NA
    【解决方案2】:

    试试这个+ theme(panel.background = element_rect(fill = 'white'))

    ggplot(activeDF,aes(xvar,factor(label)))+
    geom_tile(aes(fill=value),colour='white')+ 
    scale_x_continuous(breaks=round(seq(0,7)))+
    scale_fill_gradient(high=brewer.pal(10,'PiYG')[8],low='white',na.value = 'white') +
    theme(panel.background = element_rect(fill = 'white'))
    

    【讨论】:

    • 感谢您的建议。但是,如果我想将轮廓颜色更改为黑色以便清楚地看到每个单元格,它是有效的,我该如何实现呢?我将 colour='black' 更改为 geom_tile 但是我遇到了类似的问题,空白单元格没有轮廓
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-17
    • 2017-01-05
    相关资源
    最近更新 更多