Что делать hjust и vjust делать, когда делать заговор, используя ggplot?



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



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


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



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

750   2  

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))

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

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

enter image description here

однако, это не совсем так просто. hjust и vjust как описано здесь как это работает в geom_text и theme_text (иногда). Один из способов думать об этом-думать о поле вокруг текста, и где находится точка отсчета отношение к этой коробке, в единицах относительно размера коробки (и, следовательно, разные для текстов разного размера). Ан hjust 0,5 и a 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))

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

Comments

    Ничего не найдено.