在子集化时使用geom tile自动重新计算R ggplot

时间:2017-10-01 23:55:57

标签: r ggplot2 dplyr

我正在尝试使用包含多个因素的大型数据集创建热图。我想首先通过绘制所有数值和所有因素的热图来获得鸟瞰图。那么,我想通过各种因素对热图图进行子集 - 但是ggplot2::geom_tile重新计算热图,以便根据我所采用的任何因素绘制相对丰度。

library(reshape2)
library(ggplot2)
library(dplyr)

#Test data
df <- data.frame(
   Measurement = c(1:30),
   CA = rep(rnorm(30, mean=20, sd=5)),
   TX = rep(rnorm(30, mean=18, sd=5)),
   NY = rep(rnorm(30, mean=34, sd=2))
 )
df.melt <- melt(df,id = c("Measurement"))

基本热图绘图代码。我的实际数据包括几个因素/列,我想从中提取数据进行各种比较。

#Basic plot
ggplot(data = df.melt, 
       aes(x = variable, y = Measurement, colors = value, fill = value)) + 
  geom_tile(color = "black") + 
  scale_fill_gradientn(colors = c("lightyellow", "darkred"))

我希望输出颜色与测量的相对丰度相对应。所以我可以看看CA,TX和NY的相对变化。这将是我的“基础情节”。

df.melt.reabun <- df.melt %>% group_by(Measurement) %>% 
    mutate(RelAbun = value/sum(value))
df.melt.reabun <- as.data.frame(df.melt.reabun)

#New plot with relative abundance
ggplot(data = df.melt.reabun, 
       aes(x = variable, y = Measurement, colors = RelAbun, fill = RelAbun)) +
  geom_tile(color = "black") + 
  scale_fill_gradientn(colors = c("lightyellow", "darkred"))

我还想做的是能够重新绘制我想要的和相对丰富度以在ggplot tile中自动计算。

#Assign plot object  
heat <- ggplot(data = df.melt.reabun, 
               aes(x = variable, y = Measurement, colors = RelAbun, fill = RelAbun)) + 
  geom_tile(color = "black")+ 
  scale_fill_gradientn(colors = c("lightyellow", "darkred"))

#Select variable to subset data
alt <- c("CA", "TX")

#Subset ggplot object
heat %+% subset(df.melt.reabun, variable %in% alt)

但是这个输出不正确,因为它只显示包含CA,TX和NY的计算的相对丰度。

我希望每次将df子集化以在此步骤中绘制时重新计算相对丰度:heat %+% subset()

我有一种感觉,我可以顺利地将group_bygeom_tile结合起来自动执行此操作..但我无法弄明白。任何帮助,将不胜感激。我有很多我想看的热图组合,我不想每次“手动”重新计算相对丰度。

1 个答案:

答案 0 :(得分:1)

通常建议在将数据框传递给ggplot之前进行数据处理。在这种情况下,类似下面的内容可以起作用:

subsetFun <- function(df, var.filter){
  return(df %>% 
           filter(variable %in% var.filter) %>%
           group_by(Measurement) %>%
           mutate(RelAbun = value / sum(value)) %>%
           ungroup())
}

heat %+% subsetFun(df.melt.reabun, alt)

plot