r - 将标签添加到由 grid.arrange 从多个绘图制作的绘图

标签 r plot ggplot2

我在 this link 中有一个数据框 我有以下代码:

load("Fish11a.rda")
df=Fish11a
df=data.frame(Time=as.factor(df[,6]),RoiID=df[,3],Diameter=df[,8])
df$Time.hours=rep(1:10,each=104*max(df$RoiID),len=nrow(df))
df$Time <- factor(df$Time, levels=rev(levels(df$Time)))
df1=split(df,df$Time.hours)

br=lapply(split(df,df$Time.hours), function(x) {
  br=data.frame(x[c(1,round(nrow(x)*(1:4)/4)),])
  br$Min=c(0,15,30,45,60)
  return(br)
})

hle1=function(dfr,br,tenplot) {
  require(ggplot2)
  require(gtable)
  library(grid)
  
  #start plot
  g=ggplot(data=dfr, aes(x=factor(RoiID), y=Time, fill = Diameter)) +
    theme_minimal()  + coord_fixed(ratio=1) +
    geom_tile(colour = NA, width = 1.5, height = 1)+ 
    scale_fill_gradient(low="black",high="white")+
    theme(axis.title.x=element_blank(),
          axis.text.x=element_blank(),
          axis.ticks.x=element_blank())+
    scale_x_discrete(expand = c(0,0))+
    scale_y_discrete(name="Time (min)",
                     expand = c(0,0),
                     breaks=br$Time,labels=br$Min)+
    theme(axis.ticks.length = unit(0, "lines"))+
    ggtitle(tenplot)+
    theme(plot.title = element_text(size = 10, face = "bold"))
  
  # calculate segment coordinates
  segs <- c(.39, .23, .23, .15)
  segs_center <- cumsum(segs) - segs/2
  seg_ticks <- cumsum(segs)[1:3]
  seg_labels <- paste("S",seq_along(segs))
  
  # create graphicaal objects and gather as tree
  grobs <- grobTree(linesGrob(c(0,1), c(-1,-1),gp=gpar(lwd=3)),
                    segmentsGrob(x0=seg_ticks, x1=seg_ticks, y0=0, y1=-4,gp=gpar(lwd=2.5)),
                    textGrob(x=segs_center, y=-5, 
                             label = seg_labels, hjust = 0, gp = gpar(cex =.8)))
  
  # insert grobsTree in as annotation
  g <- g + annotation_custom( grob = grobs,  
                              ymin = -.3, ymax = 0.2, 
                              xmin = .25, xmax = max(dfr$RoiID))
  
  # override clipping for plotting outside of plotting area
  gt <- ggplot_gtable(ggplot_build(g))
  gt$layout$clip[gt$layout$name == "panel"] <- "off"
  grid.newpage()
  #grid.draw(gt)
  gt
}

#Draw and save plots

tiff(file="test11.tiff", width = 45,height=28, units = 'cm', res = 300)
require(gridExtra)   
grid.arrange(hle1(df1$"1",br$"1",c("1 hour-feed")),
             hle1(df1$"2",br$"2",c("2 hours-feed")),
             hle1(df1$"3",br$"3",c("3 hours-feed")),
             hle1(df1$"4",br$"4",c("4 hours-feed")),
             hle1(df1$"5",br$"5",c("5 hours-feed")),
             hle1(df1$"6",br$"6",c("6 hours-feed")),
             hle1(df1$"7",br$"7",c("7 hours-feed")),
             hle1(df1$"8",br$"8",c("8 hours-feed")),
             hle1(df1$"9",br$"9",c("9 hours-feed")),
             hle1(df1$"10",br$"10",c("10 hours-feed")),
             ncol=5,top=textGrob("Fish 11 - feed",gp=gpar(fontsize=18)))
dev.off()

我想在每行图的左侧添加标签 (26ppm, 39ppm) 并将标题 (Fish 11- feed) 向下移动,如下图所示: (P/S:(Fish 11-feed)和(Not this position)的删除线是注释,不包括在图像中)。

期待您的帮助。非常感谢!
enter image description here

最佳答案

编辑 gtable 可能是最简单的,例如通过在左侧添加带有行标签的列。这是一个示例,其中为方便起见将标签存储在 tableGrob 中,但您也可以手动执行此操作。您示例中顶部标签的额外空间可能是由于绘图边距,可以在 theme() 中设置。

library(ggplot2)
library(gridExtra)
library(grid)

my_fun <- function(id){
  ggplot() + ggtitle(paste(id, "hours-feed"))
}

pl <- lapply(seq_len(10), my_fun)

lg <- tableGrob(c("", "26ppm", "39ppm"), theme= ttheme_minimal())
rg <- arrangeGrob(grobs = pl, ncol=5,
             top = textGrob("Fish 11 - feed",gp=gpar(fontsize=18)))

grid.newpage()
grid.draw(cbind(lg, rg, size = "last"))

enter image description here

关于r - 将标签添加到由 grid.arrange 从多个绘图制作的绘图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38867430/

相关文章:

r - 如何比较多行中的两列

r - 尽管我在“描述”中使用了“导入”,但不需要命名空间依赖项错误

python - 通过 osmnx 从图中获取特定节点 id

python - 如何为 Mayavi 的网格图使用掩码?

r - 使用 geom_segment 连接 geom_hline

r - ggplot根据月份的阴影背景

r - 通过R中的dplyr将特定的列对收集到行中

r - 使用 bfast 检测季节性成分的变化

R:如何将 ggbiplot 与 pcaRes 对象一起使用?绘制具有缺失值的数据的 PCA 结果

r - 连续 y 轴刻度中的真负号