ti-enxame.com

Como fazer etiquetas seletivas com GGPLOT geom_point ()

Com este código:

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

Eu obtenho este gráfico:

enter image description here

Como posso modificar o código acima para que apenas os rótulos aponte onde wt > 4 ou mpg > 25, enquanto o restante dos pontos permanece sem rótulo.

23
neversaint

Forneça um argumento data para 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))

Gráfico resultante:

plot1

PS: Eu realmente não sou fã do estilo p + geom() de construir ggplots, tenho certeza que hadley fez isso no livro original do ggplot2 para demonstrar diferentes modificações do mesmo enredo, mas as pessoas parecem ter pegou e correu com ele. Aqui está como eu faria isso:

  • Basta adicionar os diferentes componentes do gráfico junto com +, Não salve cada etapa intermediária.
  • Não se preocupe em salvá-lo em uma variável, a menos que você realmente precise, você ainda pode salvá-lo em um arquivo se precisar com ggsave()
  • Coloque toda a estética que será aplicada a todo o enredo na primeira chamada ggplot, apenas modifique as outras coisas, se necessário

Minha versão:

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

Você pode passar um argumento subset para uma camada. No seu caso, isso exigiria ter os nomes de domínio como uma coluna, para que sejam avaliados adequadamente. Você precisará carregar explicitamente plyr para obter a função . que facilita a sintaxe.

# 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))
5
mnel

Você pode apenas obter uma variável extra:

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

p + geom_point() + geom_text(aes(wt,mpg,label=carnames))
2
sebastian-c

uma solução de treliça semelhante ao 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

1
agstudy