2013-02-22 14 views
17

Con questo codice:Come fare l'etichettatura selettiva con GGPLOT geom_point()

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

ottengo questo grafico:

enter image description here

Come posso modificare il codice di cui sopra in modo che solo le etichette punto dove wt > 4 o mpg > 25, mentre il resto dei punti rimane senza etichetta.

risposta

41

Fornire un data argomento per 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)) 

grafico risultante:

plot1

PS: io non sono davvero un fan dello stile p + geom() di costruire ggplots, io sono Sono sicuro che hadley l'ha fatto nel libro ggplot2 originale per dimostrare diverse modifiche della stessa trama, ma la gente sembra averlo raccolto e gestito con esso. Ecco come farei:

  • Basta aggiungere i diversi componenti del grafico insieme a +, non salvare ogni passaggio intermedio.
  • Non preoccupatevi di salvarlo in una variabile a meno che non si ha realmente bisogno, è ancora possibile salvarlo in un file se è necessario con ggsave()
  • Mettere tutti l'estetica che stanno per applicarsi a tutta la trama nella prima ggplot chiamata, modificare solo le altre cose, se necessario

la mia versione:

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

È possibile passare un argomento subset a un livello. Nel tuo caso ciò richiederebbe avere i nomi di ruolo come una colonna, quindi vengono valutati correttamente. È necessario caricare esplicitamente plyr per ottenere la funzione . che semplifica la sintassi.

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

Si potrebbe ottenere solo una variabile in più:

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

p + geom_point() + geom_text(aes(wt,mpg,label=carnames)) 
1

una soluzione reticolo ggplot2 simile :-)

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

Problemi correlati