当Angular 在45度和90度之间时,如何校正x轴文本位置?

p4tfgftt  于 2023-04-18  发布在  Angular
关注(0)|答案(2)|浏览(159)

我很难理解ggplot的axis.text.x的交互:anglehjustvjust。我读到的所有内容都适用于Angular 在0到45之间的情况,但不适用于Angular 〉45和〈90的情况。
下面是一个最小的可重复示例:

library(ggplot2)   
p <- ggplot(mtcars, aes(1000 * mpg, hp)) +
      geom_point()

angle = 90的第一个图看起来和预期的一样,

p + theme(axis.text.x = element_text(angle = 90, hjust = 1, vjust = 0.5))

但是,与上面的图相比,当Angular 仅减小1度时(从angle = 90angle = 89),轴标签向下移动。

p + theme(axis.text.x = element_text(angle = 89, hjust = 1, vjust = 0.5))

任何见解赞赏。

bxjv4tth

bxjv4tth1#

这种行为的原因一直存在于未导出的函数ggplot2:::rotate_just()中,如果您在ggplot2:::element_grob.element_text-〉titleGrob-〉title_spec上运行debug,则可以找到该函数。
这是它的代码,在我当前的包版本(ggplot 2 3.4.2)中:

> ggplot2:::rotate_just
function (angle, hjust, vjust) 
{
    angle <- (angle %||% 0)%%360
    if (0 <= angle & angle < 90) {
        hnew <- hjust
        vnew <- vjust
    }
    else if (90 <= angle & angle < 180) {
        hnew <- 1 - vjust
        vnew <- hjust
    }
    else if (180 <= angle & angle < 270) {
        hnew <- 1 - hjust
        vnew <- 1 - vjust
    }
    else if (270 <= angle & angle < 360) {
        hnew <- vjust
        vnew <- 1 - hjust
    }
    list(hjust = hnew, vjust = vnew)
}

在第一种情况下,使用angle = 90, hjust = 1, vjust = 0.5,满足第二组条件,因此修改后的值为hjust = 0.5, vjust = 1
在第二种情况下,对于angle = 89, hjust = 1, vjust = 0.5,满足第一组条件,因此值保持不变,为hjust = 1, vjust = 0.5
如果你想让第二种情况的垂直对齐方式模仿第一种情况,设置vjust = 1就可以了(虽然我认为这是理论上的边缘情况,因为我想不出很多理由来使用angle = 89而不是真实的生活中的90...)

zqdjd7g9

zqdjd7g92#

尝试同时指定vjust = 0.5hjust = 0.5,这样就可以避免这个问题。

ggplot(mtcars, aes(x = 1000*mpg, y = hp)) +
geom_point() +
theme(
axis.text.x = element_text(angle = 75, vjust = .5, hjust = .5)
)

相关问题