Comment ajouter geom_text ou geom_label avec une position relative à la taille d'un geom_point?

Jan 20 2021

Ce que j'essaie de faire, c'est d'ajouter une étiquette aux points faits avec geom_point qui ont une variable mappée à la taille. La valeur est également affichée dans l'étiquette. Le texte ou l'étiquette doit être positionné juste sous le geom_point, mais y parvenir avec position_nudge ne semble pas possible.

Mon code ressemble actuellement à ceci (simplifié):

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

Le résultat est le suivant

mais j'essaye de réaliser quelque chose comme ceci:

Existe-t-il un moyen d'y parvenir de manière simple?

Merci.

EDIT: J'essaye d'avoir la distance entre la frontière du geom_point et la frontière des étiquettes soit une valeur fixe.

Réponses

1 tjebo Jan 21 2021 at 06:09

J'espère que c'est suffisamment différent pour mériter une autre réponse. J'avoue que j'ai négligé de savoir exactement ce que vous vouliez positionner les étiquettes. Donc, fondamentalement, vous ne le voulez pas par rapport au centre du point, mais au rayon.

Je me suis senti assez nostalgiquement rappelé ma toute première question dans cette communauté , dont j'avoue ne pas avoir compris sa réponse depuis très longtemps.

L'idée de base est de ne pas utiliser geom_point , mais d'utiliser ggforce :: geom_circle (ou: geom_ellipse). Vous pouvez utiliser le rayon que vous utilisez pour la création pour le positionnement de vos étiquettes. Cela nécessite un peu de codage en dur, mais je suis sûr qu'il y aurait des moyens de définir par programme le rayon en fonction de vos coordonnées générales.

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

Créé le 2021-01-20 par le package reprex (v0.3.0)

2 RuiBarradas Jan 20 2021 at 23:11

Le problème peut être résolu en mettant à l'échelle sizeet en l'ajoutant à la vjustdistance aux points.

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

Données de 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

Utiliser nudge

Merci à Rui pour les données. +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 )

Créé le 2021-01-20 par le package reprex (v0.3.0)