대한민국 인구구조 변화를 보여주는 다른 그림: `ggridges`(`ggplot2` 확장)
ggplot2
확장 : ggridges
ggridges
패키지는 공식사이트에서 설명하고 있듯이 부분적으로 겹쳐지는 선그림을 통해 시간 또는 공간에 따라 변하는 분포를 시각화하는데 유용하다.
예를 들어 위의 그림은 월별 기온의 분포를 시각화하고 있다.
설치
install.packages('ggridges')
불러들이기
library(ggplot2)
library(ggridges)
geom_ridgeline
geom_ridgline
의 주요 시각적 특질은 x
, y
, height
, group
, fill
등이 있다.
시각적 특질 | 의미 |
---|---|
x |
\(x\)-좌표 |
y |
\(y\)-좌표 : 주로 시간의 변화 또는 공간의 변화와 대응된다 |
height |
능선이 그려지는 높이 |
group |
한 능선에 해당하는 집단 |
fill |
한 능선의 아랫 부분 채움 색깔 |
활용 예: 우리나라 인구구조의 변화
또다른 ggplot2
확장인 gganimate
에서 사용했던 데이터를 ggridges
를 사용해서 시각화보았다.
library(dplyr)
library(tidyr)
datPop <- data.table::fread('population.csv', encoding='UTF-8')
datPopAni <-
datPop %>%
mutate(year=as.integer(year)) %>%
gather(key='gender', value='population', male, female)
첫 번째 그림
ggplot(data=datPopAni,
aes(x=age2,
y=year,
height=population,
fill=gender,
group=paste0(year, gender))) +
geom_ridgeline()
뭔가 너무 복잡하다!
두 번째 그림
그림을 좀 더 보기 싶게 만들기 위해서 데이터를 적절하게 가공할 필요가 있다.
먼저 너무 많은 연도가 있고, \(y\)-축 year
를 보니 스케일이 적절하지 않아 보인다. 그리고 능선으로 그려지는 능선도 지나치게 복잡해 보인다.
먼저 나이를 10살 단위로 끊어서 10대, 20대, 30대 등으로 단순화했으며,
datRidge <-
datPopAni %>% mutate(ageGroup = (age2 %/% 10)*10) %>% group_by(ageGroup, gender, year) %>%
summarise(population = sum(population))
연도도 10년 단위로 끊어서 1960, 1970, 1980, 1990, 2000, 2010, 2020년만 시각화하기로 했다.
datRidge2 <- datRidge %>% filter(year %% 10 ==0)
그리고 인구수도 year
와 비슷한 스케일이 되도록 200000으로 나눴다. 그 결과는 다음과 같다.
ggplot(data=datRidge2,
aes(x=ageGroup,
y=year,
height=population/200000,
fill=gender,
group=paste0(year, gender))) +
geom_ridgeline()
세 번째 그림
많이 나아졌지만 앞쪽 능선때문에 뒤쪽 능선이 완전히 가려진다는 문제가 있다. alpha
를 통해 능선을 약간 투명하게 조정하고, 좀 더 굵은 선을 사용한다. 그리고 year
를 올림순과 내림순으로 모두 시각화보았다.
p1 <- ggplot(data=datRidge2,
aes(x=ageGroup+5,
y=year,
height=population/200000,
fill=gender,
group=paste0(year, gender))) +
geom_ridgeline(alpha=0.4, size=2) +
scale_x_continuous(breaks=seq(0,100,10), name='age Group') +
scale_y_reverse(breaks=seq(1960, 2020, 10)) +
guides(fill='none')
print(p1)
p2 <- ggplot(data=datRidge2,
aes(x=ageGroup+5,
y=year,
height=population/200000,
fill=gender,
group=paste0(year, gender))) +
geom_ridgeline(alpha=0.4, size=2) +
scale_x_continuous(breaks=seq(0,100,10), name='ageGroup') +
scale_y_continuous(breaks=seq(1960, 2020, 10), name='') +
guides(fill='none')
print(p2)
두 그림을 한 그림으로
gridExtra::grid.arrange(p1,p2,ncol=2)
만약 화일로 저장하고 싶다면 다음과 같이 한다.
g <- gridExtra::arrangeGrob(p1, p2, ncol=2)
ggsave(file='popCompare.png', g) #https://stackoverflow.com/questions/17059099/saving-grid-arrange-plot-to-file
## Saving 7 x 7 in image
Leave a comment