防止在ggplot2中将多层标题居中

时间:2018-11-10 14:07:53

标签: r ggplot2 plotmath

这是我上一个问题(getting constant text size while using atop function in r)的第二部分。

现在,问题涉及到如何防止new MaterialApp( routes: <String, WidgetBuilder>{ // define the routes YOUR_SCREEN_ROUTE_NAME: (BuildContext context) => new YourScreen(), }, ) 居中放置文字,以避免多余的空格(此处以黄色突出显示)。我希望所有内容都与图的右侧对齐。

(很遗憾,如果您的建议是这样,我不能用plotmath代替substitute。)

有什么建议吗?

expression

enter image description here

2 个答案:

答案 0 :(得分:2)

让我们从好消息开始。这是一个向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仅使用单色字体才能达到所需的效果,这不是ggplot2中的默认字体。关于字体,SO上存在多个问题,因此,如果您愿意,也许可以导入其他一些单色字体。

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

答案 1 :(得分:1)

最简单的方法是在gtable中逐行添加文本grob,

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)