Увеличьте пространство между axis.title и axis.text в ggplot2 (версия >= 0.9.0)
В настоящее время я использую последнюю версию ggplot2 из github.
В версии 0.8.9 я мог бы сделать следующее, чтобы увеличить расстояние между axis.title и axis.text:
До:
ggplot(diamonds, aes(clarity)) + geom_bar() + opts(
axis.title.x = theme_text(vjust=-1.1)
)
![]()
Fix:
ggplot(diamonds, aes(clarity)) + geom_bar() + opts(
axis.title.x = theme_text(vjust=-1.1),
plot.margin = unit(c(1, 1, 0.8, 0.5), "lines")
)
![link to graph]()
а axis.title становится полностью видимым.
В последней версии ggplot2 plot.margin не влияет на axis.title:
ggplot(diamonds, aes(clarity)) + geom_bar() + opts(
axis.title.x = theme_text(vjust=-0.2),
plot.margin = unit(c(1, 1, 2, 0.5), "lines"))
![link to graph]()
(обратите внимание на увеличенное нижнее поле - я не могу получить plot.background для работы в последней версии разработки)
Похоже, что 0.8.9 позволяет оси .title перемещаться над дополнительным пространством, созданным plot.margin, но это не разрешено в последней версии разработки.
Есть ли новый способ выполнить эту задачу (или быстро исправить ее) в последней версии разработки?
Любая помощь была оценена.
Ответы
Ответ 1
Я закрываю вопрос, поскольку исправление, которое я сделал, похоже, сохраняется (см. ниже).
Я нашел следующий код в plot-render.r: 64:
xlab_height <- grobHeight(xlabel) +
if (is.null(labels$x)) unit(0, "lines") else unit(0.5, "lines")
plot_table <- gtable_add_rows(plot_table, xlab_height)
plot_table <- gtable_add_grob(plot_table, xlabel, name = "xlab",
l = panel_dim$l, r = panel_dim$r, t = -1)
ylab_width <- grobWidth(ylabel) +
if (is.null(labels$y)) unit(0, "lines") else unit(0.5, "lines")
plot_table <- gtable_add_cols(plot_table, ylab_width, pos = 0)
plot_table <- gtable_add_grob(plot_table, ylabel, name = "ylab",
l = 1, b = panel_dim$b, t = panel_dim$t)
который я изменил на:
xlab_height <- grobHeight(xlabel) +
if (is.null(labels$x)) unit(0, "lines") else unit(0.5, "lines")
plot_table <- gtable_add_rows(plot_table, xlab_height)
plot_table <- gtable_add_grob(plot_table, xlabel, name = "xlab",
l = panel_dim$l, r = panel_dim$r, t = -1, clip = "off") <---- here
ylab_width <- grobWidth(ylabel) +
if (is.null(labels$y)) unit(0, "lines") else unit(0.5, "lines")
plot_table <- gtable_add_cols(plot_table, ylab_width, pos = 0)
plot_table <- gtable_add_grob(plot_table, ylabel, name = "ylab",
l = 1, b = panel_dim$b, t = panel_dim$t, clip = "off") <---- here
Это позволяет использовать hjust/vjust в сочетании с plot.margin, чтобы перемещать оси без заголовков.
По запросу я заполнил эту ошибку на github.
Ответ 2
Как это сделать правильно
Используйте margin
атрибут element_text
для axis.title
в theme
.
Я использую разные поля для x и y, так как я поворачиваю заголовок y в горизонтальное положение (упрощая чтение).
library(ggplot2)
library(gridExtra)
ggplot(diamonds, aes(clarity)) +
geom_bar() +
theme(
axis.title.x = element_text(margin = unit(c(3, 0, 0, 0), "mm")),
axis.title.y = element_text(margin = unit(c(0, 3, 0, 0), "mm"), angle = 0)
)
![Демонстрация маркера названия оси]()
Старый хак
opts
и theme_text
больше не поддерживаются ggplot. Поэтому мое быстрое и грязное решение состоит в том, чтобы просто добавить разрывы строк в начале или в конце заголовка. Это может быть уродливым, но выполняется с минимальными усилиями.
ggplot(diamonds, aes(clarity)) +
geom_bar() +
xlab("\nClarity") + ylab("Count\n")