使用ggplot从热图中的透明度中排除单元格

时间:2019-07-04 04:10:11

标签: r ggplot2 heatmap

我正在尝试生成一个热图,以便在每个单元格上显示多个级别的信息。对于每个单元格,我希望根据其在一个变量中的值来显示不同的颜色,然后将其覆盖在透明度(alpha)上,该透明度将根据单元格对另一个变量的值对其进行着色。

此处(Place 1 heatmap on another with transparency in R)已解决了类似的问题 和这里(Making a heatmap in R varying both color and transparency)。在这两种情况下,建议使用ggplot并覆盖两个geom_tiles,其中一个带有颜色,一个带有透明度。

我设法覆盖了两个geom_tiles(请参见下面的代码)。但是,在我的情况下,问题是由透明性(或“ alpha”)geom_tile定义的阴影还会使应根据颜色(或“填充”)geom_tile保留为白色或空白的某些单元格着色。我希望这些单元格即使覆盖了透明性也能保持白色。

import cv2
video_capture = cv2.VideoCapture(....)

我希望由上面的代码产生的热图中的单元格“ AZ”和“ CX”被着色为白色而不是灰色,以使Alpha透明度不适用于它们。在我的数据中,这些单元格的颜色变量(col_var)具有NA,透明度/ alpha变量(alpha_var)可以具有NA或0(如示例代码)。

如果这不可能,那么我想知道是否还有其他选项可以在热图中显示两个变量并使col_var中的NA单元保持白色?我很高兴使用其他程序包或替代的热图布局,例如每个单元格的大小或其边框的厚度根据alpha_var的值而变化的布局或布局。但是,我也不知道如何实现这一目标。

预先感谢我为示例代码中的繁琐代码表​​示歉意(我仍在学习R,这是我第一次在这里提问)。

1 个答案:

答案 0 :(得分:0)

忘记我的评论。你不远请参阅下面的可能的解决方案。第一个图显示了在geom_tile调用本身中添加透明度的实现-注意,我从图中删除了trans = reverse规范。

图2只是在其他图的顶部添加了白色图块-简单的技巧,当您希望以不同的方式绘制某些数据点时,您经常会发现这很必要。

请注意,我在下面的代码中添加了一些小注释。

# creating your data frame with better name - df is a base R function and not recommended as example name. 
# Also note that I removed the quotation marks in the data frame call - they were not necessary. I also called as.numeric directly. 
mydf <- data.frame(x_pos = c("A","A","A","B","B","B","C","C","C"), y_pos = c("X","Y","Z","X","Y","Z","X","Y","Z"), col_var= as.numeric(c(1,2,NA,4,5,6,NA,8,9)), alpha_var = as.numeric(c(7,12,0,3,2,15,0,6,15)))

mydf$col_var_cut <- cut(mydf$col_var, breaks = c(0,3,6,10), labels = c("cat1","cat2", "cat3"))

#Plot

library(tidyverse) 
library(RColorBrewer) # you forgot to add this to your reprex

ggplot(mydf, aes (x = x_pos, y = y_pos, fill = col_var_cut, label = col_var)) +
  geom_tile(aes(alpha = alpha_var)) +
  geom_text() +
  scale_fill_manual(values=(brewer.pal(3, "RdYlBu")), na.value="white")
#> Warning: Removed 2 rows containing missing values (geom_text).


# a bit hacky for quick and dirty solution. Note I am using dplyr::filter from the tidyverse

ggplot(mapping = aes(x = x_pos, y = y_pos, fill = col_var_cut, label = col_var)) +
  geom_tile(data = filter(mydf, !is.na(col_var))) +
  geom_tile(data = filter(mydf, !is.na(col_var)), aes(alpha = alpha_var), fill ="gray29")+
  geom_tile(data = filter(mydf, is.na(col_var)), fill = 'white') +
  geom_text(data = mydf) + 
  scale_fill_manual(values = (brewer.pal(3, "RdYlBu"))) +
  scale_alpha_continuous("alpha_var", range=c(0,0.7), trans = 'reverse')  
#> Warning: Removed 2 rows containing missing values (geom_text).

reprex package(v0.2.1)于2019-07-04创建