2010-11-19 35 views
16

J'essaie d'utiliser geom_point pour illustrer le nombre de mes données. Je voudrais aussi annoter quelques-uns des points de mon graphique avec geom_text. Lorsque j'ajoute l'appel à geom_text, il semble qu'il trace quelque chose sous les points de la légende. J'ai essayé d'inverser l'ordre des couches en vain. Je ne peux pas comprendre pourquoi c'est ce qu'il fait. Quelqu'un a-t-il déjà vu cela avant?Problème de légende ggplot w/geom_point et geom_text

set.seed(42) 
df <- data.frame(x = 1:10 
    , y = 1:10 
    , label = sample(LETTERS,10, replace = TRUE) 
    , count = sample(1:300, 10, replace = FALSE) 
) 

p <- ggplot(data = df, aes(x = x, y = y, size = count)) + geom_point() 
p + geom_text(aes(label = label, size = 150, vjust = 2)) 

alt text

Répondre

24

Ce qui est arrivé à moi tout le temps. L'astuce consiste à savoir que aes() cartographie les données à l'esthétique. S'il n'y a pas de données à mapper (par exemple, si vous avez une seule valeur que vous déterminez), il n'y a aucune raison d'utiliser aes(). Je crois que seules les choses à l'intérieur d'un aes() apparaîtront dans votre légende.

En outre, lorsque vous spécifiez des mappings dans ggplot(aes()), ces mappages s'appliquent à à chaque couche suivante. C'est bon pour votre x et y, puisque les deux geom_point et geom_text les utilisent. C'est mauvais pour size = count, car cela ne s'applique qu'aux points.

Ce sont donc mes deux règles pour empêcher ce genre de chose:

  1. applications à base de données uniquement mis à l'intérieur de aes(). Si l'argument prend une seule valeur prédéterminée, passez-la à la couche en dehors de de aes().
  2. Données de carte uniquement pour les couches qui l'utiliseront. Corollaire: ne mappez les données qu'à l'intérieur de ggplot(aes()) si vous êtes sûr que chaque couche suivante l'utilisera. Sinon, mappez-le au niveau de la couche.

donc je tracer cette thusly:

p <- ggplot(data = df, aes(x = x, y = y)) + geom_point(aes(size = count)) 
p + geom_text(aes(label = label), size = 4, vjust = 2) 
+2

Vos deux règles sont pertinentes! – kohske

+0

Conseils très utiles à connaître pour l'avenir, je suis toujours en train d'essayer de comprendre les meilleures pratiques w/ggplot2. Avez-vous des suggestions de sous-ensembles de l'objet de données à tracer? Par exemple, si vous voulez seulement annoter le premier et le dernier point? J'ai utilisé quelque chose comme 'geom_text (données = df [grep (" xxx ", df $ étiquette),], aes (x = ...))'. Y a-t-il une meilleure façon de s'y prendre? – Chase

+0

Chase - c'est une bonne question. Il pourrait être sage d'en faire une nouvelle question; J'ai des notions vagues, mais il y a des chances que quelqu'un d'autre ait une idée concrète. –

17

ou, si vous avez besoin de spécifier la taille du texte à l'intérieur des aes, puis légende = suppress FAUX tirer les légendes du geom:

p <- ggplot(data = df, aes(x = x, y = y, size = count)) + geom_point() 
p + geom_text(aes(label = label, size = 150, vjust = 2), show_guide = FALSE) 
+1

Ah, il ne m'est jamais venu à l'esprit de l'utiliser au niveau de la couche. Bien fait. –

+0

C'est une bonne astuce à savoir! Merci. – Chase

+2

Juste une petite info: "legend" a été remplacé par "show_guides": l'argument "legend" dans geom_XXX et stat_XXX est obsolète. Utilisez show_guide = TRUE ou show_guide = FALSE pour l'affichage ou supprimez l'affichage du guide. " – Andreas