防止在ggplot2中居中多层标题
preventing centering multilayered caption in ggplot2
这是我上一个问题 () 的第 2 部分。
现在的问题是如何防止 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"
)))
让我们从好消息开始吧。这是一个函数,它向 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"))
最简单的可能是在 gtable 中逐行添加文本,
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)
这是我上一个问题 (
现在的问题是如何防止 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"
)))
让我们从好消息开始吧。这是一个函数,它向 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"))
最简单的可能是在 gtable 中逐行添加文本,
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)