Как сделать селективную маркировку с помощью 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 > 4
или mpg > 25
,
в то время как остальные точки остаются без метки.
Ответы
Ответ 1
Поставьте аргумент 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, я уверен, что hadley сделал это в оригинальной книге ggplot2, чтобы продемонстрировать различные модификации одного и того же сюжета, но люди, похоже, выбрали он работает и работает с ним. Вот как я это сделаю:
- Просто добавьте различные компоненты графика вместе с
+
, не сохраняйте каждый промежуточный шаг.
- Не беспокойтесь, сохраняя его в переменной, если вам это действительно нужно, вы все равно можете сохранить его в файле, если вам нужно с
ggsave()
- Поместите всю эстетику, которая будет применяться ко всему сюжету в первом вызове
ggplot
, только при необходимости измените другие вещи
Моя версия:
ggplot(mtcars, aes(wt, mpg, label=name)) +
geom_point() +
geom_text(data=subset(mtcars, wt > 4 | mpg > 25))
Ответ 2
Вы можете передать аргумент 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))
Ответ 4
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]()