R:具有基于组的颜色的热图,包括灰色的NA值和包括的字符

问题描述

我正在尝试使用ggplot和geom_tile创建一个热图。填充颜​​色基于我的x值,而alpha基于值。基于一个小示例(左),我希望我的绘图看起来类似于此示例(右)。 两个问题:

  1. 我在alpha尺度上的字符元素出现错误-是否可以将它们像NA一样对待/忽略它们?
  2. 实际NA值使用与其所属组相同的颜色上色,而不是全部用灰色填充。

enter image description here

真实数据要大得多,并且包含多个方面。.希望这不会弄乱任何可能的解决方案。 这是我的示例数据集和我的(半工作)代码


X <- rep(st,each=3)
Y <- rep(st,times=3)

Values<- c('Apple',2,3,NA,"Banana",1,"Pear")

Data <- data.frame(X,Y,Values)

ggplot(Data,mapping = aes(x=X,y=Y,fill=X,alpha=Values # excluding this part I get a result,just not as I want it
       )) + 
  geom_tile(colour="white") +
  ylab("Y") + 
  xlab("X")+
  scale_fill_manual("Assay",values = c( 'red','yellow','green'),na.value = 'grey')+
  scale_alpha("Value",na.value = 0.02)+
  ggtitle("Results Summary")+       
  theme( strip.text.y.left = element_text(angle = 0))+
  geom_text(label=Data$Values)

在此先感谢您的帮助:)

解决方法

可以通过将Values转换为数字,即将as.numeric(Values)映射到alpha来解决您的第一个问题。

关于第二个问题。当您在填充上映射X时,图块会根据X进行着色。如果要填充NA以及X==Y处的图块,则必须相应地定义填充颜色。为此,我的方法在df中添加了列fill,并使用了scale_fill_identity

请注意,我将alphafill移到了geom_tile中,以便它们不会传递到geom_text ...

...并按照@AllanCameron的建议,我颠倒了“ Y”的顺序,以使绘图与您所需的输出一致。

library(ggplot2)
library(dplyr)

X <- rep(c('Apple',"Banana","Pear"),each=3)
Y <- rep(c('Apple',times=3)
Y <- factor(Y,levels = c("Pear","Apple"))

Values<- c('Apple',2,3,NA,1,"Pear")

Data <- data.frame(X,Y,Values)
Data <- Data %>% 
  mutate(fill = case_when(
    is.na(Values) ~ "grey",X == Y ~ "white",X == "Apple" ~ "red",X == "Banana" ~ "yellow",X == "Pear" ~ "green"
  ))

ggplot(Data,mapping = aes(x=X,y=Y)) + 
  geom_tile(aes(fill=fill,alpha=as.numeric(Values)),colour="white") +
  ylab("Y") + 
  xlab("X")+
  scale_fill_identity("Assay") +
  scale_alpha("Value")+
  ggtitle("Results Summary")+       
  theme(strip.text.y.left = element_text(angle = 0))+
  geom_text(aes(label=if_else(!is.na(Values),Values,"NA")))
#> Warning in FUN(X[[i]],...): NAs introduced by coercion