coord_sfを使用してスケーリングされたggplotマップにスケールバーを追加しますか?

Aug 18 2020

sfパッケージとggplot2を使用してマップを作成しました。

library(ggplot2)
library(sf)
library(rnaturalearth)
state_prov <- rnaturalearth::ne_states(c("united states of america", "canada"), returnclass="sf")
x <- ggplot(data=state_prov) + 
geom_sf()+
coord_sf(xlim=c(-170, -95), ylim=c(40, 75)) 
print(x)

これにより、Rstudioで次のマップが生成されます。

それは素晴らしいことですが、それにスケールバーを追加する必要があります。ggsnを使用してコードを変更しようとすると、スケールバーがまったく表示されません。

library(ggplot2)
library(sf)
library(rnaturalearth)
state_prov <- rnaturalearth::ne_states(c("united states of america", "canada"), returnclass="sf")
x <- ggplot(data=state_prov) + 
geom_sf()+
coord_sf(xlim=c(-170, -95), ylim=c(40, 75)) +
ggsn::scalebar(state_prov, location="topleft", dist = 50, dist_unit = "km", 
                 transform=TRUE, model="WGS84", height=0.1)
print(x) 

高さ、st.dist、場所を変更しようとしましたが、うまくいきませんでした。coord_sf()の呼び出しを削除すると、スケーリングが不十分なスケールバーが表示され、地図がcoord_sf()によって拡大されていることをggsnが認識していないと思われます。

これを修正するにはどうすればよいですか?ggsnは簡単に変更できないようです。別のパッケージまたはメソッドを使用することもできますが、同じ構造に基づくはるかに複雑なマップがあるため、同様の方法でggplotを呼び出し続ける必要があります。

ありがとう!

回答

2 nniloc Aug 18 2020 at 07:33

おっしゃるように、coord_sfコードの一部をコメントアウトすると、スケールバーが表示されます。私の推測では、データセット全体からggsn::scalebarそのtopleft場所を取得している必要があり、スケールバーstate_provを使用しcoord_sfてズームするとトリミングされます。

編集:この縮尺で緯度/経度の投影を使用して地図に縮尺バーを配置するときは、極端な歪みに注意してください。https://stackoverflow.com/a/41373569/12400385

スケールバーを表示するためのいくつかのオプションがあります。

オプション1

ggspatial::annotation_scale代わりに使用すると、ggsnで定義されているズームが認識されるようcoord_sfです。

ggplot(data=state_prov) + 
  geom_sf()+
  coord_sf(xlim=c(-170, -95), ylim=c(40, 75)) +
  ggspatial::annotation_scale(location = 'tl')

オプション2

元のコードを使用しますが、state_provプロットする前にトリミングしてscalebar、正しいコードを見つけられるようにしますtopleft

state_prov_crop <- st_crop(state_prov, xmin=-170, xmax = -95, ymin = 40, ymax = 75)

ggplot(data=state_prov_crop) + 
  geom_sf()+
  #coord_sf(xlim=c(-170, -95), ylim=c(40, 75)) +
  ggsn::scalebar(state_prov_crop, location="topleft", dist = 50, dist_unit = "km", 
                 transform=TRUE, model="WGS84", height=0.1)