Подтвердить что ты не робот

Увеличьте пространство между 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, но это не разрешено в последней версии разработки.

Есть ли новый способ выполнить эту задачу (или быстро исправить ее) в последней версии разработки?

Любая помощь была оценена.

4b9b3361

Ответ 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")