使用ggplot从热图中的透明度中排除单元格
Excluding cells from transparency in heatmap with ggplot
我正在尝试生成一个热图,我可以在其中显示每个单元格的多个级别的信息。对于每个单元格,我想根据它在一个变量中的值显示不同的颜色,然后用透明度 (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 定义的阴影也会根据颜色(或 "fill") geom_tile。我希望这些单元格即使在覆盖透明度后也能保持白色。
#Create sample dataframe
df <- 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"= c(1,2,NA,4,5,6,NA,8,9),
"alpha_var" = c(7,12,0,3,2,15,0,6,15))
#Convert factor columns to numeric
df$col_var<- as.numeric(df$col_var)
df$alpha_var<- as.numeric(df$alpha_var)
#Cut display variable into breaks
df$col_var_cut <- cut(df$col_var,
breaks = c(0,3,6,10),
labels = c("cat1","cat2", "cat3"))
#Plot
library(ggplot2)
ggplot(df, aes (x = x_pos, y = y_pos, fill = col_var_cut, label = col_var)) +
geom_tile () +
geom_text() +
scale_fill_manual(values=(brewer.pal(3, "RdYlBu")),na.value="white") +
geom_tile(aes(alpha = alpha_var), fill ="gray29")+
scale_alpha_continuous("alpha_var", range=c(0,0.7), trans = 'reverse')+
theme_bw() +
theme(axis.text.x = element_text(angle = 90, hjust = 1))
我希望将上面代码生成的热图中的单元格 "AZ" 和 "CX" 着色为白色而不是灰色,这样 alpha 透明度不适用于它们。在我的数据中,这些单元格在颜色变量 (col_var) 中具有 NA,并且在 transparency/alpha 变量 (alpha_var) 中可以具有 NA 或 0 的值(如示例代码中所示) .
如果这不可能,那么我想知道是否有其他选项可以在热图中显示两个变量并使 col_var 中的 NA 单元格保持白色?我很乐意使用其他包或替代热图布局,例如每个单元格的大小或其边框的厚度根据 alpha_var 的值而变化的布局。但是,我也不确定如何实现这一目标。
提前致谢,对于示例代码中的繁琐部分,我深表歉意(我仍在学习 R,这是我第一次在这里提问)。
你不远。请参阅下面的可能解决方案。第一个图显示了在 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 创建
我正在尝试生成一个热图,我可以在其中显示每个单元格的多个级别的信息。对于每个单元格,我想根据它在一个变量中的值显示不同的颜色,然后用透明度 (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 定义的阴影也会根据颜色(或 "fill") geom_tile。我希望这些单元格即使在覆盖透明度后也能保持白色。
#Create sample dataframe
df <- 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"= c(1,2,NA,4,5,6,NA,8,9),
"alpha_var" = c(7,12,0,3,2,15,0,6,15))
#Convert factor columns to numeric
df$col_var<- as.numeric(df$col_var)
df$alpha_var<- as.numeric(df$alpha_var)
#Cut display variable into breaks
df$col_var_cut <- cut(df$col_var,
breaks = c(0,3,6,10),
labels = c("cat1","cat2", "cat3"))
#Plot
library(ggplot2)
ggplot(df, aes (x = x_pos, y = y_pos, fill = col_var_cut, label = col_var)) +
geom_tile () +
geom_text() +
scale_fill_manual(values=(brewer.pal(3, "RdYlBu")),na.value="white") +
geom_tile(aes(alpha = alpha_var), fill ="gray29")+
scale_alpha_continuous("alpha_var", range=c(0,0.7), trans = 'reverse')+
theme_bw() +
theme(axis.text.x = element_text(angle = 90, hjust = 1))
我希望将上面代码生成的热图中的单元格 "AZ" 和 "CX" 着色为白色而不是灰色,这样 alpha 透明度不适用于它们。在我的数据中,这些单元格在颜色变量 (col_var) 中具有 NA,并且在 transparency/alpha 变量 (alpha_var) 中可以具有 NA 或 0 的值(如示例代码中所示) .
如果这不可能,那么我想知道是否有其他选项可以在热图中显示两个变量并使 col_var 中的 NA 单元格保持白色?我很乐意使用其他包或替代热图布局,例如每个单元格的大小或其边框的厚度根据 alpha_var 的值而变化的布局。但是,我也不确定如何实现这一目标。
提前致谢,对于示例代码中的繁琐部分,我深表歉意(我仍在学习 R,这是我第一次在这里提问)。
你不远。请参阅下面的可能解决方案。第一个图显示了在 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 创建