2017-03-24 38 views
1

假设我做了四次测量/实验(M1..M4),产生在5个位置上变化的强度值(loc_1 ... 5)。我观察了各种元素(n = 7)。现在我想使用ggplot2的facet_grid和geom_raster将结果汇总到一个图中。我结束了下图(见图)。当在ggplot2中使用facet_grid和geom_raster时填充行

现在的问题是是否有一个简单的解决方案来强制行填充每个面的空间(即在每个面板中放置未使用的行)。

谢谢

rm(list=ls()) 
library(ggplot2) 
library(reshape2) 

set.seed(123) 

# let's create a fake dataset 
nb.mesure <- 4 
n.row <- 200 
n.col <- 5 
nb.class <- 7 


d <- matrix(round(runif(n.row * n.col),2), nc=n.col) 
colnames(d) <- sprintf("Loc_%02d", 1:5) 

# These strings will be the row names of each heatmap 
# in the subsequent facet plot 
elements <- sample(replicate(n.row/2, 1:100)) 

# let's create a data.frame d 
d <- data.frame(d, 
       mesure = sort(rep(c("M1","M2","M3", "M4"), n.row/4)), 
       elements= elements, 
       class=sample(nb.class, 
          length(elements), 
          rep=T, 
          prob = seq(0.01, 0.25, length.out=7)) 
          ) 



# Data are melt 
dm <- melt(d, id.var=c("mesure", "elements", "class")) 
colnames(dm) <- c("mesure","elements", "class", "pos", "intensity") 

# Plotting 
p <- ggplot(dm, aes(x = pos, y = elements, fill = intensity)) 
p <- p + geom_raster()           
p <- p + facet_grid(mesure~class , scales = "free", space="free_y") 
p <- p + theme_bw() 
p <- p + theme(text = element_text(size=8)) 
p <- p + theme(text = element_text(family = "mono", face = "bold")) 
p <- p + theme(axis.text.y = element_blank(), 
       axis.ticks.y=element_blank(), 
       axis.text.x = element_text(colour="grey20", 
              size=6,angle=45, 
             vjust = 0.3)) 
print(p) 

Example resul

回答

1

如果你的目标是为mesure, elements, class所有缺少的组合引入NA值(或别的东西),并pos可以使用complete功能从tidyr包状所以:

library(tidyr) 

dm <- complete(dm, mesure, elements, class, pos, fill = list(intensity = NA)) 

enter image description here

UPDATE

如果你想有非NA值扩大,以填补你必须从facet_grid移开,并切换到facet_wrap各个方面。

p <- p + facet_wrap(mesure~class , scales = "free_y", nrow = 4) 

enter image description here

+0

感谢吉荣回答。我不想介绍NA(对不起,如果不清楚)。这个想法是为具有非NA值的行提供不同的高度,以便填充整个子面板。或者我会对一些垂直缩小子面板的方式感兴趣,以便只显示非NA值的行。我知道这有点奇怪,因为行应该指向每个班级中的相同元素。不过,我有隐藏的行名,因为在我的情况中,我只是有兴趣对M1..M4中的第1 ... 7类元素的强度有全局感觉。 – user451460

+0

顺便说一句,谢谢你的完整功能,我猜可能会非常有帮助。 – user451460

+0

不客气,我明白你的意思了。答案已更新。 –

相关问题