R$ LEGO 시리즈별 색상 시각화
by Youngjun Na
저는 한국나이로 5살 3살 두 아이를 키우고 있는 아빠입니다. 몇일 전 아들과 함께 LEGO를 만들고 있는데 문득 LEGO에서 사용한 색들을 시각화 하고 싶다는 강한 마음이(덕력이) 생겼습니다. 다행히(?) Kaggle에 올라와 있는 LEGO Database에 RGB color code를 포함한 1950-2017 까지 각종 LEGO 관련 데이터가 제공되어 있었고, 이를 사용해 각 시리즈별로 사용된 색상에 대한 와플차트를 만들었습니다.
1. 데이터 정리
먼저 제공되는 데이터를 가져와 각 시리즈별로 데이터를 merge 하였습니다. 데이터의 구조는 다음과 같습니다.
library(tidyverse)
inventories <- read_csv("inventories.csv")
sets <- read_csv("sets.csv")
themes <- read_csv("themes.csv")
inventory_parts <- read_csv("inventory_parts.csv")
colors <- read_csv("colors.csv")
full <- inventory_parts %>%
left_join(inventories, by = c("inventory_id" = "id")) %>%
left_join(sets, themes, by = c("set_num" = "set_num")) %>%
left_join(themes, by = c("theme_id" = "id")) %>%
left_join(colors, by = c("color_id" = "id"))
inventory_parts 데이터셋에 각 파츠의 quantity가 제공되기 때문에 이것을 기준점으로 left_join()
함수를 사용해 LEGO 시리즈의 정보와 파츠의 color 데이터를 merge하였습니다. dplyr
의 left_join()
함수는 왼쪽편에 있는 관측값을 보존합니다. 그리고 분석에 사용할 데이터만 select()
하였습니다.
lego <- full %>%
select(name.y, year, part_num, rgb, quantity)
head(lego, 10)
## # A tibble: 10 x 5
## name.y year part_num rgb quantity
## <chr> <dbl> <chr> <chr> <dbl>
## 1 Gravity Games 2004 48379c01 6C6E68 1
## 2 Gravity Games 2004 48395 9BA19D 1
## 3 Gravity Games 2004 mcsport6 FE8A18 1
## 4 Gravity Games 2004 paddle 05131D 1
## 5 Friends 2012 11816pr0005 F6D7B3 1
## 6 Friends 2012 2343 FCFCFC 1
## 7 Friends 2012 3003 E4ADC8 1
## 8 Friends 2012 30176 237841 1
## 9 Friends 2012 3020 FFFFFF 1
## 10 Friends 2012 3022 FFFFFF 2
저는 rgb column을 보면서 왼쪽에 #을 넣어주고 싶은 욕구를 주체할 수 없었습니다. 결국 mutate()
와 paste0()
함수를 사용해 데이터를 조금 손봐줬습니다.
lego <- lego %>%
mutate(rgb = paste0("#", rgb))
head(lego, 10)
## # A tibble: 10 x 5
## name.y year part_num rgb quantity
## <chr> <dbl> <chr> <chr> <dbl>
## 1 Gravity Games 2004 48379c01 #6C6E68 1
## 2 Gravity Games 2004 48395 #9BA19D 1
## 3 Gravity Games 2004 mcsport6 #FE8A18 1
## 4 Gravity Games 2004 paddle #05131D 1
## 5 Friends 2012 11816pr0005 #F6D7B3 1
## 6 Friends 2012 2343 #FCFCFC 1
## 7 Friends 2012 3003 #E4ADC8 1
## 8 Friends 2012 30176 #237841 1
## 9 Friends 2012 3020 #FFFFFF 1
## 10 Friends 2012 3022 #FFFFFF 2
2. 시리즈별로 사용한 color counting
먼저 시리즈이름(name.y)과 색(rgb)으로 그룹을 만들고 summarise()
를 사용해 각 시리즈별로 사용한 색을 counting 해줍니다. 시리즈가 매우 많기 때문에 대충 제가 좋아하는 시리즈 몇개를 골랐습니다.
lego_series <- lego %>%
group_by(name.y, rgb) %>%
summarise(n = sum(quantity)) %>%
filter(name.y %in% c("Star Wars", "Minecraft", "Town", "City", "Police", "Train", "Basic", "Iron Man", "Christmas", "Disney Princess", "9V", "Spider-Man 2", "Avatar"))
head(lego_series, 10)
## # A tibble: 10 x 3
## # Groups: name.y [1]
## name.y rgb n
## <chr> <chr> <dbl>
## 1 9V #0020A0 25
## 2 9V #0055BF 719
## 3 9V #05131D 4136
## 4 9V #0A3463 5
## 5 9V #184632 95
## 6 9V #237841 211
## 7 9V #4B9F4A 2
## 8 9V #4C61DB 1
## 9 9V #582A12 23
## 10 9V #583927 83
3. waffle
chart 만들기
CRAN에 올라와 있는 waffle
패키지는 0.7.0으로 ggplot2
와 함께 사용할 수 있는 geom_waffle()
함수를 지원하지 않습니다. 따라서 저는 Github을 통해 developer version의 패키지를 사용하였습니다. devtools::install_github("hrbrmstr/waffle")
을 통해 설치할 수 있습니다.
library(hrbrthemes) # for the themes
library(waffle)
packageVersion("waffle")
## [1] '1.0.1'
rgb에 알맞는 색을 지정해야 하기 때문에 다음과 같이 palette를 만들어 줍니다. 아까 #을 붙여놓은게 도움이 됩니다.
pal <- unique(lego_series$rgb)
names(pal) <- unique(pal)
와플차트는 숫자만큼 와플이 생성되므로 scale을 조금 손봐줍니다.
lego_series <- lego_series %>%
mutate(n = ceiling(n/100))
geom_waffle()
함수를 응용해 와플차트를 만들어 줍니다. color는 white가 디폴트 값인데 레고 블록 색깔 중 흰색계열도 차트에 들어가야 하므로 대충(?) 색을 지정해 줍니다. 그리고 facet_wrap()
함수로 각 시리즈별로 분리해 시각화 해줍니다.
lego_series %>%
ggplot(aes(fill = rgb, values = n)) +
geom_waffle(n_rows = 10, size = 0.33, color = "#f7e8f0", flip = TRUE) +
facet_wrap(. ~ name.y, ncol = 5) +
scale_fill_manual(values = pal) +
coord_equal() +
theme_ipsum(grid = "") +
theme_enhance_waffle() +
theme(legend.position = "none") +
labs(
title = "Colors of LEGO Series",
caption = "Data from https://www.kaggle.com/rtatman/lego-database"
)
완성되었습니다. 예쁜 그래프를 보면 마음이 평안해집니다.
Subscribe via RSS