1 코로나19 사망자수 💀

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

2 이미지 데이터 🖼 1

이모지(絵文字 / emoji)는 일본의 휴대전화 문자 메시지에서 시작되어 지금은 대부분의 스마트폰에 사용되는 그림 문자로 역사를 되돌리는 현대판 이집트 상형문자로 이해되기도 한다. tidyverse R진영에서 이를 구현한 것이 emo 팩키지로 R마크다운 문서에서 쉽게 이모지를 구현할 수 있다.

emojifont 팩키지가 있다고 하지만, “Apple Color Emoji”을 사용하지 않고 있다고 한다. 무엇보다 해들리 위컴이 emo 팩키지를 직접 만들었다는 점에서 의미가 크다.

emo, ggtext 팩키지를 장착한 ggplot에 이미지를 구현하는 장단점은 다음과 같다.

  • 장점
    • 실제로 동작함.
    • SVG를 사용할 필요 없음.
    • 미리보기가 미려하게 출력됨.
  • 단점
    • ggtext가 아직 개발중에 있음.
    • 웹스크래핑을 해야함.
    • 화면에 뿌려줄 때 인터넷 연결이 필요함
    • size를 담긴 변수를 ggplot으로 활용할 수 없음.

2.1 국기 이모지 2

# 빠른 국가명 추출
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…

3 시각화

앞서 준비한 각 국가를 표상하는 국기에 해당되는 이모지의 .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)