33

使用此代码:

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

我得到这张图:

在此处输入图像描述

如何修改上面的代码,使其仅标记点 wherewt > 4mpg > 25,而其余点保持未标记。

4

5 回答 5

78

为 提供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))

结果图:

情节1

PS:我真的不喜欢p + geom()构建 ggplots 的风格,我很确定 hadley 在最初的 ggplot2 书中做了它来演示对同一情节的不同修改,但人们似乎已经接受了它并使用它. 这是我的做法:

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

我的版本:

ggplot(mtcars, aes(wt, mpg, label=name)) +
  geom_point() +
  geom_text(data=subset(mtcars, wt > 4 | mpg > 25))
于 2013-02-22T01:29:53.753 回答
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))
于 2013-02-22T01:32:22.843 回答
3

你可以得到一个额外的变量:

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

p + geom_point() + geom_text(aes(wt,mpg,label=carnames))
于 2013-02-22T01:36:43.597 回答
2

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

在此处输入图像描述

于 2013-02-22T02:11:20.527 回答
1
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))
于 2020-04-02T01:19:52.240 回答