Как сделать селективную маркировку с помощью 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