2013-02-22 8 views
17

Mit diesem Code zu tun:Wie selektive Markierung mit 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))) 

ich erhalten diese Grafik:

enter image description here

Wie kann ich den oben stehenden Code ändern, damit es Etiketten nur Punkt, wo wt > 4 oder mpg > 25, während die restlichen Punkte unmarkiert bleiben.

Antwort

41

Versorgung ein data Argument 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)) 

Resultierende Grundstück:

plot1

PS: Ich bin wirklich kein Fan des p + geom() Stil ggplots des Konstruierens, ich bin ziemlich sicher, dass hadley es im ursprünglichen ggplot2-buch getan hat, um verschiedene änderungen derselben darstellung zu demonstrieren, aber die leute scheinen es aufgegriffen zu haben und damit zu laufen. Hier ist, wie ich es tun würde:

  • einfach die verschiedenen Komponenten des Plots fügen zusammen mit +, nicht jeden Zwischenschritt speichern.
  • Sie sich nicht die Mühe, es zu einem variablen Speichern, wenn Sie wirklich brauchen, um, haben Sie immer es in einer Datei speichern können, wenn Sie mit ggsave()
  • müssen, um alle Ästhetik setzen, die in den auf die gesamte Handlung anwenden werden erste ggplot Anruf, ändern nur die anderen Dinge, wenn nötig

Meine Version:

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

Sie ein subset Argument einer Schicht passieren kann. In Ihrem Fall würde dies erfordern die rownames als eine Spalte, so dass sie richtig ausgewertet werden. Sie müssen plyr explizit laden, um die Funktion . zu erhalten, die die Syntax einfach macht.

# 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

Sie könnten nur eine zusätzliche Variable erhalten:

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

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

eine ggplot2 artige Gitter Lösung :-)

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