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


159

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

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

軸ラベルが軸にほぼ接触し、軸に対して同じ高さになるように軸ラベルを揃えます(いわば軸に揃えます)。しかし、何が起こっているのか本当にわかりません。多くの場合、hjust = 0.5たとえばとは劇的に異なる結果が得られるhjust = 0.6ため、さまざまな値を試してみただけではそれを理解できませんでした。

hjustオプションとvjustオプションがどのように機能するかについての包括的な説明を誰かに教えてもらえますか?


1
最初の回答へのコメントで、具体的な例を示しました。明らかに0-1以外の数値の使用は定義されていません。これは、hjust = -1が奇妙な動作をする理由を説明しない場合、少なくとも奇妙なことが予想されることを説明しています。
ウィリアムガン

回答:


277

hjustおよびの値は、vjust0〜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))

ここに画像の説明を入力してください


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)

ここに画像の説明を入力してください


1
したがって、angle = 45の場合、さまざまな長さの軸ラベル(25から5文字など)があると、単語の境界の右または左に揃えられません。ここで軸を見てみましょう。angle= 45を使用する場合、どのようにして右揃えにし、軸に対してフラッシュすることができますか?
ウィリアムガン

私はそれを試しました、そして私Error in grid.Call("L_textBounds", as.graphicsAnnot(x$label), x$x, x$y, : Polygon edge not found (zero-width or zero-height?)vjust = .72それ以上に達します。
ウィリアムガン

1
@WilliamGunn私はあなたのコードで新しい質問を投稿することをお勧めします。
Andrie

1
optは廃止されたので、軸のタイトルの位置をどのように調整しますか?
Cyrus Mohammadian

1
@CyrusMohammadian、私は現在のggplot2構文で動作するようにこの回答を編集しました。
ドロップレット

16

おそらく最も決定的なのは、ggplot2ブックの図B.1(d)であり、その付録はhttp://ggplot2.org/book/appendices.pdfから入手できます

ここに画像の説明を入力してください

ただし、それほど単純ではありません。 hjustそして、vjustとして、それがどのように働くかある説明geom_texttheme_text(時々 )。それを考える1つの方法は、テキストの周りのボックスを考えることであり、参照ポイントがそのボックスに関連している場合、ボックスのサイズに相対的な単位で(したがって、異なるサイズのテキストでは異なる)。hjust0.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番目のラベルは右揃えです(右側が軸の横に揃っています)。最後のものはまあ、まとまりのある説明はできません。これはテキストのサイズ、最も幅の広いテキストのサイズに関係しており、他に何があるかわかりません。


これに感謝します。これは、角度= 90の場合に役立ちますが、角度= 90の代わりに角度= 45を使用すると、ラベルの右揃えが機能しなくなる理由がわかりません。angle = 45、hjust = 0の動作を理解していますが、angle = 45、hjust = -1は奇妙です。
ウィリアムガン

最初の例は実際に機能します。機能しないと思う理由は、すべてのラベルの高さが同じだからです。DF <- data.frame(x=c("a\na","b","cdefghijk","l"),y=1:4)-の\nいずれかのタイトルに改行を入れて、もう一度試してください。
Andrie

@ウィリアム、私は@アンドリーが正しいと思います。hjustそしてvjustのみ0と1の間に定義されています。その範囲外の動作は意味をなす必要はありません。
Brian Diggs、2011

@Andrie、あなたは正しい。しかし、私はまだ軸のタイトル/テキストのケースで首尾一貫したメンタルモデルを作るのに苦労しています。軸テキストの場合hjust=0、左端を目盛りに揃えます。hjust=0.5チックを中心に; hjust=1右端を目盛りに合わせます(基準点を基準にボックスを移動します)。ただし、ボックス内で最も高いラベルのサイズにvjust揃えます
Brian Diggs、2011

@BrianDiggs vjust軸ラベルの場合、すべてのラベルが同時に互いに整列します。したがって、すべての上部エッジはに揃うとvjust=1、すべての下部エッジはに揃いますvjust=0。これは完全に理にかなっています。
Andrie、2011
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.