쭈쌤
쭈쌤 Hello World

[R 데이터시각화] 선 그래프

크리에이티브 커먼즈 라이선스 ITPAPER(호쌤,쭈쌤)에 의해 작성된 ≪[R 데이터시각화] 선 그래프≫은(는) 크리에이티브 커먼즈 저작자표시-비영리-동일조건변경허락 4.0 국제 라이선스에 따라 이용할 수 있습니다.
이 라이선스의 범위 이외의 이용허락을 얻기 위해서는 leekh4232@gmail.com으로 문의하십시오.

[R 데이터시각화] 선 그래프

선 그래프는 시간에 따라 달라지는 데이터를 표현하는 시각화 자료 입니다. 예를 들면 환율이나 주가지수 등의 경제지표가 시간에 따라 어떻게 변하는지를 표현할 수 있습니다.

이와 같이 시간에 따라 나열된 데이터를 시계열 데이터(Time Series Data) 라고 하는데, 시계열 데이터를 표현하기 때문에 선 그래프를 다른 말로 “시계열 그래프”(Time Series Chart) 라고도 합니다.

#01. 그래프 생성 준비하기

1) 필요한 패키지 로드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 한국 서버를 통해 라이브러리 로드
REPO_URL <- "https://cran.seoul.go.kr/"

# 그래프 패키지
if (!require(ggplot2)) install.packages("ggplot2", repos=REPO_URL)
library(ggplot2)

# 폰트 설정 패키지
if (!require(extrafont)) install.packages("extrafont", repos=REPO_URL)
library(extrafont)

# 데이터 전처리 패키지
if (!require("dplyr"))     install.packages("dplyr", repos=REPO_URL)
library(dplyr)

2) 한글 사용을 위한 폰트 로드

font_import() 함수와 fonttable() 함수를 사용하여 설치된 폰트를 검색하는 과정은 시스템당 최초 1회만 수행하면 된다.

만약 출력 결과물의 한글이 깨져 보인다면 위의 두 과정을 수행한 후 아래의 loadfonts()를 실행

1
2
# mac의 경우 `device="win"` 생략
loadfonts(device="win")
▶ 출력결과
1
2
3
NanumGothic already registered with windowsFonts().
NanumGothicExtraBold already registered with windowsFonts().
NanumGothic Light already registered with windowsFonts().

3) 그래프 기본 크기 및 불필요한 경고 메시지 끄기

1
options(repr.plot.width=20, repr.plot.height=10, warn=-1)

#02. 단일 선 그래프

1) 그래프 생성에 사용할 샘플 데이터 준비

2000~2018년도 신생아 수 집계 데이터 (출처: 국가통계포털)

1
2
3
년도별_신생아_수 <- read.csv("http://itpaper.co.kr/demo/r/baby.csv",
                             stringsAsFactors=F, fileEncoding="euc-kr")
년도별_신생아_수
▶ 출력결과

A data.frame: 19 × 2

년도신생아수
<int><dbl>
2000640089
2001559934
2002496911
2003495036
2004476958
2005438707
2006451759
2007496822
2008465892
2009444849
2010470171
2011471265
2012484550
2013436455
2014435435
2015438420
2016406243
2017357771
2018326822

2) 기본 선 그래프 생성

구문형식

geom_line() 함수에 x,y축 정보와 색상, 종류, 굵기 등을 설정한다.

1
2
3
4
ggploe(data=데이터프레임) + geom_line(aes(x=x축컬럼, y=y축컬럼),
                                      color=색상값,
                                      linetype=1~4,
                                      size=굵기)

linetype 값의 종류

  • 1: 직선
  • 2: 끊긴선
  • 3: 점선
  • 4: 끊긴선 + 점선 교차 표시

기본 그래프 표시하기

1
2
3
4
5
6
# 그래프 표시하기
ggplot(data=년도별_신생아_수) +
    geom_line(aes(x=년도, y=신생아수),
              color="#ff00ff",
              linetype = 1,
              size=1)
▶ 출력결과

png

그래프에 마커 추가하기

geom_point() 함수를 사용한다.

범주를 사용한다면 별도의 옵션 함수를 지정하여 범주를 개별적으로 설정할 수 도 있다.

1
2
3
4
5
6
7
8
ggplot(data=년도별_신생아_수) +
    geom_line(aes(x=년도, y=신생아수),
              color="#ff00ff",
              linetype = 1,
              size=1) +
    geom_point(aes(x=년도, y=신생아수),
               size=5,
               color="red")
▶ 출력결과

png

그래프 옵션 적용하기

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
# 데이터프레임 설정
ggplot(data=년도별_신생아_수) +
    # 선 그래프 x,y축 및 색상, 종류, 굵기 설정
    geom_line(aes(x=년도, y=신생아수), color="#ff00ff", linetype = 1, size=1) +
    # 마커 표시하기
    geom_point(aes(x=년도, y=신생아수), size=5, color="#ff6600") +
    # 배경을 흰색으로 설정
    theme_bw() +
    # 그래프 타이틀 설정
    ggtitle("년도별 신생아 수 변동 현황") +
    # x축 제목 설정
    xlab("년도별 흐름") +
    # y축 제목 설정
    ylab("태어난 신생아 수") +
    # x축 간격 설정 -> seq(x,y):  x~y까지 1씩 증가하는 백터를 생성하여 반환한다.
    scale_x_continuous(breaks=seq(min(년도별_신생아_수$년도),
                                  max(년도별_신생아_수$년도)))  +
    # y축 범위 설정
    scale_y_continuous(limits=c(min(년도별_신생아_수$신생아수),
                                max(년도별_신생아_수$신생아수)),
                       labels = scales::comma)  +
    # 각 텍스트의 색상, 크기, 각도, 글꼴 설정
    theme(plot.title=element_text(family="NanumGothic", color="#0066ff", size=30,
                                  face="bold", hjust=0.98, vjust=-8),
          axis.title.x=element_text(family="NanumGothic", color="#999999", size=20,
                                    face="bold"),
          axis.title.y=element_text(family="NanumGothic", color="#999999", size=20,
                                    face="bold", hjust=1),
          axis.text.x=element_text(family="NanumGothic", color="#000000", size=16,
                                   angle=30),
          axis.text.y  = element_text(family="NanumGothic", color="#000000", size=16,
                                      angle=30))
▶ 출력결과

png

2) 다중 선 그래프

예제를 위한 데이터셋 준비

2005~2018년도 월별 전국 교통사고 현황 데이터 (출처: 국가통계포털)

1
2
3
년도별_교통사고 <- read.csv("http://itpaper.co.kr/demo/r/traffic.csv",
                            stringsAsFactors=F, fileEncoding="euc-kr")
년도별_교통사고
▶ 출력결과

A data.frame: 168 × 5

년도발생건수사망자수부상자수
<int><int><int><int><int>
2005 11549450425413
2005 21324443121635
2005 31658047725550
2005 41781750728131
2005 51908557129808
2005 61809247628594
2005 71867552829984
2005 81903556231603
2005 91875957729831
2005101975763931597
2005111912957430337
2005121850453029750
2006 11497142024533
2006 21427037322903
2006 31676746526013
2006 41794846928725
2006 51914053130279
2006 61743545527032
2006 71863451629978
2006 81879458530882
2006 91929358030186
2006101910065130715
2006111987770131270
2006121751658127713
2007 11491446823975
2007 21469644623717
2007 31816647628811
2007 41805546028555
2007 51926451630532
2007 61831053828662
...............
2016 71895535828586
2016 81839833628017
2016 91788337526761
2016101991844029635
2016111923441628520
2016121886940828192
2017 11697035326099
2017 21483228022323
2017 31704729525046
2017 41771729326530
2017 51850236627268
2017 61804731526454
2017 71815835727362
2017 81868235328162
2017 91989141929371
2017101886342028698
2017111937737928472
2017121824935527044
2018 11702630425438
2018 21620827524630
2018 31702231025015
2018 41799230326643
2018 51863630927834
2018 61808226626574
2018 71869931528104
2018 81833535727749
2018 91837134827751
2018101973837328836
2018111902929828000
2018121801032326463

년도별 교통사고 합계 구하기

년도별로 집계

1
2
3
4
5
6
교통사고_집계 <- 년도별_교통사고 %>%
                   group_by(년도) %>%
                   summarise(발생건수=sum(발생건수, na.rm=TRUE),
                             사망자수=sum(사망자수, na.rm=TRUE),
                             부상자수=sum(부상자수, na.rm=TRUE))
교통사고_집계
▶ 출력결과

A tibble: 14 × 4

년도발생건수사망자수부상자수
<int><int><int><int>
20052141716376342233
20062137456327340229
20072116626166335906
20082158225870338962
20092319905838361875
20102268785505352458
20112217115229341391
20122236565392344565
20132153545092328711
20142235524762337497
20152320354621350400
20162209174292331720
20172163354185322829
20182171483781323037

값의 종류 별로 그래프 그리기

geom_line() 함수를 여러 번 사용하여 다중 선 그래프를 표현한다.

여기서는 전체 그래프 생성 결과를 별도의 변수에 할당하여 출력하고 있다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
# 그래프 생성
graph <- ggplot(data=교통사고_집계) +
          # 선 그래프 x,y축 및 색상, 종류, 굵기 + 마커
          geom_line(aes(x=년도, y=발생건수), color="#ff6600", linetype=1, size=1.5) +
          geom_line(aes(x=년도, y=사망자수), color="#ff00ff", linetype=2, size=1) +
          geom_line(aes(x=년도, y=부상자수), color="#0000ff", linetype=3, size=1) +
          # 마커
          geom_point(aes(x=년도, y=발생건수), size=5, color="#ff6600") +
          geom_point(aes(x=년도, y=사망자수), size=3, color="#ff00ff") +
          geom_point(aes(x=년도, y=부상자수), size=3, color="#0000ff") +
          # 배경을 흰색으로 설정
          theme_bw() +
          # 그래프 타이틀 설정
          ggtitle("년도별 교통사고 추이") +
          # x축 제목 설정
          xlab("년도") +
          # y축 제목 설정
          ylab("교통사고(건) / 사망자,부상자(명)") +
          # x축 간격 설정 -> seq(x,y):  x~y까지 1씩 증가하는 백터를 생성하여 반환한다.
          scale_x_continuous(breaks=seq(min(교통사고_집계$년도),
                                        max(교통사고_집계$년도)))  +
          # y축 간격 및 데이터에 대한 세자리 콤마 적용
          scale_y_continuous(breaks=seq(0, 400000, 50000), labels=scales::comma)  +
          # 각 텍스트의 색상, 크기, 각도, 글꼴 설정
          theme(plot.title=element_text(family="NanumGothic", color="#0066ff",
                                        size=30, face="bold", hjust=0.98, vjust=-8),
                axis.title.x=element_text(family="NanumGothic", color="#999999",
                                          size=20, face="bold"),
                axis.title.y=element_text(family="NanumGothic", color="#999999",
                                          size=20, face="bold", hjust=1),
                axis.text.x=element_text(family="NanumGothic", color="#000000",
                                         size=16, angle=30),
                axis.text.y=element_text(family="NanumGothic", color="#000000",
                                         size=16, angle=30))

graph
▶ 출력결과

png

Rating:

크리에이티브 커먼즈 라이선스 ITPAPER(호쌤,쭈쌤)에 의해 작성된 ≪[R 데이터시각화] 선 그래프≫은(는) 크리에이티브 커먼즈 저작자표시-비영리-동일조건변경허락 4.0 국제 라이선스에 따라 이용할 수 있습니다.
이 라이선스의 범위 이외의 이용허락을 얻기 위해서는 leekh4232@gmail.com으로 문의하십시오.

comments powered by Disqus