R:具有基于组的颜色的热图,灰色的 NA 值和包含的字符
R: Heatmap with colour based on groups, NA values in grey and characters included
我正在尝试使用 ggplot 和 geom_tile 创建热图。填充颜色基于我的 x 值和基于值的 alpha。基于小示例(左),我希望我的 Plot 看起来类似于此示例(右)。
两个问题:
- 我的 alpha 标度上的字符元素出现错误 - 是否可以像 NA 一样对待它们/忽略它们?
- 实际的 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)
提前感谢您的帮助:)
您的第一个问题可以通过将 Values
转换为数字来解决,即将 as.numeric(Values)
映射到 alpha
.
关于第二期。当您在填充上映射 X
时,图块会根据 X
着色。如果您想以不同方式填充 NA 以及 X==Y
的拼贴,那么您必须相应地定义填充颜色。为此,我的方法向 df 添加一列 fill
并使用 scale_fill_identity
.
请注意,我将 alpha
和 fill
移到了 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
我正在尝试使用 ggplot 和 geom_tile 创建热图。填充颜色基于我的 x 值和基于值的 alpha。基于小示例(左),我希望我的 Plot 看起来类似于此示例(右)。 两个问题:
- 我的 alpha 标度上的字符元素出现错误 - 是否可以像 NA 一样对待它们/忽略它们?
- 实际的 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)
提前感谢您的帮助:)
您的第一个问题可以通过将 Values
转换为数字来解决,即将 as.numeric(Values)
映射到 alpha
.
关于第二期。当您在填充上映射 X
时,图块会根据 X
着色。如果您想以不同方式填充 NA 以及 X==Y
的拼贴,那么您必须相应地定义填充颜色。为此,我的方法向 df 添加一列 fill
并使用 scale_fill_identity
.
请注意,我将 alpha
和 fill
移到了 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