Что делать hjust и vjust делать, когда делать заговор, используя ggplot?
каждый раз, когда я делаю сюжет с помощью ggplot, я провожу немного времени, пытаясь разные значения для hjust и vjust в строке, как
+ opts(axis.text.x = theme_text(hjust = 0.5))
чтобы получить метки оси, чтобы выровнять, где метки оси почти касаются оси, и заподлицо с ней (выравнивается по оси, так сказать). Однако, я действительно не понимаю, что происходит. Часто,hjust = 0.5 дает такие резко отличающиеся результаты от hjust = 0.6, например, что я не смог понять это, просто играя вокруг с разными ценностями.
может ли кто-нибудь указать мне на исчерпывающее объяснение того, как работают варианты hjust и vjust?
2 ответов:
значение
hjustиvjustопределяются только между 0 и 1:
- 0 означает выравнивание по левому краю
- 1 означает правому краю
источник: ggplot2, Hadley Wickham, page 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))
чтобы понять, что происходит, когда вы изменить
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)
, чтобы исследовать, что происходит с
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)
вероятно, самым окончательным является рисунок B. 1 (d) книги ggplot2, приложения к которой доступны по адресу http://ggplot2.org/book/appendices.pdf.
однако, это не совсем так просто.
hjustиvjustкак описано здесь как это работает вgeom_textиtheme_text(иногда). Один из способов думать об этом-думать о поле вокруг текста, и где находится точка отсчета отношение к этой коробке, в единицах относительно размера коробки (и, следовательно, разные для текстов разного размера). Анhjust0,5 и avjust0,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))у первого есть метки, выровненные по левому краю (внизу), у второго они центрированы в некотором поле, поэтому их центры выстраиваются в линию, а у третьего они выровнены по правому краю (так что их правые стороны выстраиваются рядом с осью). Последнее, ну, я не могу объяснить связно. Это как-то связано с размером текста, размер широкого текста, и я не уверен, что еще.




Comments