2

我正在尝试使用 ggplot 和 geom_tile 创建热图。填充颜​​色基于我的 x 值和基于值的 alpha。基于小例子(左),我希望我的情节看起来与这个例子(右)相似。两个问题:

  1. 我的 alpha 比例尺上的字符元素出现错误 - 是否可以将它们视为 NA/忽略它们?
  2. 实际 NA 值的颜色与其所属组的颜色相同,而不是全部填充灰色。

在此处输入图像描述

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


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

Values<- c('Apple', 2,3,NA, "Banana", 3,1,2,"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)

在此先感谢您的帮助:)

4

1 回答 1

3

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

关于第二个问题。当您映射X填充时,瓷砖会根据X. 如果你想以不同的方式填充 NA 以及瓷砖,X==Y那么你必须相应地定义你的填充颜色。为此,我的方法fill在 df 中添加了一列并使用scale_fill_identity.

请注意,我将alphaandfill移入geom_tile,以便这些不会传递给geom_text...

...并按照@AllanCameron 的建议,我颠倒了“Y”的顺序,以便情节与您想要的输出一致。

library(ggplot2)
library(dplyr)

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

Values<- c('Apple', 2,3,NA, "Banana", 3,1,2,"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

于 2020-08-22T11:30:24.617 回答