使用ggplot,我想用面板表示图形图块,但每个面板使用相同的高度图块.我有这个图:
dataSta <- list(sites=rep(paste("S", 1:31),each=12), month=rep(1:12,31), value=round(runif(31*12, min=0, max=3000)), panel=c(rep("Group 1",16*12),rep("Group 2", 12*12), rep("Group 3", 3*12))) library(ggplot2) library(grid) base_size <- 9 windows() ggplot(data.frame(dataSta), aes(factor(month), sites)) + geom_tile(aes(fill = value), colour = "black")+ facet_wrap(~panel, scale="free_y", nrow=3)+ theme_grey(base_size = base_size) + labs(x = "",y = "") + scale_x_discrete(expand = c(0, 0)) + scale_y_discrete(expand = c(0, 0)) + theme(legend.title = element_blank(), axis.ticks = element_blank(), axis.text.x = element_text(size = base_size *0.8, hjust = 0), panel.margin = unit(0,"lines"), strip.text = element_text(colour="red3", size=10, face=2))
但是瓷砖的高度在面板之间是不同的.我尝试使用facet_grid:
windows() ggplot(data.frame(dataSta), aes(factor(month), sites)) + geom_tile(aes(fill = value), colour = "black")+ facet_grid(panel~., scales="free_y", space="free")+ theme_grey(base_size = base_size) + labs(x = "",y = "") + scale_x_discrete(expand = c(0, 0)) + scale_y_discrete(expand = c(0, 0)) + theme(legend.title = element_blank(), axis.ticks = element_blank(), axis.text.x = element_text(size = base_size *0.8, hjust = 0), panel.margin = unit(0,"lines"), strip.text = element_text(colour="red3", size=10, face=2))
解决了瓷砖高度的问题,但面板(组1 ...组3)的标签不在面板的顶部.是否可以使用facet_grid更改面板标签的位置?或者组合facet_grid和facet_wrap?谢谢你的帮助,对不起我的英语!
您可以在绘图之前查看ggplot包含的内容,并相应地重新调整面板.
g <- ggplot_build(p) ## find out how many y-breaks are in each panel ## to infer the number of tiles vtiles <- sapply(lapply(g$panel$ranges, "[[", "y.major"), length) ## convert the plot to a gtable object gt <- ggplot_gtable(g) ## find out which items in the layout correspond to the panels ## we refer to the "t" (top) index of the layout panels <- gt$layout$t[grepl("panel", gt$layout$name)] ## replace the default panel heights (1null) with relative sizes ## null units scale relative to each other, so we scale with the number of tiles gt$heights[panels] <-lapply(vtiles, unit, "null") ## draw on a clean slate library(grid) grid.newpage() grid.draw(gt)