2017-04-04 19 views
4

ワールドマップをプロットするとき、ggplot2に問題があります:実際には表示されていないプロットのコーナーを含め、同じ色で背景全体を色付けします世界中、次のコード(それはbleadingエッジにsf ABD ggplot2のバージョンを使用していますが、問題は一般的なものであり、下記のブログ記事を参照)によって生成以下のスナップショットを参照してくださいされるためにggplot2(とsf)の世界地図用の全地球ポリゴン

#install.packages("devtools") 
    #devtools::install_github("tidyverse/ggplot2") 
    #devtools::install_github("edzer/sfr") 

    library(ggplot2) 
    library(sf) 
    library(rnaturalearth) 
    library(dplyr) 

    theme_map <- function(...) { 
     theme_minimal() + 
     theme(
     text = element_text(family = "Ubuntu Regular", color = "#22211d"), 
     axis.line = element_blank(), 
     axis.text.x = element_blank(), 
     axis.text.y = element_blank(), 
     axis.ticks = element_blank(), 
     axis.title.x = element_blank(), 
     axis.title.y = element_blank(), 
     panel.grid.minor = element_line(color = "#ebebe5", size = 0.2), 
     panel.grid.major = element_line(color = "#ebebe5", size = 0.2), 
     plot.background = element_rect(fill = "#f5f5f2", color = NA), 
     panel.background = element_rect(fill = "#f5f5f2", color = NA), 
     legend.background = element_rect(fill = "#f5f5f2", color = NA), 
     panel.border = element_blank(), 
     ... 
    ) 
    } 

    crs <- "+proj=laea +lat_0=52 +lon_0=10 +x_0=00 +y_0=3210000 +datum=WGS84 +units=m +no_defs" 
    ctrys50m <- ne_countries(scale = 50, type = "countries", returnclass = "sf") %>% 
     select(iso_a3, iso_n3, admin) 

    ggplot() + 
     geom_sf(data = ctrys50m, alpha = 0.15, fill="grey") + 
     coord_map() + 
     coord_sf(crs = crs) + 
     theme_map() 

enter image description here

を地球の輪郭をうまくプロットできるD3.js特別にGeoJSON type{type: "Sphere"}が追加された、アクションhereで見ることができるthis threadを参照してください。それは、次のスナップショット内外装地球全体の黒のボーダーである:

enter image description here

私が見つけた唯一のトリックR/ggplot2は、ブログストーリーMapping the Longest Commericial Flights in Rで、Bounding box and graticulesセクションとmake_bboxproject_recenterの機能を参照して、Matt Strimas-Mackeyによって発行されたものです。

これら

は、コードのかなり多くあり、私はいくつかの sfまたは geom_sfコードはクリーン/シンプルなコードになるだろうかどうか迷ったので、私が試した:私は何を得ることがちょうど余分である

# whole world WSG84 bounding box 
    sphere <- ne_download(category = "physical", type = "wgs84_bounding_box", returnclass = "sf") 
    sphere_laea <- st_transform(sphere, crs) 
    ggplot() + 
     geom_sf(data = sphere, fill = "#D8F4FF") + 
     coord_sf(crs = crs) + 
     geom_sf(data = ctrys50m, alpha = 0.15, fill="grey") + 
     coord_map() + 
     coord_sf(crs = crs) + 
     theme_map() 

」 (北極からの線に注意してください)海洋#D8F4FF ... とポリゴンはかなり下に不規則です(D3.jsの師は精確を高めるためにいくつかのスマートなadaptive resampling投影された線の...)

enter image description here

ggplot2ワールドマップの世界全体のポリゴンを取得しようとした私の試みで何が間違っているかについてのアイデアはありますか? (ここまで読んでくれてありがとう!)

答えて

6

デイブの提案に続いて、私は凸包操作が世界のボーダーの十分良い近似値になりますように十分に小さい新しい目盛りを作成しました。これは素晴らしい提案です

library(ggplot2) 
library(sf) 
library(rnaturalearth) 
library(dplyr) 

crs <- "+proj=laea +lat_0=52 +lon_0=10 +x_0=00 +y_0=3210000 +datum=WGS84 +units=m +no_defs" 

ctrys50m <- ne_countries(scale = 50, type = "countries", returnclass = "sf") %>% 
    select(iso_a3, iso_n3, admin) 

sphere <- st_graticule(ndiscr = 10000, margin = 10e-6) %>% 
    st_transform(crs = crs) %>% 
    st_convex_hull() %>% 
    summarise(geometry = st_union(geometry)) 

ggplot() + 
    geom_sf(data = sphere, fill = "#D8F4FF", alpha = 0.7) + 
    geom_sf(data = ctrys50m, fill="grey") + 
    theme_bw() 

enter image description here

3

私はsfの魔法を発見する過程でもまだいますので、あなたの問題へのより直接的な解決策があるかもしれません。

地球の球のポリゴンを抽出するには、目的の投影の目盛りを使用して、凸包を作成し、結果のポリゴンを結合するだけです。

library(ggplot2) 
library(sf) 
library(rnaturalearth) 
library(dplyr) 

crs <- "+proj=laea +lat_0=52 +lon_0=10 +x_0=00 +y_0=3210000 
     +datum=WGS84 +units=m +no_defs" 

ctrys50m <- ne_countries(scale = 50, type = "countries", returnclass = "sf") %>% 
    select(iso_a3, iso_n3, admin) 

sphere <- st_graticule(st_transform(ctrys50m, crs = crs)) %>% 
    st_convex_hull() %>% 
    summarise(geometry = st_union(geometry)) 

ggplot() + 
    geom_sf(data = sphere, fill = "#D8F4FF", alpha = 0.7) + 
    geom_sf(data = ctrys50m, fill="grey") + 
    #coord_sf(crs = crs) + # not necessary because the crs from the first layer is being used. 
    theme_bw() 

これは次のプロットを示していますが、まだ見えているコーナーがありますが、用途によっては十分かもしれません。

enter image description here

+0

: 次のコードは、非常に良い結果を(後の画像を参照)を与えます。より良いポリゴンを得るために 'ne_countries(scale = 10、...)'を使用しますが、そうでなければ実行可能な解決策です。ありがとう! – espinielli

+0

私は非常に良い結果を得ました。すなわち、球体の定義は次のようになりました。球体の定義は次のようになりました。球体st_graticule(ndiscr = 10000、margin = 10e-6)%>%st_transform(crs = crs)%>%st_convex_hull ()%>%summarize(ジオメトリ= st_union(ジオメトリ)) ' – espinielli

関連する問題