R
GGPLOT2 - geom_map (한국 지도 그림 그리기)
쿠키아버님
2022. 1. 8. 22:56
먼저, 대한민국의 행정구역에 대한 공간 데이터를 다운받는다
(필요한 파일은 TL_SCCO_CTPRVN.shp) (17개 행정구역별 그림을 그려야 하는 상황이었기 때문에 이 파일만 사용)
http://www.gisdeveloper.co.kr/?p=2332
지도 그림을 그리기 위해서는 sf 패키지가 필요하다.
library(ggplot2)
library(sf)
map_korea <- st_read('TL_SCCO_CTPRVN.shp') #지도 데이터 읽기
#행정 구역 데이터를 UTF-8로 변환하여 읽기
map_korea$CTPRVN_CD <- iconv(map_korea$CTPRVN_CD,
from='CP949',
to='UTF-8',
sub=NA,
mark=TRUE,
toRaw=FALSE)
#원본 데이터를 sp 데이터로 변환 및 정리
map_korea_shp <- as(map_korea, 'Spatial')
map_korea_df <- fortify(map_korea_shp)
> head(map_korea_df)
long lat order hole piece id group
1 1091705 2034023 1 FALSE 1 1 1.1
2 1091705 2034038 2 FALSE 1 1 1.1
3 1091656 2034038 3 FALSE 1 1 1.1
4 1091616 2034059 4 FALSE 1 1 1.1
5 1091570 2034089 5 FALSE 1 1 1.1
6 1091550 2034094 6 FALSE 1 1 1.1
그림에 그릴 때 사용할 데이터의 형태는 위와 같다.
long과 lat은 경도, 위도를 의미하며,
id는 1부터 17까지의 값으로 이루어져 있다. (행정 구역 구분용)
> unique(map_korea_df$id)
[1] "1" "2" "3" "4" "5" "6" "7" "8" "9" "10" "11" "12" "13" "14" "15"
[16] "16" "17"
위 데이터와 geom_map을 사용하여 그림 그리기
ggplot(data=map_korea_df,
aes(x = long,
y = lat)) +
geom_map(map = map_korea_df,
aes(map_id = id))
나의 경우 각 행정구역 별로 데이터에 맞는 히트맵으로 그려야 했으며,
경계선 등 여러가지 커스터마이징을 추가함
아래는 예시 코드
Heatmap_data = data.frame(Value=runif(17))
df_Heatmap = data.frame(id=as.character(1:17),
value=Heatmap_data$Value)
#데이터 결합
map_korea_df_heatmap = map_korea_df%>%left_join(df_Heatmap,by="id")
ggplot(data=map_korea_df_heatmap,
aes(x = long,
y = lat)) +
geom_map(map = map_korea_df_heatmap,
aes(fill=value, map_id = id)) +
#히트맵 색상 지정
scale_fill_gradientn(colors=brewer.pal(9,"OrRd"),
limits=c(0, max(Heatmap_data$Value)))+
geom_polygon(aes(x=long,
y=lat,
group=group,
color=id),
fill = NA,
colour = 'black')+
#여러가지 커스터마이징
theme(panel.background = element_blank(),
axis.text=element_blank(),
legend.title=element_blank(),
legend.text = element_text(size=20),
axis.ticks = element_blank(),
legend.position = "top",
legend.direction = "horizontal",
legend.key.width = unit(125, "pt"))+
labs(x=NULL,
y=NULL)
짠