Wie füge ich geom_text oder geom_label mit einer Position relativ zur Größe eines geom_point hinzu?

Jan 20 2021

Ich versuche, Punkten, die mit geom_point erstellt wurden und deren Variable der Größe zugeordnet ist, eine Beschriftung hinzuzufügen. Der Wert wird auch auf dem Etikett angezeigt. Der Text oder die Beschriftung sollte direkt unter dem geom_point positioniert werden, aber dies mit position_nudge zu erreichen, scheint nicht möglich zu sein.

Mein Code sieht derzeit so aus (vereinfacht):

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

Das Ergebnis ist dies

aber ich versuche so etwas zu erreichen:

Gibt es eine Möglichkeit, dies auf einfache Weise zu erreichen?

Vielen Dank.

BEARBEITEN: Ich versuche, den Abstand zwischen dem Rand des geom_point und dem Rand der Beschriftungen als festen Wert festzulegen.

Antworten

1 tjebo Jan 21 2021 at 06:09

Ich hoffe, dass dies ausreichend anders ist, um eine weitere Antwort zu verdienen. Ich gebe zu, ich habe das bisschen übersehen, was genau Sie die Etiketten positionieren wollten. Grundsätzlich möchten Sie es also nicht relativ zum Punktmittelpunkt, sondern zum Radius.

Ich fühlte mich ziemlich nostalgisch an meine erste Frage in dieser Community erinnert , von der ich zugeben muss, dass ich ihre Antwort schon lange nicht mehr verstanden habe.

Die Grundidee ist, nicht geom_point zu verwenden , sondern ggforce :: geom_circle (oder: geom_ellipse). Sie können den Radius, den Sie für die Erstellung verwenden, zum Positionieren Ihrer Etiketten verwenden. Es erfordert ein wenig harte Codierung, aber ich bin sicher, dass es Möglichkeiten gibt, den Radius basierend auf Ihren allgemeinen Koordinaten programmgesteuert zu definieren.

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

Erstellt am 2021-01-20 vom reprex-Paket (v0.3.0)

2 RuiBarradas Jan 20 2021 at 23:11

Das Problem kann gelöst werden, sizeindem es skaliert und zum vjustAbstand zu den Punkten hinzugefügt wird .

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

Testdaten

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

Benutzen nudge

Danke an Rui für die Daten. +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 )

Erstellt am 2021-01-20 vom reprex-Paket (v0.3.0)