Каждый раз, когда я строю график с использованием ggplot, я трачу немного времени, пробуя разные значения для hjust и vjust в такой строке, как
+ opts(axis.text.x = theme_text(hjust = 0.5))
чтобы метки оси выровнялись так, чтобы метки оси почти касались оси, и находились на одном уровне с ней (так сказать, по оси). Тем не менее, я не очень понимаю, что происходит. Часто hjust = 0.5
дает такие резко отличающиеся результаты от hjust = 0.6
, например, что я не смог понять это, просто поиграв с разными значениями.
Кто-нибудь может дать мне исчерпывающее объяснение того, как работают варианты hjust и vjust?
Ответы:
Значение
hjust
иvjust
определяется только от 0 до 1:Источник: ggplot2, Хэдли Уикхем, стр. 196
(Да, я знаю, что в большинстве случаев вы можете использовать его за пределами этого диапазона, но не ожидайте, что он будет вести себя каким-то определенным образом. Это за пределами спецификации.)
hjust
контролирует горизонтальное выравнивание иvjust
контролирует вертикальное выравнивание.Пример должен прояснить это:
Чтобы понять, что происходит при изменении
hjust
текста по оси, необходимо понимать, что горизонтальное выравнивание для текста оси определяется не по оси x, а по всему графику (где это включает текст по оси y). (Это, на мой взгляд, неудачно. Было бы гораздо полезнее иметь выравнивание относительно оси.)Чтобы узнать, что происходит с
vjust
выравниванием меток осей:источник
Error in grid.Call("L_textBounds", as.graphicsAnnot(x$label), x$x, x$y, : Polygon edge not found (zero-width or zero-height?)
заvjust = .72
и выше.Вероятно, наиболее точным является рисунок B.1 (d) книги ggplot2, приложения к которой доступны по адресу http://ggplot2.org/book/appendices.pdf .
Однако не все так просто.
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\na","b","cdefghijk","l"),y=1:4)
- то есть с\n
переносом строки в одном из названий.hjust
иvjust
определены только между 0 и 1; поведение вне этого диапазона не должно иметь смысла.hjust=0
выравнивание левого края по метке;hjust=0.5
центры на тике;hjust=1
выравнивает правый край с меткой (перемещение блока относительно контрольной точки). Ноvjust
выровняйте внутри коробки размер самого высокого ярлыка.vjust
меток оси все метки одновременно выровнены друг с другом. Таким образом, все верхние края выравниваются, когда,vjust=1
а также все нижние края, когдаvjust=0
. Это имеет смысл для меня.