coord_sfを使用してスケーリングされたggplotマップにスケールバーを追加しますか?
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を呼び出し続ける必要があります。
ありがとう!
回答
おっしゃるように、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)
