2015-01-12 2 views
1

ggplot (geom_polygon, 선, 점 및 세그먼트로 구성)에지도가 있습니다. 원본은 위도/경도 단위의 모든 단위와 함께 WGS에있었습니다. 모든 추가 데이터 (선 및 점)도도 단위입니다. 나는 모든 것을 동등한 투영 (Mollweide)으로 재 변환하고 싶다. 첫 번째 단계 (기본 rworldmap 다각형을 변형)는 약간의 수평선이 지나치기는하지만 상당히 어려웠습니다. 그러나, 나는 다음 단계를 다루는 방법을 모르겠습니다. 앞에서 말했듯이, 모든 데이터는도 단위이며 xlim/ylim, 축 레이블 및 (구부러진) 그리드 선을도 단위로 지정합니다. 모든 것을 Mollweide 미터로 변환해야합니까, 아니면 내 마지막 맵 객체를 무난히 재구성 할 수 있습니까?ggplot2에서 rworldmap을 변형합니다.

이것은 이상한 수평선을 보여주기 위해 내가 지금까지 가지고있는 것입니다.

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() 

이렇게하면 수평선이 생깁니다.

enter image description here

편집 :

다음 @hrbmstr의 대답, 나는 coord_map("molleweide") 그의 GeoJSON 파일을 사용하고 있습니다 :

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) 인수가 표시 영역을 방금 변경했다고 생각했지만지도가 그려지는 방식에 영향을 미치는 것으로 보입니다. 어떤 아이디어? enter image description here

+0

프리 클립 클립을 표시하는 방법으로 업데이트되었습니다. – hrbrmstr

답변

3

당신은 ggplot이 당신을 대신해 줄 수 있고, 더 좋은지도를 사용하여 줄을 없앨 수도 있습니다. 아래에 언급 된 GeoJSON 파일은 Natural Earth 모양 파일로 만들어졌으며 그곳의 모양 파일 (또는 here에서 만든 최적화 된 GeoJSON)을 사용할 수 있습니다. 이 추가 포인트를 다루는 방법

을 보여주기 위해, 나는 당신이 coord_map로 문제를 방지하기 위해 시간을 앞서 세계를 클립 수 AUS

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 
미국 &에 대한

enter image description here

을 가까운 무게 중심을 추가 :

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 

(참고 : 혼란을 피하기 위해 위에 나온 코드를 모두 포함하지 않았습니다.) 동일한 테두리 상자 코드를 사용하여 클리핑 된지도 주위에 투영 된 경계선을 배치 할 수도 있습니다. rworldmap 맵으로부터

enter image description here

+0

세계의 가장자리가 어디인지를 나타내는 배경없이 이런 투사법을 사용하지 마십시오. 지도 제작자는 울 것이다. – Spacedman

+0

OP는'xlim' /'ylim'을 사용하여 어딘가로 확대 할 것이므로이 예제에서는 중요하지 않다고 생각했지만 당신 말이 맞습니다. 고칠 것입니다. – hrbrmstr

+0

고마워 - 아주 깔끔 해. 하지만'xlim' (내부의'coord_map') 사용에 문제가 있습니다. 만약 한계가 0 (예 :'xlim = c (-40, 40)')이라면 괜찮습니다. 그러나'xlim = c (-50, 40)'을 사용하면 다시 수평선이 나타납니다 (@hrbrmstr의 사용). GeoJSON). 'ylim'에 문제 없음 – TFinch

1

제외 남극 성가신 가로줄을 보정 한 방법이다. 기본 값이 resolution 인 굵은 해상도 맵만이 필요하고, rworldmap::getMap()이 필요합니다.

코드의 최소한의 변경으로 문제의 첫 번째 부분을 해결할 수 있습니다.

moll_crs<-CRS("+proj=moll +ellps=WGS84") 
#first get countries excluding Antarctica which can crash spTransform 
#for a world plot you only need coarse resolution which is the default for getMap() 
sPDF <- getMap()[getMap()$ADMIN!='Antarctica',] 

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