使用此代码:
library(ggplot2)
p <- ggplot(mtcars, aes(wt, mpg))
p + geom_point()
p + geom_point() + geom_text(aes(wt, mpg, label=row.names(mtcars)))
我得到这张图:
如何修改上面的代码,使其仅标记点 wherewt > 4
或mpg > 25
,而其余点保持未标记。
为 提供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))
结果图:
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))
您可以将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))
你可以得到一个额外的变量:
carnames <- row.names(mtcars)
carnames[with(mtcars, !(wt > 4 | mpg > 25))] <- ""
p + geom_point() + geom_text(aes(wt,mpg,label=carnames))
一个类似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)
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))