web-dev-qa-db-fra.com

Comment effectuer un étiquetage sélectif avec GGPLOT geom_point ()

Avec ce code:

library(ggplot2)
p <- ggplot(mtcars, aes(wt, mpg))
p + geom_point()
p + geom_point() + geom_text(aes(wt, mpg, label=row.names(mtcars)))

J'obtiens ce graphique:

enter image description here

Comment puis-je modifier le code ci-dessus pour qu'il ne marque que le point où wt > 4 ou mpg > 25, tandis que les autres points restent sans étiquette.

23
neversaint

Fournissez un argument data à geom_text:

library(ggplot2)
mtcars$name <- row.names(mtcars)
p <- ggplot(mtcars, aes(wt, mpg))
p + geom_point()
p + geom_point() + 
  geom_text(data=subset(mtcars, wt > 4 | mpg > 25),
            aes(wt,mpg,label=name))

Tracé résultant:

plot1

PS: Je ne suis vraiment pas fan du style p + geom() de construction de ggplots, je suis presque sûr que hadley l'a fait dans le livre ggplot2 original pour démontrer différentes modifications du même terrain, mais les gens semblent avoir ramassé et courir avec. Voici comment je le ferais:

  • Ajoutez simplement les différents composants du tracé avec +, Ne sauvegardez pas chaque étape intermédiaire.
  • Ne vous embêtez pas à l'enregistrer dans une variable sauf si vous en avez vraiment besoin, vous pouvez toujours l'enregistrer dans un fichier si vous en avez besoin avec ggsave()
  • Mettez toutes les esthétiques qui vont s'appliquer à l'ensemble de l'intrigue dans le premier appel ggplot, ne modifiez les autres choses que si nécessaire

Ma version:

ggplot(mtcars, aes(wt, mpg, label=name)) +
  geom_point() +
  geom_text(data=subset(mtcars, wt > 4 | mpg > 25))
47
Marius

Vous pouvez passer un argument subset à un calque. Dans votre cas, cela nécessiterait d'avoir les noms de domaine sous forme de colonne, afin qu'ils soient évalués correctement. Vous devrez charger explicitement plyr pour obtenir la fonction . ce qui facilite la syntaxe.

# shamelessly using @marius initial code
library(ggplot2)
library(plyr)
mtcars$name <- row.names(mtcars)
p <- ggplot(mtcars, aes(wt, mpg))

p + geom_point() + geom_text(aes(wt,mpg,label=name), subset = .(wt > 4 | mpg > 25))
5
mnel

Vous pouvez simplement obtenir une variable supplémentaire:

carnames <- row.names(mtcars)
carnames[with(mtcars, !(wt > 4 | mpg > 25))] <- ""

p + geom_point() + geom_text(aes(wt,mpg,label=carnames))
2
sebastian-c

une solution de réseau similaire à ggplot2 :-)

  library(latticeExtra)
  xyplot(mpg~wt, data=mtcars,pch=19,
         panel =function(x,y,...){
         #  panel.xyplot(x,y,...)
           data=subset(mtcars, wt > 4 | mpg > 25)
           panel.text(data$wt,data$mpg,label=row.names(data),
                      col='red',cex=2)
         },par.settings = ggplot2like(), axis = axis.grid)

enter image description here

1
agstudy