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