geom_tile和facet_grid/facet_wrap用于相同高度的图块

 ik82jht 发布于 2023-02-09 19:13

使用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?谢谢你的帮助,对不起我的英语!

1 个回答
  • 您可以在绘图之前查看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)
    

    在此输入图像描述

    2023-02-09 19:15 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有