Эквивалент локатора в ggplot2 (для карт)

Примечание: этот вопрос касается картографии, но я хотел бы иметь возможность использовать его, когда я рисую в стандартной декартовой системе координат.

Мне нравится базовая графика, но мне также нравится ggplot2 за многие вещи. Одна из моих наиболее часто используемых базовых функций для точной настройки графика - locator (n), но это вызывает ошибку в 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)

Теперь grid.locator () , как указал мне Дейсон на talkstats.com ( ЗДЕСЬ ), может что-то возвращать. Я просто не знаю, как использовать это что-то, чтобы получить координаты карты.

> grid.locator()
$x
[1] 286native

$y
[1] 133native

Единицы, похоже, не помогли, поскольку они не являются координатами карты. Может мне нужно какое-то преобразование.

Заранее благодарю.

РЕДАКТИРОВАТЬ: (на основе ответа DWin)

Двин понял правильную идею, но коэффициент преобразования немного неверен. Помощь с этим будет признательна. В приведенном ниже примере у меня есть карта с красной точкой в ​​координатах (x = -73 & y = 40,855). Я бросил ответ Двина в функцию, чтобы вернуть координаты. Я ожидал, что результаты будут координатами, которые я ввел, но это не так.

Идеи?

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

РЕДАКТИРОВАТЬ 2: (Исходя из ответа Баптиса)

Мы там

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 

ОБНОВЛЕНИЕ: Функция gglocator пакета ggmap теперь содержит эту функциональность.

26
задан Andrie 16 June 2012 в 05:30
поделиться