如何使用GGPLOT的geom_point()进行选择性标记?

40
使用以下代码:
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的点,而其余点保持未标记状态。
5个回答

87
提供一个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

提示:我真的不喜欢使用 p + geom() 的方式构建 ggplot,我相信 Hadley 在原始的 ggplot2 书中这样做是为了演示同一图形的不同修改方式,但人们似乎已经掌握并运用它了。以下是我的做法:

  • 只需使用 + 将绘图的不同组件添加在一起,不要保存每个中间步骤。
  • 除非确实需要,否则不必将其保存到变量中,您仍然可以使用 ggsave() 将其保存到文件中。
  • 将适用于整个图形的所有美学特征放在第一个 ggplot 调用中,只在必要时修改其他内容。

我的版本:

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

6

您可以向层传递一个subset参数。在您的情况下,这将需要将行名作为一列,以便正确评估它们。您需要显式加载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))

3

你可以添加一个额外的变量:

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

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

3
一个类似于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


2
library(ggrepel)

mtcars$name <- row.names(mtcars)

ggplot(mtcars, aes(wt, mpg, label=name)) +

geom_point() +

geom_text_repel(data=subset(mtcars, wt > 4 | mpg > 25), aes(label=name))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接