Начнем с хороших новостей. Вот функция, которая добавляет в 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"))