世界地図を描くときに本初子午線とは異なる中心を使用する 質問する

世界地図を描くときに本初子午線とは異なる中心を使用する 質問する

mapsパッケージから世界地図をラスター ジオメトリに重ねていますggplot2。ただし、このラスターは本初子午線 (0 度) ではなく、180 度 (おおよそベーリング海と太平洋) を中心としています。次のコードは地図を取得し、地図を 180 度に中心合わせします。

require(maps)
world_map = data.frame(map(plot=FALSE)[c("x","y")])
names(world_map) = c("lon","lat")
world_map = within(world_map, {
  lon = ifelse(lon < 0, lon + 360, lon)
})
ggplot(aes(x = lon, y = lat), data = world_map) + geom_path()

次のような出力が得られます。

ここに画像の説明を入力してください

明らかに、本初子午線の一方の端またはもう一方の端にあるポリゴン間に線が引かれています。私の現在の解決策は、本初子午線に近いポイントを NA に置き換え、within上記の呼び出しを次のように置き換えることです。

world_map = within(world_map, {
  lon = ifelse(lon < 0, lon + 360, lon)
  lon = ifelse((lon < 1) | (lon > 359), NA, lon)
})
ggplot(aes(x = lon, y = lat), data = world_map) + geom_path()

正しいイメージにつながります。今、いくつか疑問があります。

  1. 別の子午線に地図の中心を合わせるには、もっと良い方法があるはずです。orientationのパラメータを使用しようとしましたmapが、これを に設定してもorientation = c(0,180,0)正しい結果は得られず、実際には結果オブジェクトに何も変更されませんでした (all.equalが生成されましたTRUE)。
  2. 水平方向の縞模様を取り除くことは、ポリゴンの一部を削除しなくても可能であるはずです。ポイント 1 を解決すると、この点も解決される可能性があります。

ベストアンサー1

これは少し難しいかもしれませんが、次の方法で実行できます。

mp1 <- fortify(map(fill=TRUE, plot=FALSE))
mp2 <- mp1
mp2$long <- mp2$long + 360
mp2$group <- mp2$group + max(mp2$group) + 1
mp <- rbind(mp1, mp2)
ggplot(aes(x = long, y = lat, group = group), data = mp) + 
  geom_path() + 
  scale_x_continuous(limits = c(0, 360))

ここに画像の説明を入力してください

この設定により、中心 (つまり、制限) を簡単に設定できます。

ggplot(aes(x = long, y = lat, group = group), data = mp) + 
  geom_path() + 
  scale_x_continuous(limits = c(-100, 260))

ここに画像の説明を入力してください

更新しました

ここでいくつか説明します:

全体のデータは次のようになります。

ggplot(aes(x = long, y = lat, group = group), data = mp) + geom_path()

ここに画像の説明を入力してください

しかしscale_x_continuous(limits = c(0, 360))作物経度 0 から 360 までの領域のサブセット。

そして、 ではgeom_path、同じグループのデータが接続されています。mp2$group <- mp2$group + max(mp2$group) + 1が存在しない場合は、次のようになります。ここに画像の説明を入力してください

おすすめ記事