geom_text - equivalente de localizador en ggplot2(para mapas)
ggplot2 pdf (5)
Aquí están los resultados finales usando todo lo que DWin y Baptise me dieron envuelto en una función. También investigué en la lista de ayuda ggplot e informaré e información adicional aquí.
require(maps); require(ggplot2); require(grid)
ny <- map_data(''county'', ''new york'')
NY1 <- ggplot(ny, aes(long, lat)) +
geom_polygon(aes(group=group), colour=''black'', fill=NA) +
coord_map() + geom_point(aes(c(-78, -73), c(41, 40.855),
colour=c("blue", "red"))) + opts(legend.position = "none")
NY <- NY1 + scale_x_continuous(expand=c(0,0)) +
scale_y_continuous(expand=c(0,0))
#the scale x and y have to be added to the plot
NY
ggmap.loc <- function(object){
x <- grid.ls()[[1]][grep("panel-", grid.ls()[[1]])] #locate the panel
seekViewport(x)
y <- as.numeric(grid.locator("npc"))
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))
}
ggmap.loc(NY)
Nota: esta pregunta es específica para el mapeo, pero me gustaría poder usarla cuando trazo en un sistema de coordenadas cartesianas estándar.
Me encantan los gráficos básicos, 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 lo señaló 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 ya que no son coordenadas del mapa. Tal vez necesito algún tipo de conversión.
Gracias de antemano.
EDITAR: (basado en la respuesta de DWin)
Dwin tiene la idea correcta, pero el factor de conversión está 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 e 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
EDICION 2: (Saliendo de la respuesta de Baptise)
Estaban 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 paquete ggmap ahora contiene esta funcionalidad.
Escribí a la lista de ayuda ggplot y recibí una respuesta muy útil de David Kahle, que estaba interesado en el mismo problema. Su función es genial en eso:
1) no es necesario agregar la escala y y la escala x a la trama
2) puede encontrar múltiples puntos a la vez y devolverlos como un marco de datos
3) funciona en cualquier tipo de ggplot, no solo mapas
gglocator <- function(n = 1, object = last_plot(),
message = FALSE, xexpand = c(.05,0), yexpand = c(.05, 0)){
#compliments of David Kahle
if(n > 1){
df <- NULL
for(k in 1:n){
df <- rbind(df, gglocator(object = object, message = message,
xexpand = xexpand, yexpand = yexpand))
}
return(df)
}
x <- grid.ls(print = message)[[1]]
x <- x[ grep("panel-", grid.ls(print=message)[[1]]) ] #locate the panel
seekViewport(x)
loc <- as.numeric(grid.locator("npc"))
xrng <- with(object, range(data[,deparse(mapping$x)]))
yrng <- with(object, range(data[,deparse(mapping$y)]))
xrng <- expand_range(range = xrng, mul = xexpand[1], add = xexpand[2])
yrng <- expand_range(range = yrng, mul = yexpand[1], add = yexpand[2])
point <- data.frame(xrng[1] + loc[1]*diff(xrng), yrng[1] + loc[2]*diff(yrng))
names(point) <- with(object, c(deparse(mapping$x), deparse(mapping$y)))
point
}
#Example 1
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(c(-78, -73), c(41, 40.855),
colour=c("blue", "red"))) + opts(legend.position = "none")
NY
gglocator(2)
#Example 2
df <- data.frame(xvar = 2:10, yvar = 2:10)
ggplot(df, aes(xvar, yvar)) + geom_point() + geom_point(aes(x = 3, y = 6))
gglocator()
ACTUALIZACIÓN: la función gglocator del paquete ggmap ahora contiene esta funcionalidad.
Estos mensajes fueron muy útiles, pero han pasado algunos años, por lo que algunas cosas se han roto. Aquí hay un nuevo código que funciona para mí. El código para encontrar la ventana gráfica correcta no funcionaba, así que en su lugar usé current.vpTree()
para buscar manualmente la ventana seekViewport()
correcta, y luego copié eso en seekViewport()
. Tenga en cuenta que la ventana ''panel.6-4-6-4''
para mí era ''panel.6-4-6-4''
y no el antiguo panel-*
estilo- panel-*
. Finalmente, no obtenía las respuestas correctas cuando renderizaba en rstudio, en cambio tenía que usar x11()
.
Aquí hay un ejemplo completo. Espero que esto sea útil.
library(ggplot2)
library(grid)
object<-ggplot(dat=data.frame(x=1:5,y=1:5),aes(x=x,y=y)) +
geom_point() +
scale_x_continuous(expand=c(0,0)) +
scale_y_continuous(expand=c(0,0))
x11()
print(object)
formatVPTree(current.vpTree()) #https://www.stat.auckland.ac.nz/~paul/useR2015-grid/formatVPTree.R
seekViewport(''panel.6-4-6-4'')
y <- as.numeric(grid.locator("npc"))
locatedX <- min(object$data$x) + y[1]*diff(range(object$data$x))
locatedY <- min(object$data$y) + y[2]*diff(range(object$data$y))
locatedX; locatedY
Necesita usar un sistema de unidad que tenga sentido y guardar la información en el objeto ggplot para que pueda convertir de unidades "npc" a unidades de mapa:
require(maps)
require(grid)
NY <- ggplot(ny, aes(long, lat, group=group)) + geom_polygon(colour=''black'', fill=NA)
grid.locator("npc")
# clicked in middle of NY State:
#$x
#[1] 0.493649231346082npc
#
#$y
#[1] 0.556430446194226npc
range(NY$data$long)
#[1] -79.76718 -71.87756
range(NY$data$lat)
#[1] 40.48520 45.01157
locatedX <- min(NY$data$long) + 0.493649231346082*diff(range(NY$data$long))
locatedX
#[1] -75.87247
locatedY <- min(NY$data$lat) + 0.556430446194226*diff(range(NY$data$lat))
locatedY
#[1] 43.00381
Obtengo el resultado correcto si agrego scale_x_continuous(expand=c(0,0)) + scale_y_continuous(expand=c(0,0))
al gráfico, y seekViewport("panel-3-4")
antes de grid.locator()