2017-05-23 7 views
8

ライブラリspにggplot2の穴があるSpatialPolygonsを描画します。
http://stackoverflow.com/questions/12047643/geom-polygon-with-multiple-hole/12051278#12051278
実際 broom::tidyを使用してSpatialPolygonsを変換する際に、(ggplot2::fortifyを置き換える)、穴のポリゴンが時計回りに保存されているとして描画する:StackOverflowの上の他の人の質問に おかげで、私は時計回りに書かれたポリゴンを扱う一方で、これが許可されていることを知っています穴。
ggplot2では、穴があるポリゴンを強制的に描画して、fillを使用して一度描画し、もう一度colourを使用して描画します。そうしないと、ポリゴンと交差する線が表示されることがあります。 複数のサブポリゴンを扱う場合、穴があるものもありますが、これはより難しく、broom::tidyで定義されている点のフィーチャの順番でポリゴンを塗りつぶすことはできません(下の画像を参照)。
あなたはこの充填問題の問題を解決するための解決策をお持ちですか?ここでggplot2を使用して複数のサブポリゴンと穴を持つ空間ポリゴンを描画する

は再現例です。

library(sp) 
library(ggplot2) 

# Create two polygons: second would be a hole inside the first 
xy = cbind(
    x = c(13.4, 13.4, 13.6, 13.6, 13.4), 
    y = c(48.9, 49, 49, 48.9, 48.9) 
    ) 
hole.xy <- cbind(
    x = c(13.5, 13.5, 13.45, 13.45, 13.5), 
    y = c(48.98, 48.92, 48.92, 48.98, 48.98) 
) 

# Transform as SpatialPolygons with holes 
xy.sp <- SpatialPolygons(list(
    Polygons(list(Polygon(xy), 
       Polygon(hole.xy, hole = TRUE)), "1"), 
    Polygons(list(Polygon(xy + 0.2), 
       Polygon(xy + 0.35), 
       Polygon(hole.xy + 0.2, hole = TRUE)), "2") 
)) 

# Transform SpatialObject to be used by ggplot2 
xy.sp.l <- broom::tidy(xy.sp) 

ggplot(xy.sp.l) + 
    geom_polygon(aes(x = long, y = lat, group = id, fill = id)) 

ggplot fill problem with SpatialPolygons with holes

+0

一つの解決策は、SpatialPolygons関数呼び出しでポリゴンを分離伴うだろう。例えばid = 2の2つのポリゴンは2aと2bになります。これは可能でしょうか、それともxy.sp.lからの解決策を探していますか? –

答えて

9

sfパッケージに "オーバー行く" ための良い機会でした。 sfオブジェクトでの作業ggplotで実際にははるかに簡単です、geom_sfジオメトリのおかげ:行を追加

library("sf") 
library("rgeos") 
sf_poly <- as(xy.sp, "sf") 
sf::st_crs(sf_poly) <- 4326 
sf_poly$id <- c(1,2) 
ggplot(sf_poly) + 
    geom_sf(aes(fill = as.factor(id))) 

enter image description here

+0

はい、本当にありがとうございます。あなたの答えは簡単な方法でここで尋ねられた問題を解決します。私は、この問題を抱えている人々がsfに移行することを奨励するだろうと思っています。私は 'sf'がパラメータと関数名で十分安定していた瞬間を個人的に待っていました。しかし、これは、sfの特徴を持つハッチングされた領域ポリゴンを描くことができるという私の他の問題を引き起こす。 sfでこれを可能にする関数を変更し、sfでリーフレットを修正する必要があります。しかし、これは別の質問です。別の時間です...ありがとう。 –

+0

私は人々を 'sf'に移動させるためにこの答えを受け入れます。しかし、これは私の質問に対する答えなので、2番目の答えが与えられます。 –

1

は、問題の原因を示しています。青色の "ポリゴン"が描画され、下から上の穴が描画されます。 (非常に、エレガントに残念ではありません)

enter image description here

このコードは、パスが3位に進む前に戻って最初の作品の出発点に戻ります。

library(dplyr) 
    extra <- xy.sp.l %>% 
     filter(piece != 1) %>% 
     group_by(id, group) %>% 
     summarise(last_pt = max(order)) 


for (n in 1:nrow(extra)) { 
    id_ex <- as.character(extra[n,"id"]) 
    x <- subset(xy.sp.l, id == id_ex & piece == 1 & order == 1) 
    x$order <- as.numeric(extra[n,"last_pt"]) + 0.5 
    xy.sp.l <- rbind(xy.sp.l,x) 
} 

xy.sp.l <- xy.sp.l[order(xy.sp.l$id, xy.sp.l$order),] 

enter image description here

+0

あなたの答えをありがとう。最初のポリゴンの1つのポイントに戻ると、新しいサブポリゴンまたはポリゴンの順序の問題が解決されるようです。私はこのトリックが 'ggplot2'にプロットされるライブラリ' sp'の任意のポリゴンに使用できると思います。 –

+0

上記の三角形のような余分なポリゴンの問題を回避するので、私はそれを信じています。 –

+0

私の質問に直接答えるので、私はこの回答を授与します。しかし、人々に 'sf'への移動を促すために、私は最初の答えを受け入れます。 –

1

この投稿は良い質問です、すでに偉大な答えを受けました。私は人々がsfオブジェクトを扱う方法を学ぶべきだとも信じています。それはRの空間データ型の次世代であるためです。しかし、この場合、ggspatialgeom_spatialパッケージをSpatialPolygonsをプロットするオプションにすることができます。

library(sp) 
library(ggplot2) 
library(ggspatial) 

ggplot() + 
    geom_spatial(xy.sp, aes(fill = id)) 
# Ignoring argument 'mapping' in geom_spatial.SpatialPolygons 
# Autodetect projection: assuming lat/lon (epsg 4326) 

enter image description here

関連する問題