Jak dodać geom_text lub geom_label z pozycją zależną od rozmiaru geom_point?

Jan 20 2021

To, co próbuję zrobić, to dodać etykietę do punktów utworzonych za pomocą geom_point, które mają zmienną odwzorowaną na rozmiar. Wartość jest również wyświetlana na etykiecie. Tekst lub etykieta powinny być umieszczone tuż pod geom_point, ale osiągnięcie tego za pomocą position_nudge nie wydaje się możliwe.

Mój kod obecnie wygląda następująco (uproszczony):

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

Wynik jest taki

ale ja staram się osiągnąć coś takiego:

Czy jest jakiś sposób, aby to osiągnąć w prosty sposób?

Dzięki.

EDYCJA: Próbuję, aby odległość między granicą geom_point a granicą etykiet była stałą wartością.

Odpowiedzi

1 tjebo Jan 21 2021 at 06:09

Mam nadzieję, że jest to wystarczająco inne, aby zasługiwać na inną odpowiedź. Przyznaję, że przeoczyłem trochę na temat tego, co dokładnie chciałeś umieścić etykiety. Więc zasadniczo nie chcesz, aby było to względem środka punktu, ale względem promienia.

Z nostalgią przypomniało mi się moje pierwsze pytanie w tej społeczności , na które, przyznaję, nie rozumiałem odpowiedzi od bardzo dawna.

Podstawowym pomysłem jest nie używanie geom_point , ale użycie ggforce :: geom_circle (lub: geom_ellipse). Możesz użyć promienia, którego używasz do tworzenia, do pozycjonowania etykiet. Wymaga to trochę twardego kodowania, ale jestem pewien, że byłyby sposoby na programowe zdefiniowanie promienia na podstawie twoich ogólnych współrzędnych.

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

Utworzony 2021-01-2020 przez pakiet reprex (v0.3.0)

2 RuiBarradas Jan 20 2021 at 23:11

Problem można rozwiązać, wyskalując sizei dodając go do vjustodległości do punktów.

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

Dane testowe

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

Posługiwać się nudge

Dzięki Rui za dane. +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 )

Utworzony 2021-01-2020 przez pakiet reprex (v0.3.0)