1. ホーム
  2. r

[解決済み] ggplot を使ってプロットするとき、hjust と vjust は何をするのですか?

2022-04-20 16:57:33

質問

ggplot を使ってプロットを作成するたびに、hjust と vjust の値を変えて、次のような行で少し時間をかけて試しています。

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

で、軸ラベルが軸にほぼ接触し、軸と同じ高さになるように並べる(いわば軸にジャストフィットする)。ところが、よくわからないんです。よくあることです。 hjust = 0.5 とは劇的に異なる結果をもたらします。 hjust = 0.6 例えば、いろいろな値で遊んでみたけど、よくわからなかったんだ。

hjust と vjust オプションがどのように機能するかについて、包括的な説明をどなたか教えていただけませんか?

どのように解決するのですか?

の値は hjustvjust は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") +
    theme(axis.title.y=element_text(angle=0))


p1 <- p + theme(axis.title.x=element_text(hjust=0)) + xlab("X-axis at hjust=0")
p2 <- p + theme(axis.title.x=element_text(hjust=0.5)) + xlab("X-axis at hjust=0.5")
p3 <- p + theme(axis.title.x=element_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 + theme(axis.text.x=element_text(vjust=0, colour="red")) + 
        xlab("X-axis labels aligned with vjust=0")
p2 <- p + theme(axis.text.x=element_text(vjust=0.5, colour="red")) + 
        xlab("X-axis labels aligned with vjust=0.5")
p3 <- p + theme(axis.text.x=element_text(vjust=1, colour="red")) + 
        xlab("X-axis labels aligned with vjust=1")


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

<イグ