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)