2013-02-22 10 views
17

z tym kodem:Jak to zrobić selektywnego znakowania z geom_point ggplot()

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

I uzyskania tego wykresu:

enter image description here

jak można zmodyfikować powyższy kod tak, że tylko etykiety punkt, gdzie wt > 4 lub , , podczas gdy pozostałe punkty pozostają nieoznaczone.

Odpowiedz

41

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

Wynikające działki:

plot1

PS: Ja naprawdę nie jestem fanem p + geom() stylu konstruowania ggplots, jestem całkiem pewnie hadley zrobił to w oryginalnej książce ggplot2, aby zademonstrować różne modyfikacje tego samego wątku, ale ludzie najwyraźniej go podnieśli i zaczęli z nim pracować. Oto, jak to zrobić:

  • Po prostu dodaj różne elementy wykresu razem z +, nie zapisuj każdego kroku pośredniego.
  • Nie przejmuj zapisując go do zmiennej, chyba że naprawdę konieczne, można jeszcze zapisać go do pliku, jeśli trzeba z ggsave()
  • Umieść wszystkie estetykę, które będą mieć zastosowanie do całej działki w pierwszy ggplot wezwanie, tylko zmodyfikować inne rzeczy, jeśli niezbędne

moją wersję:

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

można przekazać subset argument warstwie. W twoim przypadku wymagałoby to posiadania rownames jako kolumny, więc są one poprawnie ocenione. Będziesz musiał jawnie załadować plyr, aby uzyskać funkcję ., co sprawia, że ​​składnia jest łatwa.

# 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

Można po prostu dodatkową zmienną:

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

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

rozwiązanie kratownica ggplot2 podobny :-)

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