web-dev-qa-db-ja.com

ggplotを使用してプロットを作成するとき、hjustとvjustは何をしますか?

Ggplotを使用してプロットを作成するたびに、次のような行でhjustとvjustに異なる値を試しながら少し時間を費やします。

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

軸ラベルが軸にほぼ接触する場所で軸ラベルを整列させて、それに対してフラッシュします(いわば軸に合わせて)。しかし、私は何が起こっているのか本当に理解していません。多くの場合、hjust = 0.5hjust = 0.6とは劇的に異なる結果をもたらします。たとえば、異なる値で遊んだだけではそれを理解できませんでした。

誰もがhjustとvjustオプションがどのように機能するかの包括的な説明を私に指摘できますか?

140
William Gunn

hjustおよびvjustの値は、0〜1の間でのみ定義されます。

  • 0は左揃えを意味します
  • 1は右揃えを意味します

出典:ggplot2、Hadley Wickham、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を含む場合)に関連して定義されることを理解する必要があります-axis text)。 (これは、私の考えでは残念なことです。軸に対して位置合わせする方がはるかに便利です。)

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)

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

enter image description here

233
Andrie

おそらく最も決定的なのはggplot2本の図B.1(d)であり、その付録は http://ggplot2.org/book/ appendices.pdf

enter image description here

ただし、それほど単純ではありません。 hjustおよびvjustは、説明どおり、geom_textおよびtheme_text(時々)での動作方法を示します。それを考える1つの方法は、テキストの周りのボックスと、そのボックスに関連する参照ポイントの位置を、ボックスのサイズに応じた単位で考えることです(したがって、異なるサイズのテキストでは異なります)。 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","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))

後者の3つのプロットは同じです。なぜだか分かりません。また、テキストを回転させると、より複雑になります。検討する

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

最初のラベルは左揃え(下)であり、2番目のラベルはいくつかのボックスの中央に揃えられて中央が揃えられ、3番目のラベルは右揃えにされています(したがって、右側が軸の隣に揃えられます)。最後の1つは、まあ、一貫した方法で説明できません。テキストのサイズ、最も幅の広いテキストのサイズに関係がありますが、他にどのようなものかわかりません。

13
Brian Diggs