R、ggplot、geom_polygonを使用してポリゴン(アーティファクト)を「引き裂く」原因は何ですか?


9

この質問での回答のおかげで、イギリスの一部、この場合はペンブロークシャーの選挙区のサブセットを作成して地図を描くことができました。結果のデータフレームは大きく、Ordnance Surveyデータが含まれているため、ここに投稿することは困難ですが、データフレームは次のようになります。

> str(bar)
'data.frame':   134609 obs. of  7 variables:
 $ long : num  214206 214203 214202 214198 214187 ...
 $ lat  : num  207320 207333 207339 207347 207357 ...
 $ order: int  1 2 3 4 5 6 7 8 9 10 ...
 $ hole : logi  FALSE FALSE FALSE FALSE FALSE FALSE ...
 $ piece: Factor w/ 12 levels "1","2","3","4",..: 1 1 1 1 1 1 1 1 1 1 ...
 $ group: Factor w/ 82 levels "Amroth ED.1",..: 1 1 1 1 1 1 1 1 1 1 ...
 $ id   : chr  "Amroth ED" "Amroth ED" "Amroth ED" "Amroth ED" ...

ggplot次のコードを使用して、結果のデータフレームを供給しました。

ggplot(bar, aes(x = long, y = lat, group = group)) +
  geom_polygon(colour = "black", fill = "grey50")

これにより、次の画像が生成され、見た目もきれいになります。 選挙区の地図

次に、これを、次のような人口データを含むデータフレームと組み合わせました。

> str(mydf)
'data.frame':   60 obs. of  22 variables:
 $ ward.code  : chr  "00NSPH" "00NSPJ" "00NSPK" "00NSPL" ...
 $ id         : chr  "Amroth ED" "Burton ED" "Camrose ED" "Carew ED" ...
 $ la         : chr  "Pembrokeshire" "Pembrokeshire" "Pembrokeshire" "Pembrokeshire" ...
 $ total      : num  1237 1737 2458 1570 1976 ...
 $ age.0.4    : num  34 86 81 92 107 76 131 77 90 95 ...
 $ age.5.9    : num  45 93 83 80 138 82 111 85 132 75 ...
 $ age.10.14  : num  65 116 123 103 111 79 151 80 135 83 ...
 $ age.15.19  : num  69 90 161 126 117 93 150 87 139 103 ...
 $ age.20.24  : num  42 63 116 58 81 63 120 58 114 79 ...
 $ age.25.29  : num  46 63 73 60 86 56 90 51 108 67 ...
 $ age.30.34  : num  38 60 87 72 99 54 115 62 76 42 ...
 $ age.35.39  : num  53 105 104 82 110 81 91 76 121 82 ...
 $ age.40.44  : num  70 142 128 107 116 88 161 89 151 92 ...
 $ age.45.49  : num  71 138 172 122 128 109 192 116 190 104 ...
 $ age.50.54  : num  93 136 204 108 133 119 168 125 174 99 ...
 $ age.55.59  : num  126 129 235 125 149 108 179 137 175 106 ...
 $ age.60.64  : num  139 162 248 170 194 129 236 183 199 136 ...
 $ age.65.69  : num  110 110 205 95 129 143 172 128 167 130 ...
 $ age.70.74  : num  81 85 174 52 100 75 110 88 113 128 ...
 $ age.75.79  : num  78 54 130 58 74 70 72 68 119 114 ...
 $ age.80.84  : num  38 50 84 33 56 43 63 42 94 62 ...
 $ age.85.plus: num  39 55 50 27 48 42 36 55 85 84 ...

...次のコードを使用:

foo <- merge(mydf, bar)

次のように結果をプロットしました:

ggplot(foo, aes(x = long, y = lat, group = group)) + 
   geom_polygon(colour = "black", fill = "grey50")

問題は、次の図に示すように、結果のプロットにアーティファクトがあることです。

アーティファクトのある地図

したがって、シェープファイルからの元のデータフレームサブセットは問題ありませんが、マージされたデータファイルには「問題」があります。

Q.この種のアーチファクトの原因は何ですか?完全なコードとデータがない場合、これは当て推量であり、事前に謝罪しますが、オブジェクトが非常に大きく、再配布の問題がある可能性があることを理解しています。どこから探し始めるかについてのヒント、ポインタ、提案はいただければ幸いです。


このようなレンダリングの問題は、多くの場合、ジオメトリエラーが原因で発生しますが、データフレームをマージした後に発生するのは奇妙です。QGISまたはGRASSでエラーをチェックしてみてください(エラーもクリーンアップできます)。
シンバマング2012年

回答:


7

私は遅れてsort、そのmerge呼びかけの一部が非難することであることに気づきました。私が使用する場合:

foo <- merge(mydf, bar, sort = FALSE)

少なくともこの特定のケースでは、ポリゴンは正しくプロットされます。情報を提供してくれた皆さんに感謝します。


6

fooのlong、lat、piece、holeの列をbarの列と比較します。マージはどういうわけかその情報を失いました。

混乱の理由は、通常、ポリゴンが複数のピースから作られ、アルゴリズムが各ピースを別々のリングとして描画するためです。「ピース」情報が欠落している場合は、一度にロット全体を描画します。これは、実際の島または小さなデジタル化エラーがある場合に明らかになります。

棒にはリングごとに1つの行があると思いますが、マージによって選挙区ごとに1つの行が生成されたと思います。シェープファイルレベルでマージを実行してから、強化します。


提案をありがとう、とても役に立ちました。唯一の問題は、シェープファイルに関して私がまったくの初心者であることです。シェープファイルレベルでどのようにマージするかを提案できますか?
SlowLearner、2012年

3
シェープファイルをshape前のQでコールバックされたものに読み込むと、それshapeを(ほとんど)データフレームとして扱うことができます。列をそのデータフレームに追加します。マージが機能するかどうかはわかりませんが、正しい順序で取得して、新しい列(cbind?)として追加してください。次に、強化してプロットします。実際、使用するだけでspplot(shape,"foo")、ggplotは必要ありません。
Spacedman、2012年

おかげで、merge()はピース列で間違いなく何かを混乱させています。「手動」マージを行ったところ、ポリゴンは問題ありませんでした。したがって、おそらくシェープファイルにデータを追加すると言うように、これにどのように取り組むかについて考えます。
SlowLearner

3

dplyrleft_joinは、左側のすべての行を保持し(a)、bを結合してbのすべての列を追加します。この方法では、ポリゴンに関する情報を含むデータフレームの情報は変更されません。それでこの問題は解決するかもしれません。

コマンドは次のようになります。

library(dplyr)
foo <- left_join(mydf, bar)

むしろ、古い投稿を編集してから二重に投稿してください。その投稿の1つを削除することを考えてください。
wittich

問題の概要(要約)と、ソリューションで問題を解決できる理由を説明することで、これをより適切な回答にすることができます。たとえばコメントとして投稿された理由に同意しますか?もしそうなら、あなたはそれを言って、それを参照するべきです。
nmtoken

-2

マージの直後にfoo <-foo [order(foo $ order)、]を実行するとうまくいきました...マージは順序を混乱させる可能性があります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.