library(tidyverse)library(rvest)moon_html<-read_html("https://ko.wikipedia.org/wiki/문재인의_대통령_순방_목록")moon_raw<-moon_html|>html_elements("table")|>html_table()moon_h3<-moon_html|>html_elements("h3")|>html_text()names(moon_raw)<-moon_h3[1:6]map_df(moon_raw[c(1:5)], rbind)#> # A tibble: 58 × 5#> 나라 장소 일자 `세부 내용` 사진 #> <chr> <chr> <chr> <chr> <lgl>#> 1 미국 워싱턴 D.C. 6월 28일~7월 3일 공식 실무 방문.[1] NA #> 2 독일 베를린, 함부르크 7월 5일~7월 8일 2017년 함부르크 G2… NA #> 3 러시아 블라디보스토크 9월 6일~9월 7일 공식 방문. 동방경… NA #> 4 미국 뉴욕 9월 19일~9월 21일 실무 방문. 유엔 총… NA #> 5 인도네시아 자카르타 11월 8일~11월 10일 국빈 방문.[11] NA #> 6 베트남 다낭 11월 10일~11월 12일 2017년 다낭 APEC … NA #> 7 필리핀 마닐라 11월 12일~11월 14일 동아시아 정상회의 … NA #> 8 중화인민공화국 베이징시, 충칭시 12월 13일~12월 16일 국빈 방문.[16] NA #> 9 베트남 하노이 3월 22일~3월 24일 국빈 방문.[17] NA #> 10 아랍에미리트 아부다비, 두바이 3월 24일~3월 27일 공식 방문.[18] NA #> # ℹ 48 more rowsmoon_tbl<-moon_h3|>enframe()|>mutate(연도 =str_remove(value, "년\\[편집\\]"))|>filter(str_detect(연도, "\\d{4}"))|>mutate(data =moon_raw[c(1:5)])|>unnest(data)|>select(연도, 나라, 장소, 일자, 세부내용=`세부 내용`)|>separate(일자, into =c("출국", "도착"), sep ="~")|>mutate(도착 =ifelse(is.na(도착), 출국, 도착))|>mutate(출국일 =str_glue("{연도}-{출국}"), 도착일 =str_glue("{연도}-{도착}"))|>mutate(출국일 =parse_date(출국일, "%Y-%m월 %d일"), 도착일 =parse_date(도착일, "%Y-%m월 %d일"))|>select(출국일, 도착일, 국가 =나라, 장소)|>mutate(기간 =(출국일%--%도착일)/ddays(1)+1)
1.2 윤석열
코드
tour_yoon_html<-rvest::read_html(URLencode("https://namu.wiki/w/윤석열 정부/외교"))tour_yoon_raw<-tour_yoon_html|>html_elements("table")|>html_table()tour_yoon_dat<-bind_rows(tour_yoon_raw[[10]]|>janitor::row_to_names(row_number =1)|>mutate(연도 =2022),tour_yoon_raw[[11]]|>janitor::row_to_names(row_number =1)|>mutate(연도 =2023))tour_yoon_tbl<-tour_yoon_dat|>separate(일자, into =c("출국일", "귀국일"), sep ="~")|>mutate(귀국일 =ifelse(is.na(귀국일), "15일", 귀국일))|># 우크라이나separate(출국일, into =c("출국월", "출국일"), sep ="월 ?")|>mutate(귀국월 =출국월, 귀국일 =parse_number(귀국일))|>mutate(출국날짜 =ymd(paste(연도, 출국월, 출국일, sep ="-")), 귀국날짜 =ymd(paste(연도, 귀국월, 귀국일, sep ="-")))|>mutate(상대국 =str_remove(상대국, "\\s?행정구"))|>select(출국날짜, 귀국날짜, 상대국, 상대방, 비고)tour_yoon_tbl#> # A tibble: 21 × 5#> 출국날짜 귀국날짜 상대국 상대방 비고 #> <date> <date> <chr> <chr> <chr> #> 1 2022-06-27 2022-06-30 스페인 북대서양 조약 기구 "첫 국외…#> 2 2022-09-18 2022-09-19 영국 - "엘리자… #> 3 2022-09-20 2022-09-22 미국 국제연합 "첫 UN … #> 4 2022-09-22 2022-09-23 캐나다 쥐스탱 트뤼도 총리 "첫 정상…#> 5 2022-11-11 2022-11-14 캄보디아 아세안 "" #> 6 2022-11-14 2022-11-15 인도네시아 G20 "" #> 7 2023-01-14 2023-01-17 아랍에미리트 무함마드 빈 자이드 알나얀 대통령 "국빈방… #> 8 2023-01-17 2023-01-20 스위스 - "세계경… #> 9 2023-03-16 2023-03-17 일본 기시다 후미오 총리 "2023년 …#> 10 2023-04-24 2023-04-30 미국 조 바이든 대통령 "2023년 …#> # ℹ 11 more rows
world_map<-rnaturalearth::ne_countries(scale =50, returnclass ="sf")%>%st_make_valid()|>filter(continent!="Antarctica")# define a long & slim polygon that overlaps the meridian line & set its CRS to match# that of world Centered in lon 133offset<-180-150polygon<-st_polygon(x =list(rbind(c(-0.0001-offset, 90),c(0-offset, 90),c(0-offset, -90),c(-0.0001-offset, -90),c(-0.0001-offset, 90))))%>%st_sfc()%>%st_set_crs(4326)world_pacific<-world_map|>st_difference(polygon)|>st_transform(crs ="+proj=eqc +x_0=0 +y_0=0 +lat_0=0 +lon_0=150")ggplot(data =world_pacific, aes(group =admin))+geom_sf(fill ="grey")+theme_void()
코드
moon_pacific_map<-left_join(world_pacific, moon_tour, by =c("iso_a2"="iso2c"))pacific_centroid<-inner_join(st_centroid(moon_pacific_map), moon_tour, by =c("iso_a2"="iso2c"))pacific_country_centroid<-bind_cols(pacific_centroid,st_coordinates(pacific_centroid)|>as_tibble()|>set_names(c("lon", "lat")))moon_pacific_map|>mutate(방문수 =factor(방문수, levels =c(1, 2, 8), labels =c("1회", "2회", "8회")))|>ggplot()+geom_sf(aes(fill =방문수))+scale_fill_manual(values =c("gray50", "skyblue", "blue"), na.value ="transparent", breaks =c("1회", "2회", "8회", NA), labels =c("1회", "2회", "8회", "방문 없음"))+# labs(title = "문재인 대통령 해외순방") +theme_void(base_family ="NanumGothic")+theme(legend.position ="bottom")+ggrepel::geom_text_repel( data =pacific_country_centroid|>select(국가.x, lon, lat)|>st_drop_geometry(),aes(label =국가.x, x =lon, y =lat), size =3, segment.size =0.2)
yoon_tour<-tour_yoon_tbl|>group_by(상대국)|>summarise(방문수 =n(), 연도 =str_c(str_glue("{lubridate::year(출국날짜)}"), collapse =","))|>left_join(distinct(yoon_country_data))world_map<-rnaturalearth::ne_countries(scale =50, returnclass ="sf")country_centroid<-inner_join(st_centroid(world_map), yoon_tour, by =c("iso_a2"="ISO2"))country_centroid<-bind_cols(country_centroid,st_coordinates(country_centroid)|>as_tibble()|>set_names(c("lon", "lat")))yoon_map<-left_join(world_map, yoon_tour, by =c("iso_a2"="ISO2"))yoon_map|>filter(continent!="Antarctica")|>mutate(방문수 =factor(방문수, levels =c(1, 2, 3), labels =c("1회", "2회", "3회")))|>ggplot()+geom_sf(aes(fill =방문수))+scale_fill_manual(values =c("gray50", "pink", "red"), na.value ="transparent", breaks =c("1회", "2회", "3회", NA), labels =c("1회", "2회", "3회", "방문 없음"))+labs( title ="윤석열 대통령 해외순방")+theme_void(base_family ="NanumGothic")+theme(legend.position ="bottom")+ggrepel::geom_text_repel( data =country_centroid|>select(상대국, lon, lat)|>st_drop_geometry(),aes(label =상대국, x =lon, y =lat), size =3, segment.size =0.2)
3.3 태평양 중심지도
코드
yoon_pacific_map<-left_join(world_pacific, yoon_tour, by =c("iso_a2"="ISO2"))yoon_pacific_centroid<-inner_join(st_centroid(yoon_pacific_map), yoon_tour, by =c("iso_a2"="ISO2"))yoon_pacific_country_centroid<-bind_cols(yoon_pacific_centroid,st_coordinates(yoon_pacific_centroid)|>as_tibble()|>set_names(c("lon", "lat")))yoon_pacific_map|>mutate(방문수 =factor(방문수, levels =c(1, 2, 3), labels =c("1회", "2회", "3회")))|>ggplot()+geom_sf(aes(fill =방문수))+scale_fill_manual(values =c("gray50", "pink", "red"), na.value ="transparent", breaks =c("1회", "2회", "3회", NA), labels =c("1회", "2회", "3회", "방문 없음"))+# labs(title = "윤석열 대통령 해외순방") +theme_void(base_family ="NanumGothic")+theme(legend.position ="bottom")+ggrepel::geom_text_repel( data =yoon_pacific_country_centroid|>select(상대국.x, lon, lat)|>st_drop_geometry(),aes(label =상대국.x, x =lon, y =lat), size =3, segment.size =0.2)
4 문재인 1년6개월
4.1 표
코드
moon_early_tbl<-moon_tbl|>filter(출국일<=as.Date("2018-11-10"))# 2017년 5월 10일 이후로 1년 6개월moon_early_tbl|>group_by(국가)|>summarise(방문수 =n(), 연도 =str_c(str_glue("{lubridate::year(출국일)}"), collapse =","))|>left_join(country_codes, by ="국가")|>mutate(대륙 =countrycode(iso2c, "iso2c", "continent"))|>arrange(desc(방문수))|>select(-영문_국가명)|>select(iso2c, everything())|>gt(groupname_col ="대륙")|>fmt_flag(columns =iso2c)|>cols_label( iso2c ="")|>cols_align("center")|>tab_header( title =md("문재인 대통령 임기초반 해외 순방"), subtitle =md("2017년 5월 10일 ~ 2018년 11월 10일"))|>tab_footnote( footnote =md("데이터 출처: [위키백과](https://ko.wikipedia.org/wiki/문재인의_대통령_순방_목록)"))|>gt_theme_538()|>## 표 전체 합계 -------------------------------------grand_summary_rows( columns =방문수, fns =list(label ="", fn ="sum"), fmt =~fmt_integer(.), side ="bottom")