2013-02-22 75 views
17

有了這個代碼:如何做選擇性標記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))) 

我獲得該曲線圖中:

enter image description here

如何修改上面的代碼,以便它只標籤點wt > 4mpg > 25, 而點的其餘部分仍然未標記。

回答

41

供應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)) 

所得的情節:

plot1

PS:我真的不是p + geom()作風建設ggplots的球迷,我很確定哈德利在原始的ggplot2書中做了這件事來演示對同一個情節的不同修改,但人們似乎已經把它撿起來並與它一起運行。以下是我想做到這一點:

  • 只是+添加情節的不同組件放在一起,不用保存每個中間步驟。
  • 不要打擾它保存到一個變量,除非你真的需要,還是可以將它保存到一個文件,如果你需要用ggsave()
  • 把所有將要申請的整個情節的美學第一ggplot呼叫,只修改了其他事情如果有必要

我的版本:

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

您可以通過一個subset參數層。在你的情況下,這需要將rownames作爲列,以便正確評估它們。您將需要明確加載plyr以獲得功能.,這使得語法變得簡單。

# 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

你可以只得到一個額外的變量:

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

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

一個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