manipulation ggplot geom_text change r ggplot2 ggmap

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()