geom_pointのサイズに相対的な位置でgeom_textまたはgeom_labelを追加するにはどうすればよいですか?

Jan 20 2021

私がやろうとしているのは、サイズにマップされた変数を持つgeom_pointで作成されたポイントにラベルを追加することです。値はラベルにも表示されます。テキストまたはラベルはgeom_pointのすぐ下に配置する必要がありますが、position_nudgeでこれを実現することは不可能のようです。

私のコードは現在次のようになっています(簡略化):

ggplot(data, aes(x = var1, y = var2) +
   geom_point(aes(size = var3)) +
   geom_text(aes(label = var3))

結果はこれです

しかし、私はこのようなことを達成しようとしています:

簡単な方法でこれを達成する方法はありますか?

ありがとう。

編集:geom_pointの境界とラベルの境界の間の距離を固定値にしようとしています。

回答

1 tjebo Jan 21 2021 at 06:09

これが十分に異なっていて、別の答えに値することを願っています。私はあなたがラベルを正確に配置したかったものに少し見落としていたことを認めます。したがって、基本的には、ポイントの中心ではなく、半径を基準にして必要です。

このコミュニティでの自分自身の最初の質問をとても懐かしく思い出しました。その答えを長い間理解していなかったことを認めます。

基本的な考え方は、geom_pointを使用するのではなく、ggforce :: geom_circle(またはgeom_ellipse)を使用することです。ラベルの配置には、作成に使用した半径を使用できます。少しハードコーディングが必要ですが、一般的な座標に基づいてプログラムで半径を定義する方法があると確信しています。

library(ggplot2)
library(ggforce)

foo <- data.frame(var1 = rep(1:3, 2),  var2 =rep(1:2, each = 3),
                   var3 = c(3, 10, 2, 1, 1, 10))
# Create cuts - you can also assign other values of course. factor of 0.01 was chosen randomly. 
foo$rad <- 0.01 * findInterval(foo$var3, 1:5)

ggplot(foo) +
  geom_circle(aes(x0 = var1, y0 = var2, r = rad),
              fill = "Grey50") +
  geom_text(aes(x = var1, y = var2 - rad - 0.03, label = var3)) +
  coord_equal()

reprexパッケージ(v0.3.0)によって2021-01-20に作成されました

2 RuiBarradas Jan 20 2021 at 23:11

この問題は、スケーリングしてポイントsizeまでのvjust距離に追加することで解決できます。

library(ggplot2)

ggplot(data, aes(x = var1, y = var2)) +
  geom_point(aes(size = var3), show.legend = FALSE) +
  geom_text(aes(label = var3, vjust = 1.5 + 0.1 * var3))

テストデータ

data <- data.frame(var1 = factor(rep(1:3, 2)),
                   var2 = factor(rep(1:2, each = 3)),
                   var3 = c(3, 10, 2, 1, 1, 10))
2 tjebo Jan 21 2021 at 00:08

使用する nudge

データを提供してくれたRuiに感謝します。+1

library(ggplot2)
data <- data.frame(var1 = factor(rep(1:3, 2)),
                   var2 = factor(rep(1:2, each = 3)),
                   var3 = c(3, 10, 2, 1, 1, 10))

ggplot(data, aes(x = var1, y = var2)) +
  geom_point(aes(size = var3), show.legend = FALSE) +
  geom_text(aes(label = var3), nudge_y = -0.1 )

reprexパッケージ(v0.3.0)によって2021-01-20に作成されました