Что делают hjust и vjust при создании графика с использованием ggplot? - PullRequest
136 голосов
/ 01 сентября 2011

Каждый раз, когда я строю график, используя ggplot, я трачу немного времени, пробуя разные значения hjust и vjust в такой строке, как

+ opts(axis.text.x = theme_text(hjust = 0.5))

, чтобы выровнять метки на осях, где оси почтикоснитесь оси и вплотную к ней (так сказать, к оси).Тем не менее, я не очень понимаю, что происходит.Часто hjust = 0.5 дает такие резко отличающиеся результаты от, например, hjust = 0.6, что я не смог понять это, просто поиграв с разными значениями.

Может кто-нибудь дать мне исчерпывающее объяснение того, как работают опции hjust и vjust?

Ответы [ 2 ]

228 голосов
/ 01 сентября 2011

Значения hjust и vjust определены только от 0 до 1:

  • 0 означает выравнивание по левому краю
  • 1 означает выравнивание по правому краю

Источник: ggplot2, Hadley Wickham, стр. 196

(Да, я знаю, что в большинстве случаев вы можете использовать его за пределами этого диапазона, но не ожидайте, что онвести себя любым определенным образом. Это вне спецификации.)

hjust контролирует горизонтальное выравнивание и vjust контролирует вертикальное выравнивание.

Пример должен прояснить это:

td <- expand.grid(
    hjust=c(0, 0.5, 1),
    vjust=c(0, 0.5, 1),
    angle=c(0, 45, 90),
    text="text"
)

ggplot(td, aes(x=hjust, y=vjust)) + 
    geom_point() +
    geom_text(aes(label=text, angle=angle, hjust=hjust, vjust=vjust)) + 
    facet_grid(~angle) +
    scale_x_continuous(breaks=c(0, 0.5, 1), expand=c(0, 0.2)) +
    scale_y_continuous(breaks=c(0, 0.5, 1), expand=c(0, 0.2))

enter image description here


Чтобы понять, что происходит, когда вы изменяете текст hjust в оси, вы должны понимать, что горизонтальное выравнивание для текста оси определяется относительно не x-оси, но на весь график (где это включает в себя текст по оси Y).(Это, на мой взгляд, неудачно. Было бы гораздо полезнее иметь выравнивание относительно оси.)

DF <- data.frame(x=LETTERS[1:3],y=1:3)
p <- ggplot(DF, aes(x,y)) + geom_point() + 
    ylab("Very long label for y") +
    opts(axis.title.y=theme_text(angle=0))


p1 <- p + opts(axis.title.x=theme_text(hjust=0)) + xlab("X-axis at hjust=0")
p2 <- p + opts(axis.title.x=theme_text(hjust=0.5)) + xlab("X-axis at hjust=0.5")
p3 <- p + opts(axis.title.x=theme_text(hjust=1)) + xlab("X-axis at hjust=1")

library(ggExtra)
align.plots(p1, p2, p3)

enter image description here


Чтобы исследовать, чтопроисходит с vjust выравниванием меток осей:

DF <- data.frame(x=c("a\na","b","cdefghijk","l"),y=1:4)
p <- ggplot(DF, aes(x,y)) + geom_point()

p1 <- p + opts(axis.text.x=theme_text(vjust=0, colour="red")) + 
        xlab("X-axis labels aligned with vjust=0")
p2 <- p + opts(axis.text.x=theme_text(vjust=0.5, colour="red")) + 
        xlab("X-axis labels aligned with vjust=0.5")
p3 <- p + opts(axis.text.x=theme_text(vjust=1, colour="red")) + 
        xlab("X-axis labels aligned with vjust=1")


library(ggExtra)
align.plots(p1, p2, p3)

enter image description here

13 голосов
/ 01 сентября 2011

Вероятно, наиболее определенным является Рисунок B.1 (d) книги ggplot2, приложения к которой доступны по адресу http://ggplot2.org/book/appendices.pdf.

enter image description here

Однако не все так просто.hjust и vjust как описано, как это работает в geom_text и theme_text (иногда).Один из способов думать об этом - думать о рамке вокруг текста и о том, где контрольная точка находится относительно этой рамки, в единицах относительно размера рамки (и, таким образом, отличается для текстов разного размера).hjust 0,5 и vjust 0,5 центрируют прямоугольник в контрольной точке.Уменьшение hjust перемещает прямоугольник вправо на величину ширины окна, умноженную на 0.5-hjust.Таким образом, когда hjust=0, левый край рамки находится в контрольной точке.Увеличение hjust перемещает блок влево на величину ширины блока, умноженную на hjust-0.5.Когда hjust=1, прямоугольник перемещается на половину ширины прямоугольника слева от центра, что помещает правый край в контрольную точку.Если hjust=2, то правый край блока - это ширина блока слева от контрольной точки (центр равен 2-0.5=1.5 ширины блоков слева от контрольной точки. Для вертикали меньше - вверх, а больше - вниз.Рисунок B.1 (d) говорит, но он экстраполирует за пределы [0,1].

Но иногда это не работает. Например,

DF <- data.frame(x=c("a","b","cdefghijk","l"),y=1:4)
p <- ggplot(DF, aes(x,y)) + geom_point()

p + opts(axis.text.x=theme_text(vjust=0))
p + opts(axis.text.x=theme_text(vjust=1))
p + opts(axis.text.x=theme_text(vjust=2))

Три последних графикаидентично. Я не знаю, почему это так. Кроме того, если текст повернут, то это сложнее. Рассмотрим

p + opts(axis.text.x=theme_text(hjust=0, angle=90))
p + opts(axis.text.x=theme_text(hjust=0.5 angle=90))
p + opts(axis.text.x=theme_text(hjust=1, angle=90))
p + opts(axis.text.x=theme_text(hjust=2, angle=90))

У первого метки выровнены по левому краю (снизу), у второго -они центрированы в каком-то квадрате, поэтому их центры выровнены, а в третьем они выровнены по правому краю (так что их правые стороны выровнены рядом с осью). Последний, ну, я не могу объяснить связным образом.делать с размером текста, размером самого широкого текста, и я не уверен, что еще.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...