4

ggplot2 を使用して、サンフランシスコの地図に重ねたいポイントのリストがあります。各ポイントは、経度と緯度のペアです。結果のマップを経度/緯度座標系にしたい。Hadley Wickham のサンプル ファイルを使用して、ポリゴン シェープファイルをプロットするための指示を再現することができました。Windows 用の R 2.15.1 を使用しています。

ただし、UScensus2010cdp パッケージからダウンロードした cdp ファイルを使用しようとしました。ここに私のコードスニペットがあります:

require("rgdal") 
require("maptools")
require("ggplot2")
require("sp")
require("plyr")
gpclibPermit() # required for fortify method
require(UScensus2010)
require(UScensus2010cdp)
data(california.cdp10)
sf <- city(name = "san francisco", state="ca")
sf.points = fortify(sf)

次のエラーが表示されます。

Using name to define regions.
Error in unionSpatialPolygons(cp, invert(polys)) : input lengths differ
In addition: Warning message:
In split(as.numeric(row.names(attr)), addNA(attr[, region], TRUE)) :
   NAs introduced by coercion

誰か知っていますか:

  1. fortify() の region パラメータに与える適切な値は何ですか?
  2. それが失敗した場合、ggplot2 が描画できるサンフランシスコの未変換の緯度/経度座標を含む地図データのソースは?
  3. 別の方法として、データが翻訳された別のサンフランシスコの地図を見つけました。このデータを生の緯度/経度に変換する方法、またはポイント セットの逆変換を行う方法を教えてください。
4

1 に答える 1

7

ノート:

問題

この問題は、 が数値へfortify.SpatialPolygonsDataFrameの変換に依存しておりrow.names、データの行名が識別子であるという事実から発生します。

ggplot2:::fortify.SpatialPolygonsDataFrame 

function (model, data, region = NULL, ...) 
{
    attr <- as.data.frame(model)
    if (is.null(region)) {
        region <- names(attr)[1]
        message("Using ", region, " to define regions.")
    }
    polys <- split(as.numeric(row.names(attr)), addNA(attr[, 
        region], TRUE))
    cp <- polygons(model)
    try_require(c("gpclib", "maptools"))
    unioned <- unionSpatialPolygons(cp, invert(polys))
    coords <- fortify(unioned)
    coords$order <- 1:nrow(coords)
    coords
}

あなたの場合

row.names(sf@data)
## [1] "california_586" "california_590" "california_616"

place stateおよびnameは 3 つのポリゴンを一意に識別しないため、領域パラメータとして使用する識別子です。

# as.character used to coerce from factor
lapply(lapply(sf@data[,c('place','state','name')], unique), as.character)
## $place
## [1] "67000"
## 
## $state
## [1] "06"
## 
## $name
## [1] "San Francisco"

要素が英字で始まる文字ベクトルとして、数値に強制すると、次のようになります。NA

as.numeric(rownames(sf@data))
## [1] NA NA NA
## Warning message:
## NAs introduced by coercion

与えられた警告の1つはどれですか

解決

  1. 行名になる列を定義します
  2. row.names をNULLまたはに設定します1:nrow(sf@data)

そう..

# rownames
sf@data[['place_id']] <- rownames(sf@data)
row.names(sf@data) <- NULL

# fortify
sf_ggplot <- fortify(sf, region = 'place_id')
# merge to add the original data
sf_ggplot_all <- merge(sf_ggplot, sf@data, by.x = 'id', by.y = 'place_id')
# very basic and uninteresting plot
ggplot(sf_ggplot_all,aes(x=long,y=lat, group = group)) + 
  geom_polygon(aes(fill =pop2000)) + 
  coord_map()

ここに画像の説明を入力

于 2012-09-03T02:06:05.437 に答える