web-dev-qa-db-ja.com

キャンバスの境界内にgeom_textプロットを作成する方法

Geom_textを使用して散布図の範囲外のポイントにラベルを付ける。定義により、これらのポイントはキャンバスのエッジに近い傾向があります。通常、少なくとも1つのWordがキャンバスのエッジと重なり、役に立たなくなります。

明らかに、以下の場合、+ xlim(c(1.5, 4.5))を使用して手動で解決できます。

# test
df <- data.frame(Word = c("bicycle", "tricycle", "quadricycle"),
                 n.wheels = c(2,3,4),
                 utility = c(10,6,7))
ggplot(data=df, aes(x=n.wheels, y=utility, label=Word))  + geom_text() + xlim(c(1.5, 4.5))

trike

ただし、これは理想的ではありません。

  1. 自動化されていないため、多くのプロットを作成する場合はプロセスが遅くなります
  2. これは正確ではありません。つまり、WordのエッジとキャンバスのEdgeの間の距離は、すべての場合で等しくありません。

この問題を検索しても解決策は見つかりません。HadleyWickhamは、ggplot2のラベルが半分にカットされていることに満足しているようです ヘルプページ (私はHadleyを知っています。これらは単なる例です;)

43
RobinLovelace

ggplot 2.0. クリッピングに役立つ可能性のあるgeom_text()hjustおよびvjustの新しいオプションを導入。特に"inward"。できること:

ggplot(data=df, aes(x=n.wheels, y=utility, label=Word))  + 
  geom_text(vjust="inward",hjust="inward")

enter image description here

51
scoa

これはscale_continuousexpandの良い使い方だと思います:

ggplot(data=df, aes(x=n.wheels, y=utility, label=Word))  + geom_text() + 
    scale_x_continuous(expand = c(.1, .1))

データを(乗法的および加法的に)パディングして、スケール制限を計算します。本当に長い言葉がない限り、デフォルトから少し上げるだけで十分でしょう。詳細については、?expand_scaleを参照してください。また、軸の上部または下部の範囲のみを拡張するなどの追加オプションもご覧ください。 ?expand_scaleの一番下の例から、デフォルトは離散スケールの場合は加法0.6、連続スケールの場合は乗法0.05のように見えます。

29
Gregor Thomas

クリッピングをオフにすることができます。あなたの例では、それはとてもうまくいきます。

p <- ggplot(data=df, aes(x=n.wheels, y=utility, label=Word))  + geom_text() 
gt <- ggplot_gtable(ggplot_build(p))
gt$layout$clip[gt$layout$name == "panel"] <- "off"
grid::grid.draw(gt)

Clipping off

18
Hernando Casas

誰かがこれを少し速くプログラミングする方法を考え出すことができると確信していますが、ここでは特に範囲がすべて異なる複数のファセットで使用できる答えがあります-異なるxに2つのファセットを持つようにdata.frameを変更しましたyスケール:

_df <- data.frame(Word = c("bicycle", "tricycle", "quadricycle"),
                 n.wheels = c(2,3,4, .2, .3, .4),
                 utility = c(10,6,7, 1, .6, .7),
                 facet = rep(c("one", "two"), each = 3))
_

次に、各ファセットの範囲xとyの幅を決定するダミーデータフレームを作成し(たとえば、diff(range(n.wheels)))、その幅を適切な数で割ります(ラベルの長さに応じて、I 8)を選択し、各ファセットのx値とy値の最小値と最大値にそのパディングを追加します。

_pad <- rbind(ddply(df, .(facet), summarize,
             n.wheels = min(n.wheels) - diff(range(n.wheels))/8, 
             utility = min(utility) - diff(range(utility))/8),
ddply(df, .(facet), summarize,
             n.wheels = max(n.wheels) + diff(range(n.wheels))/8,
             utility = max(utility) + diff(range(utility))/8))
pad$Word <- NA
_

次に、そのレイヤーを色をNAに設定してプロットに追加できます。

_ggplot(data=df, aes(x=n.wheels, y=utility, label = Word))  + 
   geom_text() + 
   geom_point(data = pad, aes(x = n.wheels, y = utility), colour = NA) +
   facet_wrap(~facet, ncol = 1, scales = "free") 
_

結果:カットオフラベルのない再現可能な「自動化された」プロット(後でスケールを変更してきれいにすることができます...)

Faceted ggplot with Nice labels

2
Nova