2012-05-10 2 views
6

En este caso, todo está bien:¿Hay alguna forma de usar el comando Identificar con ggplot 2?

x <- 1:10 
y <- x^3 
plot(x, y) 
identify(x, y) 

Pero, usando qplot existen algunas dificultades:

x <- 1:10 
y <- x^3 
qplot(x, y) 
identify(x, y) 

¿Alguien sabe un comando similar u otra manera de etiquetar puntos específicos en los gráficos ggplot2?

+4

Una combinación de 'gglocator' del paquete' ggmap' y '? Geom_text' debería darle lo que quiere pero no tan bien como identificar. Tendrás que incluir un marco de datos de x, y coords y texto que pases a 'geom_text'. Si hay una mejor manera de amar aquí. –

+0

Gracias Tyler. ¡Probaré tu combinación! –

+0

@DaviMoreira, [¿esto funcionaría en su caso] (http://stackoverflow.com/questions/9505495/identify-points-in-scatterplot-qplot/9505920#9505920)? –

Respuesta

5

Aquí es un método que solo a través de los paquetes grid y ggplot2:

library(ggplot2) 
library(grid) 

x <- 1:10 
y <- x^3 
qplot(x, y) 

downViewport('panel-3-4') 
pushViewport(dataViewport(x,y)) 

tmp <- grid.locator('in') 
tmp.n <- as.numeric(tmp) 
tmp2.x <- as.numeric(convertX(unit(x,'native'), 'in')) 
tmp2.y <- as.numeric(convertY(unit(y,'native'), 'in')) 

w <- which.min((tmp2.x-tmp.n[1])^2 + (tmp2.y-tmp.n[2])^2) 
grid.text(w, tmp$x, tmp$y) 

Si desea una etiqueta de texto en lugar del número de su podría reemplazar w en la llamada a grid.text con algo como letters[w] (o cualquier vector de etiquetas que desee).

Si va a hacer varios de estos, puede envolver esto en una función con las últimas líneas posiblemente en un bucle. También puede agregar lógica adicional para advertir si no hace clic cerca de un punto (como identificar hace) o para mover la etiqueta más cerca o más lejos del punto (esta versión coloca la etiqueta para el punto de datos más cercano en el punto donde hace clic) .

2

he creado un poco de trabajo en torno al utilizar la función de identificar, dentro de ggplot

df <- data.frame(x=c(1.8,2.1,3.1,2.8,3.1,4.9,5.1,3.2,2.2), 
    y=c(3.2,2.3,4.1,5.2,3.1,2,1.9,2.1,3), 
    name=c('agw452','hhewhdsgwgb','cgahawrhs','gsarhrwhd','ehhrwhrwwrw','fhhrwwrw','ghhWwr','hhHRWRHwr','ihwhrHWRHw')) 
plot(df$x,df$y) 
identified <- identify(df$x,df$y,labels=df$name,pos=T) 
df$pos <- NA 
df[identified$ind,]$pos <- identified$pos 
ggplot(df,aes(x=x,y=y)) + geom_point() + 
    geom_point(data=subset(df,!is.na(pos)),aes(color='red')) + 
    geom_text(data=subset(df,pos == 1),aes(label=name),vjust=1) + 
    geom_text(data=subset(df,pos == 2),aes(label=name),hjust=1) + 
    geom_text(data=subset(df,pos == 3),aes(label=name),vjust=-.5) + 
    geom_text(data=subset(df,pos == 4),aes(label=name),hjust=0) 

Se utiliza el índice y las posiciones de los clics y coloca las etiquetas en las mismas posiciones que en la función trama ...

esperanza de que ayuda a ...

sería útil tener más posiciones a continuación, sólo 4 ... pero no saben cómo reescribir identificar ... todavía ;-)

7

Usted puede convertir su trama, hecha con ggplot2 al gráfico interactivo mediante el uso de la función de ggplotlyplotly paquete, ej .:

library(ggplot2) 
library(plotly) 

# Prepare data 
x <- 1:10 
y <- x^3 
names <- paste("Point", LETTERS[x]) 

# Make a plot with `ggplot` as usual 
qplot(x, y, label = names) 

# Convert it to interactive plot 
ggplotly() 

Luego mueva el cursor sobre un punto de interés y encontrar información sobre él.

Cuestiones relacionadas