Come aggiungere geom_text o geom_label con una posizione relativa alla dimensione di un geom_point?

Jan 20 2021

Quello che sto cercando di fare è aggiungere un'etichetta ai punti realizzati con geom_point che hanno una variabile mappata alla dimensione. Il valore viene visualizzato anche nell'etichetta. Il testo o l'etichetta dovrebbero essere posizionati appena sotto geom_point, ma non sembra possibile ottenerlo con position_nudge.

Il mio codice attualmente ha questo aspetto (semplificato):

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

Il risultato è questo

ma sto cercando di ottenere qualcosa del genere:

C'è un modo per raggiungere questo obiettivo in modo semplice?

Grazie.

EDIT: sto cercando di impostare la distanza tra il bordo del geom_point e il bordo delle etichette come valore fisso.

Risposte

1 tjebo Jan 21 2021 at 06:09

Spero che questo sia sufficientemente diverso da meritare un'altra risposta. Ammetto di aver trascurato un po 'di cosa esattamente volevi posizionare le etichette. Quindi fondamentalmente lo vuoi non relativo al centro del punto, ma al raggio.

Mi è venuta in mente in modo piuttosto nostalgico la mia prima domanda in questa comunità , di cui ammetto di non aver capito la sua risposta da molto tempo.

L'idea di base è non usare geom_point , ma usare ggforce :: geom_circle (o: geom_ellipse). È possibile utilizzare il raggio che si utilizza per la creazione per il posizionamento delle etichette. Richiede un po 'di hard coding, ma sono sicuro che ci sarebbero modi per definire a livello di codice il raggio in base alle coordinate generali.

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

Creato il 2021-01-20 dal pacchetto reprex (v0.3.0)

2 RuiBarradas Jan 20 2021 at 23:11

Il problema può essere risolto ridimensionandolo sizee aggiungendolo alla vjustdistanza dai punti.

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

Dati di test

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

Uso nudge

Grazie a Rui per i dati. +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 )

Creato il 2021-01-20 dal pacchetto reprex (v0.3.0)