注意:这个问题是关于映射的,但我希望能在标准笛卡尔坐标系中绘图时使用它。
我喜欢基础图形,也喜欢ggplot2的许多功能。调整图形的一个最常用的基础函数是locator(n),但在ggplot2中会产生错误。
现在,正如Dason在talkstats.com上指出的那样(HERE),
我喜欢基础图形,也喜欢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)
现在,正如Dason在talkstats.com上指出的那样(HERE),
grid.locator()
可以返回一些东西。我只是不知道如何使用这些东西来获取地图坐标。> grid.locator()
$x
[1] 286native
$y
[1] 133native
单位似乎没有帮助,因为它们不是地图坐标。也许我需要某种转换。
提前谢谢。
编辑:(基于DWin的回答)
DWin的想法是正确的,但转换系数有点偏差。希望能帮忙解决。在下面的示例中,我有一个地图,在坐标(x = -73&y = 40.855)处有一个红点。我把DWin的回答放入一个函数中返回坐标。我期望结果是我输入的坐标,但实际上并不是。
有什么想法吗?
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:(参考Baptise的答案)
我们到达了那里。
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
更新:ggmap包的gglocator
函数现在包含了这个功能。