代码之家  ›  专栏  ›  技术社区  ›  Indrajeet Patil

防止ggplot2中的多层标题居中

  •  4
  • Indrajeet Patil  · 技术社区  · 6 年前

    getting constant text size while using atop function in r ).

    plotmath 使文本居中以避免额外的间距(此处以黄色突出显示)。我希望一切都与情节的右边对齐。

    (遗憾的是,我无法取代 substitute expression

    有什么建议吗?

    library(ggplot2)
    
    ggplot(iris, aes(Species, Sepal.Length)) +
      geom_boxplot()  +
      labs(caption = substitute(atop(
        atop(
          displaystyle("layer1 is small"),
          displaystyle("layer2 is a bit longer")
        ),
        "layer3 is super-duper longgggggggg"
      )))
    

    enter image description here

    2 回复  |  直到 6 年前
        1
  •  3
  •   Julius Vainora    6 年前

    让我们从好消息开始。下面的函数为 from to :

    push <- function(from, to)
      sprintf(paste("%", max(nchar(from), max(nchar(to))), "s"), from)
    

    接下来我们有三层,也可以使用 substitute (据我所知,在你的情况下,只有第一个使用它)。

    l1 <- substitute("layer1 is small")
    l2 <- "layer2 is a bit longer"
    l3 <- "layer3 is super-duper longgggggggg"
    

    坏消息是 push 仅使用mono字体才能达到所需的效果,而mono字体不是中的默认族 ggplot2 . 关于字体有很多问题,如果您愿意的话,也许您可以导入一些其他的单色字体。

    ggplot(iris, aes(Species, Sepal.Length)) +
      geom_boxplot()  +
      labs(caption = substitute(atop(atop(textstyle(l1), textstyle(l2)), textstyle(l3)), 
                                list(l1 = push(l1, list(l2 ,l3)),
                                     l2 = push(l2, list(l1, l3)), 
                                     l3 = push(l3, list(l2, l3))))) +
      theme(plot.caption = element_text(family = "mono"))
    

    enter image description here

        2
  •  1
  •   user10630867    6 年前

    gtable_add_caption <- function(p, cap, g = ggplotGrob(p), 
                                   hjust=1, x=unit(1,"npc"), pad = unit(c(2,2),"mm"),
                                   ...){
    
      for(ii in seq_along(cap)){
        line <- tryCatch(parse(text = cap[ii]), error = function(e) cap[ii])
        tg <- textGrob(line, x = x - pad[1], hjust = hjust, gp=gpar(...))
        hg <- grobHeight(tg) 
        g <- gtable_add_rows(g, hg + pad[2])
        g <- gtable_add_grob(g, tg, t = nrow(g), l=1, r=ncol(g))
      }
    
      g
    }
    
    p <- ggplot()
    ggplot(iris, aes(Species, Sepal.Length)) +
      geom_boxplot() ->p
    g <- gtable_add_caption(p, c("first line", "integral(frac(1,x-1)*dx,alpha,beta)", "thirdddddddddddddddddd line"))
    grid.newpage()
    grid.draw(g)