coronavirus 데이터 팩키지에서 코로나19로 인한 국가별 사망자 데이터를 정제하여 상위 10국을 현재 2020-06-04 기준 준비한다.
library(tidyverse)
library(coronavirus)
covid_death <- coronavirus %>%
filter(type == "death") %>%
group_by(country) %>%
summarise(cases = sum(cases)) %>%
ungroup() %>%
top_n(10, wt=cases) %>%
arrange(desc(cases))
covid_death# A tibble: 10 x 2
country cases
<chr> <int>
1 US 82356
2 United Kingdom 32769
3 Italy 30911
4 France 26994
5 Spain 26920
6 Brazil 12461
7 Belgium 8761
8 Germany 7738
9 Iran 6733
10 Netherlands 5529
이모지(絵文字 / emoji)는 일본의 휴대전화 문자 메시지에서 시작되어 지금은 대부분의 스마트폰에 사용되는 그림 문자로 역사를 되돌리는 현대판 이집트 상형문자로 이해되기도 한다. tidyverse R진영에서 이를 구현한 것이 emo 팩키지로 R마크다운 문서에서 쉽게 이모지를 구현할 수 있다.
emojifont 팩키지가 있다고 하지만, “Apple Color Emoji”을 사용하지 않고 있다고 한다. 무엇보다 해들리 위컴이 emo 팩키지를 직접 만들었다는 점에서 의미가 크다.
emo, ggtext 팩키지를 장착한 ggplot에 이미지를 구현하는 장단점은 다음과 같다.
ggtext가 아직 개발중에 있음.size를 담긴 변수를 ggplot으로 활용할 수 없음.# 빠른 국가명 추출
emoji_names <- names(emo::ji_name) %>% str_to_lower()
covid_death_country <- covid_death %>%
pull(country) %>%
str_to_lower()
# for(i in seq_along(covid_death_country)) {
# cat(emoji_names[str_detect(emoji_names, covid_death_country[i])], "\n")
# }
# emoji_names[str_detect(emoji_names, "us")]
corona_top_country <- c("us","uk","italy","france","spain","brazil","belgium","germany","iran","netherlands")
covid_death_df <- covid_death %>%
mutate(country_emoji = corona_top_country) %>%
mutate(emoji = map_chr(country_emoji, emo::ji))
covid_death_df# A tibble: 10 x 4
country cases country_emoji emoji
<chr> <int> <chr> <chr>
1 US 82356 us 🇺🇸
2 United Kingdom 32769 uk 🇬🇧
3 Italy 30911 italy 🇮🇹
4 France 26994 france 🇫🇷
5 Spain 26920 spain 🇪🇸
6 Brazil 12461 brazil 🇧🇷
7 Belgium 8761 belgium 🇧🇪
8 Germany 7738 germany 🇩🇪
9 Iran 6733 iran 🇮🇷
10 Netherlands 5529 netherlands 🇳🇱
ggplot으로 국기를 출력하기 위해서는 웹스크래핑을 통해 https://emojipedia.org/emoji/ 웹사이트에서 이미지 링크를 가져온다.
library(rvest)
emoji_to_link <- function(x) {
paste0("https://emojipedia.org/emoji/",x) %>%
read_html() %>%
html_nodes("tr td a") %>%
.[1] %>%
html_attr("href") %>%
paste0("https://emojipedia.org/", .) %>%
read_html() %>%
html_node('div[class="vendor-image"] img') %>%
html_attr("src")
}
link_to_img <- function(x, size = 25) {
paste0("<img src='", x, "' width='", size, "'/>")
}
covid_death_df <- covid_death_df %>%
mutate(url = map_chr(emoji, slowly(~emoji_to_link(.x), rate_delay(0.5))),
label = link_to_img(url))
covid_death_df# A tibble: 10 x 6
country cases country_emoji emoji url label
<chr> <int> <chr> <chr> <chr> <chr>
1 US 82356 us 🇺🇸 https://emojipedia-… <img src='https://e…
2 United K… 32769 uk 🇬🇧 https://emojipedia-… <img src='https://e…
3 Italy 30911 italy 🇮🇹 https://emojipedia-… <img src='https://e…
4 France 26994 france 🇫🇷 https://emojipedia-… <img src='https://e…
5 Spain 26920 spain 🇪🇸 https://emojipedia-… <img src='https://e…
6 Brazil 12461 brazil 🇧🇷 https://emojipedia-… <img src='https://e…
7 Belgium 8761 belgium 🇧🇪 https://emojipedia-… <img src='https://e…
8 Germany 7738 germany 🇩🇪 https://emojipedia-… <img src='https://e…
9 Iran 6733 iran 🇮🇷 https://emojipedia-… <img src='https://e…
10 Netherla… 5529 netherlands 🇳🇱 https://emojipedia-… <img src='https://e…
앞서 준비한 각 국가를 표상하는 국기에 해당되는 이모지의 .png파일에 대한 웹 주소를 참조하고 이를 ggtext 팩키지 geom_richtext()함수로 시각화한다. 중국이 상위 10개국에 들지 않는 것이 눈에 띄네요!!!
library(ggtext)
covid_death_df %>%
mutate(country = fct_reorder(country, cases)) %>%
ggplot(aes(x=country, y=cases, label = label)) +
geom_col(width=0.1, color="gray") +
geom_point() +
coord_flip() +
labs(x="", y="") +
theme_bw() +
geom_richtext(aes(y = cases), fill = NA, label.color = NA,
label.padding = grid::unit(rep(0, 4), "pt") ) +
scale_y_continuous(labels = scales::comma)