Nota: Esta pregunta es específica para el mapeo, pero me gustaría poder usarla cuando grafico en un sistema de coordenadas cartesianas estándar.equivalente de localizador en ggplot2 (para mapas)
Me encantan los gráficos base pero también me gusta ggplot2 para muchas cosas. Una de las funciones básicas más utilizadas para ajustar un gráfico es el localizador (n) pero produce un error en ggplot2.
library(ggplot2)
county_df <- map_data('county') #mappings of counties by state
ny <- subset(county_df, region=="new york") #subset just for NYS
ny$county <- ny$subregion
ggplot(ny, aes(long, lat, group=group)) + geom_polygon(colour='black', fill=NA)
locator(1)
Ahora grid.locator()
como me señaló por Dason en talkstats.com (HERE) puede devolver algo. Simplemente no sé cómo usar ese algo para obtener una coordenada del mapa.
> grid.locator()
$x
[1] 286native
$y
[1] 133native
Las unidades no parecían ayudar porque no son las coordenadas del mapa. Tal vez necesito algún tipo de conversión.
Gracias de antemano.
EDIT: (basado en la respuesta de Dwin)
Dwin el mundo tiene la idea correcta, pero el factor de conversión es un poco apagado. La ayuda con eso sería apreciada. En el siguiente ejemplo, tengo un mapa con un punto rojo en las coordenadas (x = -73 & y = 40.855). Lancé la respuesta de Dwin a una función para devolver las coordenadas. Esperaría que los resultados sean las coordenadas que coloco pero no lo son.
Ideas?
require(maps); library(ggplot2); require(grid)
county_df <- map_data('county') #mappings of counties by state
ny <- subset(county_df, region=="new york") #subset just for NYS
ny$county <- ny$subregion
NY <- ggplot(ny, aes(long, lat)) +
geom_polygon(aes(group=group), colour='black', fill=NA) +
coord_map() + geom_point(aes(-73, 40.855, colour="red"))
NY
gglocator <- function(object){
require(maps); require(grid)
z <- grid.locator("npc")
y <- sapply(z, function(x) as.numeric(substring(x, 1, nchar(x))))
locatedX <- min(object$data$long) + y[1]*diff(range(object$data$long))
locatedy <- min(object$data$lat) + y[2]*diff(range(object$data$lat))
return(c(locatedX, locatedy))
}
#click on the red dot
gglocator(NY) #I expect the results to be x = -73 & y = 40.855
EDIT 2: (Yendo fuera de la respuesta de Baptise)
estamos allí
NY <- ggplot(ny, aes(long, lat)) +
geom_polygon(aes(group=group), colour='black', fill=NA) +
coord_map() + geom_point(aes(-73, 40.855, colour="red")) +
scale_x_continuous(expand=c(0,0)) + scale_y_continuous(expand=c(0,0))
NY
x <- grid.ls()[[1]][grep("panel-", grid.ls()[[1]])] #locate the panel
seekViewport(x)
y <- grid.locator("npc")
y <- as.numeric(substring(y, 1, nchar(y)-3))
locatedX <- min(NY$data$long) + y[1]*diff(range(NY$data$long))
locatedy <- min(NY$data$lat) + y[2]*diff(range(NY$data$lat))
locatedX; locatedy
ACTUALIZACIÓN:La función gglocator
del ggmap package contiene ahora esta funcionalidad
similares, debido a los cambios en ggplot2, ggLocator de ggmap ya no funciona: https://github.com/dkahle/ggmap/issues/87 –