13.6 누적 영역 그래프
시간의 흐름에 따른 그룹/집단 별 관측값 혹은 비율의 변화를 누적해서 볼 수 있는 그래프가 누적 영역 그래프 (Stacked Area Plot) 입니다. 엑셀에서 많이 볼 수 있는 그래프입니다.
영역 그래프는 정량적 데이터를 보여주는 그림입니다. R은 ggplot2
패키지를 사용하여 영역 차트를 표시하는 표준 함수로 geom_area()
함수를 제공하고 있으며, 데이터 점 위에 선을 그리는 geom_line()
함수를 제공합니다.
영역 그림은 정량적 데이터의 분포를 나타내는 선 그래프의 한 종류입니다. 이 차트에는 데이터 점이 표시되고, 여러 기간에 걸친 데이터 점 또는 값의 양을 표시하기 위해 이 데이터 점들을 선으로 결합합니다.
이 절에서는 ggplot2
라이브러리를 사용하여 영역 차트를 만듭니다. geom_area()
함수를 사용하는 것을 알고 있다면 R에서 아름다운 영역 차트를 만드는 데 몇 단계밖에 걸리지 않습니다.
13.6.1 패키지 불러오기와 데이터 생성
13.6.1.1 패키지 불러오기
#imports the ggplot2 library
library(tidyverse)
13.6.1.2 데이터 출처
이 절에서 사용할 데이터는 2007년부터 2014년까지의 한국 수/출입 무역량 (단위: 1 B$) 데이터를 가지고 수출과 수입으로 구분하여서 ggplot2
의 geom_area()
함수를 사용하여 누적 영역 그래프(Stacked Area Plot) 를 그려보도록 하겠습니다.
아래는 2007년부터 2014년까지의 한국 수/출입 무역량 (단위: 1 B$) 데이터를 링크해두었습니다.
(☞ 한국 수/출입 무역량 데이터 다운로드 trade_stat_07_14.csv)
* 출처 : 국가무역통계 KOSIS, http://kosis.kr/statisticsList/statisticsList_01List.jsp?vwcd=MT_ZTITLE&parmTabId=M_01_01#SubCont)
13.6.1.3 데이터 세트 생성하기
누적 영역 그래프로 시각화할 데이터를 불러와 다음과 같이 데이터 전처리를 하여 trade 라는 데이터 세트를 생성해 줍니다.
- csv 데이터 파일을 불러옵니다.
Time
컬럼에서 앞의 4자리만 취해서Year
변수를 생성합니다.Year
단위로 수출입 금액을 합계를 해 줍니다. 수출 합계액은Export
, 수입 합계약은Import
로 변수 이름을 지정해 줍니다.Year
단위로 수출입 금액의 합계 비율(Export.ratio, Import.ratio)을 구합니다.- 수출입 금액의 단위가 1,000\(로 되어 있는데 이를 1 B\)로 바꾸기 위해 1,000,000으로 나누어 줍니다.
- 그리고 마지막으로 Wide 형태의 데이터 프레임을
Year
,Category
,Amount
등의 세 개의 컬럼으로 구성되는 Long 형태로 변환해 줍니다. - 마지막으로 문자형인 Year 컬럼을 정수형으로 변환해 줍니다.
# CSV 파일 불러오기
<- read.csv("data/trade_stat_07_14.csv", header = TRUE)
trade_stat
# Time 컬럼에서 앞의 4자리 연도만 추출하여 Year 컬럼 생성
<- transform(trade_stat, Year = substr(Time, 1, 4))
trade_stat
# Year 단위로 수출입 금액의 합계(Export, Import)를 구합니다.
<- trade_stat %>%
trade_stat_year group_by(Year) %>%
summarise(Export.amount = round(sum(export_amt) / 1000000, 0),
Import.amount = round(sum(import_amt) / 1000000, 0))
trade_stat_year
## # A tibble: 8 x 3
## Year Export.amount Import.amount
## <chr> <dbl> <dbl>
## 1 2007 371 357
## 2 2008 422 435
## 3 2009 364 323
## 4 2010 466 425
## 5 2011 555 524
## 6 2012 548 520
## 7 2013 560 516
## 8 2014 573 526
# Year 단위로 수출입금액 합계(Export, Import)의 비율을 구합니다.
$Export.ratio <- round((trade_stat_year$Export.amount / (trade_stat_year$Export.amount + trade_stat_year$Import.amount))*100, 1)
trade_stat_year$Import.ratio <- round((trade_stat_year$Import.amount / (trade_stat_year$Export.amount + trade_stat_year$Import.amount))*100, 1)
trade_stat_year
trade_stat_year
## # A tibble: 8 x 5
## Year Export.amount Import.amount Export.ratio Import.ratio
## <chr> <dbl> <dbl> <dbl> <dbl>
## 1 2007 371 357 51 49
## 2 2008 422 435 49.2 50.8
## 3 2009 364 323 53 47
## 4 2010 466 425 52.3 47.7
## 5 2011 555 524 51.4 48.6
## 6 2012 548 520 51.3 48.7
## 7 2013 560 516 52 48
## 8 2014 573 526 52.1 47.9
<-pivot_longer(trade_stat_year,
longercols = -1,
names_pattern = "(......).(.....)",
names_to = c("Type", "Category")) %>%
mutate(Category = ifelse(Category == "ratio", "Ratio", "Amount"))
longer
## # A tibble: 32 x 4
## Year Type Category value
## <chr> <chr> <chr> <dbl>
## 1 2007 Export Amount 371
## 2 2007 Import Amount 357
## 3 2007 Export Ratio 51
## 4 2007 Import Ratio 49
## 5 2008 Export Amount 422
## 6 2008 Import Amount 435
## 7 2008 Export Ratio 49.2
## 8 2008 Import Ratio 50.8
## 9 2009 Export Amount 364
## 10 2009 Import Amount 323
## # ... with 22 more rows
<-pivot_wider(longer,
trade id_cols = c(Year, Type),
names_from = Category,
values_from = value,
names_repair = "check_unique")
trade
## # A tibble: 16 x 4
## Year Type Amount Ratio
## <chr> <chr> <dbl> <dbl>
## 1 2007 Export 371 51
## 2 2007 Import 357 49
## 3 2008 Export 422 49.2
## 4 2008 Import 435 50.8
## 5 2009 Export 364 53
## 6 2009 Import 323 47
## 7 2010 Export 466 52.3
## 8 2010 Import 425 47.7
## 9 2011 Export 555 51.4
## 10 2011 Import 524 48.6
## 11 2012 Export 548 51.3
## 12 2012 Import 520 48.7
## 13 2013 Export 560 52
## 14 2013 Import 516 48
## 15 2014 Export 573 52.1
## 16 2014 Import 526 47.9
# 마지막으로 Year 컬럼을 정수형으로 변환해 줍니다.
$Year <- as.integer(trade$Year)
trade trade
## # A tibble: 16 x 4
## Year Type Amount Ratio
## <int> <chr> <dbl> <dbl>
## 1 2007 Export 371 51
## 2 2007 Import 357 49
## 3 2008 Export 422 49.2
## 4 2008 Import 435 50.8
## 5 2009 Export 364 53
## 6 2009 Import 323 47
## 7 2010 Export 466 52.3
## 8 2010 Import 425 47.7
## 9 2011 Export 555 51.4
## 10 2011 Import 524 48.6
## 11 2012 Export 548 51.3
## 12 2012 Import 520 48.7
## 13 2013 Export 560 52
## 14 2013 Import 516 48
## 15 2014 Export 573 52.1
## 16 2014 Import 526 47.9
13.6.2 기본 단순 영역 그래프 그리기
누적 영역 그래프를 그리기에 앞서 단순 영역 그래프를 그려 보겠습니다.
단순 영역 그래프를 그리기 위해 연도별 수입(Import
) 금액만을 선택해서 trade1 데이터 세트를 생성하겠습니다.
<- trade[trade$Type=="Import", ]
trade1 trade1
## # A tibble: 8 x 4
## Year Type Amount Ratio
## <int> <chr> <dbl> <dbl>
## 1 2007 Import 357 49
## 2 2008 Import 435 50.8
## 3 2009 Import 323 47
## 4 2010 Import 425 47.7
## 5 2011 Import 524 48.6
## 6 2012 Import 520 48.7
## 7 2013 Import 516 48
## 8 2014 Import 526 47.9
이제 trade1
데이터 세트를 기반으로 년도별 수입액(Import
)의 단순 영역 차트는 geom_area()
함수를 이용하여 다음과 같이 작성할 수 있습니다.
#plots the area chart
ggplot(trade1, aes(x = Year,
y = Amount)) +
geom_area(fill='#142F86', alpha = 0.8) +
ggtitle("기본 단순 영역 그래프 그리기")
13.6.3 기본 누적 영역 그래프 그리기
앞에서 년도별로 한 항목에 해당하는 수입 합계액(Import
)을 단순 영역 그래프로 표시해 보았습니다. 이번 절에서는 수입 합계액(Import
)과 수출 합계액(Export
)을 년도별로 누적 영역 그래프에 시각화 해 보겠습니다.
ggplot()
함수 내에 있는 aes()
함수 내의 fill =
모수에 수출과 수입을 구분해 주는 Category
를 기입해 주면 년도별 수출 합계액과 수입 합계액이 누적 영영 그래프에 표시되게 됩니다.
# 기본 누적 영역 그래프
ggplot(trade,
aes(x = Year,
y = Amount,
fill = Type)) +
geom_area() +
ggtitle("기본 누적 영역 그래프 그리기")
13.6.4 비율 기준의 누적 영역 그래프
이번에는 비율 기준으로 해서 누적 영역 그래프를 그려보겠습니다. 이를 위해서 trade
데이터 세트를 생성할 때 년도별 수출액 비율(Export.ratio
)과 수입액 비율(Import.ration
)을 계산한 바 있습니다.
ggplot(trade,
aes(x = Year,
y = Ratio,
fill = Type)) +
geom_area() +
ggtitle("비율 기준의 누적 영역 그래프")
13.6.5 테마 사용
위의 절에서 단순 영역 차트를 누적 영역 차트로 향상시켜 보았습니다.이번에는 글꼴, 색상 그리고 스타일 등을 누적 영역 차트에 추가해 보겠습니다. 이번에는 viridis
패키지를 사용하겠습니다.
viridis
패키지는 그래프에 색상과 다른 스타일을 추가하는 데 도움이 되는 시각화 라이브러리입니다. Viridis
패키지를 설치하려면 R Studio의 Console 창에서 아래의 코드를 실행하십시오.
그리고 hrbrthemes
라이브러리도 활용하겠습니다. hrbrthemes
패키지는 다양한 그래프 테마를 제공하는 패키지입니다.
install.packages(c('virdis', 'hrbrthemes'))
13.6.5.1 패키지 불러오기
viridis
패키지와 hrbrthemes
패키지를 불러옵니다.
#impots the required libraries
library(viridis)
## Loading required package: viridisLite
library(hrbrthemes)
## Warning: package 'hrbrthemes' was built under R version 4.0.5
## NOTE: Either Arial Narrow or Roboto Condensed fonts are required to use these themes.
## Please use hrbrthemes::import_roboto_condensed() to install Roboto Condensed and
## if Arial Narrow is not on your system, please see https://bit.ly/arialnarrow
여기서는 theme_ipsum()
테마를 사용하여 그래프의 제목, 축 제목, 영역의 색상, 그리고 차트 내의 그리드 표현 등을 다양하게 설정해 보겠습니다.
hrbrthemes
패키지에 대한 자세한 사항은 ? hrbrthemes
으로 확인하기 바랍니다.
# 제목, 색 그리고 스타일 지정하기
ggplot(trade,
aes(x = Year,
y = Amount,
fill = Type)) +
geom_area(size = 0.5, alpha = 0.8, color = 'yellow') +
scale_fill_viridis(discrete = TRUE) +
theme_ipsum() +
ggtitle("viridis 패키지를 이용한 사용자 설정")