27

注:この質問はマッピングに固有のものですが、標準のデカルト座標系でプロットするときに使用できるようにしたいと思います。

私はベースグラフィックスが大好きですが、多くの点でggplot2も好きです。グラフを微調整するために最もよく使用される基本関数の1つは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)

これで、talkstats.com(ここgrid.locator())でDasonが私に指摘したように、何かを返すことができます。その何かを使って地図の座標を取得する方法がわかりません。

> 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:(バプテスマの答えから離れる)

があった

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関数にこの機能が含まれるようになりました。

4

5 に答える 5

10

「npc」単位からマップ単位に変換できるように、意味のある単位系を使用して情報をggplotオブジェクトに保存する必要があります。

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
于 2012-02-26T17:54:40.027 に答える
7

scale_x_continuous(expand=c(0,0)) + scale_y_continuous(expand=c(0,0))プロットに追加すると、seekViewport("panel-3-4")前に正しい結果が得られますgrid.locator()

于 2012-02-26T20:08:40.927 に答える
5

これが、DWinとBaptiseが関数にまとめてくれたすべてのものを使用した最終結果です。また、ggplotのヘルプリストについても問い合わせました。ここに報告し、追加情報を提供します。

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)
于 2012-02-27T06:36:09.447 に答える
5

私はggplotヘルプリストに書き込み、同じ問題にたまたま興味を持っていたDavidKahleから非常に役立つ応答を受け取りました。彼の機能は次の点で優れています。

1)スケールyとスケールxをプロットに追加する必要はありません

2)一度に複数のポイントを見つけて、それらをデータフレームとして返すことができます

3)マップだけでなく、あらゆるタイプのggplotで機能します

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

更新: ggmapパッケージgglocator関数にこの機能が含まれるようになりました。

于 2012-02-27T18:44:51.147 に答える
3

これらの投稿は非常に役に立ちましたが、数年経ちましたので、いくつかのことが壊れています。これが私のために働くいくつかの新しいコードです。正しいビューポートを見つけるためのコードが機能しなかったため、代わりにcurrent.vpTree()、手動で正しいビューポートを検索し、それをにコピーしていましたseekViewport()。私のビューポート'panel.6-4-6-4'は古いスタイルではなく、だったことに注意してくださいpanel-*。最後に、rstudioでレンダリングするときに正しい答えが得られず、代わりにを使用する必要がありましたx11()

これが完全な例です。これがお役に立てば幸いです。

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
于 2017-09-22T19:51:38.553 に答える