1

ggplot にマップがあります (geom_polygon、ライン、ポイント、およびセグメントで構成されています)。オリジナルは WGS で、単位はすべて緯度/経度です。すべての追加データ (線と点) も度単位です。全体を正積図法(モルワイデ)に再変換したい。最初のステップ (基礎となる rworldmap ポリゴンの変換) は、奇妙な水平線が走っているものの、かなり簡単でした。しかし、次のステップにどのように取り組むべきかわかりません。私が言ったように、すべてのデータは度単位であり、xlim/ylim、軸ラベル、および (曲線) グリッド線を度単位で指定したいと考えています。すべてをモルワイデ メートルに変換する必要がありますか、それとも最終的な地図オブジェクトを 1 つの簡単な手順で再形成することは可能ですか?

これは、これらの奇妙な水平線を示すために、これまでのところ私が持っているものです。

library(rworldmap)
library(rgdal)
library(ggplot2)

moll_crs<-CRS("+proj=moll +R=10567000 +lon_0=0 +x_0=0 +y_0=0 +units=m +towgs84=0,0,0,0,0,0,0 +no_defs")

ggplot() + 
  geom_polygon(data = spTransform(getMap(resolution = 'low'), CRSobj = moll_crs), 
               aes(x = long, 
                   y = lat, 
                   group = group),
               fill = 'gray90', 
               colour = 'gray10', 
               size = 0.3) +
  coord_fixed()

これにより、水平線が発生します。

ここに画像の説明を入力

編集:

@hrbmstr の答えに続いて、私は彼の GeoJSON ファイルを使用していますcoord_map("molleweide"):

ggplot() + 
  geom_map(data=world, map=world,
           aes(x=long, y=lat, map_id=id), 
           fill="gray90", color="gray10", size=0.3) +
  coord_map("mollweide",
            xlim = c(-50, 40))

ただし、xlim議論は物事を台無しにして、水平線を追加しています。coord_***(xlim)引数が表示可能領域を変更しただけだと思っていましたが、マップの描画方法に影響しているようです。何か案は? ここに画像の説明を入力

4

2 に答える 2

3

ggplot に任せることもできますし、より良いマップを使用して線を取り除くこともできます。以下で参照する GeoJSON ファイルは、Natural Earthシェープファイルから作成されたもので、そこからシェープファイル (またはここから作成した最適化された GeoJSON ) を使用できます。

追加のポイントをどのように処理するかを示すために、米国とオーストラリアの重心を追加しました

library(sp)
library(ggplot2)
library(rgdal)
library(rgeos)

world <- readOGR("ne_50m_admin_0_countries.geojson", "OGRGeoJSON")
outline <- bbox(world)
outline <- data.frame(xmin=outline["x","min"],
                      xmax=outline["x","max"],
                      ymin=outline["y","min"],
                      ymax=outline["y","max"])

world <- fortify(world)

points <- data.frame(lon=c(-98.35, 134.21), lat=c(39.5, -25.36))

gg <- ggplot()
gg <- gg + geom_rect(data=outline, 
                     aes(xmin=xmin, xmax=xmax, ymin=ymin, ymax=ymax), 
                     color=1, fill="white", size=0.3)
gg <- gg + geom_map(data=world, map=world,
                    aes(x=long, y=lat, map_id=id), 
                    fill="gray90", color="gray10", size=0.3)
gg <- gg + geom_point(data=points, aes(x=lon, y=lat), size=3)
gg <- gg + labs(x=NULL, y=NULL)
gg <- gg + coord_map("mollweide")
gg <- gg + theme_bw()
gg <- gg + theme(panel.grid=element_blank())
gg <- gg + theme(panel.border=element_blank())
gg <- gg + theme(axis.ticks=element_blank())
gg <- gg + theme(axis.text=element_blank())
gg


gg

ここに画像の説明を入力

次の問題を回避するために、事前にワールドをクリップできますcoord_map

world <- readOGR("ne_50m_admin_0_countries.geojson", "OGRGeoJSON")
clipper <- as(extent(-50, 40, -60, 60), "SpatialPolygons")
proj4string(clipper) <- CRS(proj4string(world))

world <- gIntersection(world, clipper, byid=TRUE)
world <- fortify(world)

gg <- ggplot()
gg <- gg + geom_map(data=world, map=world,
                    aes(x=long, y=lat, map_id=id), 
                    fill="gray90", color="gray10", size=0.3)
gg <- gg + labs(x=NULL, y=NULL)
gg <- gg + coord_map("mollweide")
gg

(注: 混乱を避けるために、上記のすべてのコードは含めませんでした)。同じバウンディング ボックス コードを使用して、クリップされたマップの周りに投影された境界線を配置することもできます。

ここに画像の説明を入力

于 2015-01-12T12:04:51.543 に答える