R프로그래밍 - ggplot 세계지도 그리기

ggplot2 은 막대차트, 선그래프, 도넛차트 등 기본적인 차트뿐만 아니라 고차원의 차트를 손쉽게 코딩 몇 줄이면 그릴 수 있는 강력한 도구라고 생각한다. 나 역시 괜찮아 보이는 차트들을 하나씩 카피해가면서 ggplot2 로 만들 수 있는지 없는지 해봤지만, 안되는 게 없이 다 된다. 그런데 아직 못해본게 있는데, 바로 map 차트(지도그래프)였다.

간단한 세계지도 그리기

예전에 설치해야하는 지도관련 R 패키지들부터 잘 설치가 안되 시작도 못했었다. 이번에 아예 R패키지를 지우고 새로 설치를 할 일이 있었는데, 그러면서 지도관련 패키지를 설치했더니 이번엔 한번에 설치가 잘되었다. 우선 아래 2개 패키지를 설치한다.

install.packages("sf")
install.packages("spData")

설치가 끝나면 설치된 패키지를 불러온다.

library(sf)

아래 2줄이면 세계지도 그려진다.

ggplot(spData::world) +
  geom_sf()

아시아 지도 그리기

너무 넓으니, 아시아로 한정지어 그려본다. 데이터를 살펴보니, continent 정보를 활용하면 될 거 같다.

spData::world |> head(3)
------------------------------------
Simple feature collection with 3 features and 10 fields
Geometry type: MULTIPOLYGON
Dimension:     XY
Bounding box:  xmin: -180 ymin: -18.28799 xmax: 180 ymax: 27.65643
Geodetic CRS:  WGS 84
# A tibble: 3 × 11
  iso_a2 name_long      continent region_un subregion       type              area_km2      pop lifeExp gdpPercap
  <chr>  <chr>          <chr>     <chr>     <chr>           <chr>                <dbl>    <dbl>   <dbl>     <dbl>
1 FJ     Fiji           Oceania   Oceania   Melanesia       Sovereign country   19290.   885806    70.0     8222.
2 TZ     Tanzania       Africa    Africa    Eastern Africa  Sovereign country  932746. 52234869    64.2     2402.
3 EH     Western Sahara Africa    Africa    Northern Africa Indeterminate       96271.       NA    NA         NA 
# ℹ 1 more variable: geom <MULTIPOLYGON [°]>

Asia 로 데이터를 필터 걸어 저장하고, 그래프를 다시 그린다.

asia = spData::world |> 
  filter(continent == 'Asia')

ggplot(asia) +
  geom_sf()

특정 영역 확대하기

coord_sf 함수를 활용해서 특정영역을 확대해서 그릴 수 있다. 파라메터 xlim 에는 경도를 ylim 에는 위도정보를 최소,최대값을 벡터로 엮어 넣어주면 된다.

ggplot(spData::world) +
  geom_sf() +
  coord_sf(xlim = c(100, 150), # 경도
           ylim = c(25, 50)) # 위도

나라별로 색깔을 좀 넣어서 디자인하면 아래와 같이 출력도 가능하다. 이게 세계지도 데이터이다보니, 나라별로 지도데이터가 적어서 확대해서 보면 너무 단순하게 그려진다. 울릉도, 독도도 안보이지만, 심지어 제주도 마저 없다. 별도로 우리나라 지도 데이터를 따로 받으면 더 자세하게 그릴 수 있는데, 그건 다음 포스팅때 적어보려한다.


더 보면 좋을 글들