본문 바로가기

회사생활/R

한눈에 정리하는 ggplot2를 이용한 R 시각화 기초 1

한눈에 정리하는 ggplot2 를 이용한 R 시각화 기초 1




ggplot2는 R 시각화에서 빠지지 않고 등장하는 시각화 라이브러리이다. ggplot2 라이브러리를 이용해서 할 수 있는 시각화에는 크게 ggplot과 qplot이 있다.



ggplot

내가 원하는 특정 옵션을 상세하게 지정해서 예쁘게 시각화 할 때 사용한다.


qplot

옵션을 상세하게 지정하지 않아도 basic plot 보다 예쁘게 시각화 하고 싶을 때 사용한다.



나의 경우 데이터 기초 분석(EDA)을 할 때는 basic plot과 qplot을 주로 사용하고 보고서나 shiny로 구현할 때는 필요에 따라 ggplot을 사용하는 편인데 이번 포스팅에서는 ggplot만 다루겠다. 일단 ggplot2 패키지를 설치하고 라이브러리를 불러오자.


# ggplot2 패키지 설치하고 라이브러리 불러오기
install.packages("ggplot2")
library(ggplot2)




ggplot 계열의 함수는 크게 4가지 종류로 분류할 수 있을 것 같다.



(1) 필수 메인 함수 - ggplot( )


ggplot 사용시 필수로 들어가야 하는 함수로, 시각화할 데이터와 축을 지정한다.

ggplot(data = iris,
       mapping = aes(x = Sepal.Length,
                     y = Sepal.Width))

# data = 데이터
# mapping = aes(x = x축변수, y = y축변수)



하지만 위 코드만 실행하면 축과 바탕만 그려질 뿐, 실제 그래프는 아래 그래프 그리기 함수를 추가해 주어야 그려진다.




(2) 그래프 그리기 함수 - geom_그래프 계열


아래 나열한 그래프 외에도 많은 종류의 그래프가 있겠지만 주로 쓰는 종류만 나열한다.


산점도 / 산포도 geom_point( )

선 그래프 geom_line( )

박스플롯 geom_boxplot( )

히스토그램 geom_histogram( )

막대 그래프 geom_bar( )



ggplot은 ggplot( ) + geom_point( ) 와 같이 + 기호로 연결해 구문을 작성한다.

ggplot(data = iris,
       mapping = aes(x = Sepal.Length,
                     y = Sepal.Width)) + geom_point()


그래프 그리기 함수에 들어가는 주요 옵션은 그래프에 대한 색상/모양/크기/넓이 등 어떻게 그릴 것인가에 초점이 맞춰져 있다.
ggplot(data = iris,
       mapping = aes(x = Sepal.Length,
                     y = Sepal.Width)) + geom_point(colour = "red",
                                                    pch = 2,
                                                    size = 2)

# colour = "색상"
# pch = 모양
# size = 크기


pch 옵션의 번호와 모양은 아래와 같다. 0부터 127까지가 유효한 숫자라고 보면 될 것 같다. (중간에 26 ~ 32까지는 유효하지 않다.)


옵션을 단일하게 지정하지 않고 그룹별 옵션을 설정할 수도 있다. iris$Species에 따라 색상, 모양, 크기를 다르게 해보자.
ggplot(data = iris,
       mapping = aes(x = Sepal.Length,
                     y = Sepal.Width)) + geom_point(colour = c("purple", "blue", "green")[iris$Species],
                                                    pch = c(0, 2, 20)[iris$Species],
                                                    size = c(1, 1.5, 2)[iris$Species])


이때 iris$Species의 3가지 범주(카테고리)가 어떤 순서로 옵션이 배정되었는 확인하려면 아래 코드를 실행해보자.

levels(iris$Species)

실행결과, "setosa" "versicolor" "virginica" 순으로 출력 되는데 이 순서대로 옵션들이 배정된다. 예를 들어,
setosa의 옵션은 colour = "purple", pch = 0, size = 1 이고 virginica의 옵션은 colour = "green", pch = 20, size = 2 라는 의미다.
-
-

그룹별로 옵션을 설정하기 위해서는 그룹변수의 변수형이 factor 타입이어야 가능하다. 만약 character, integer, numeric 타입이라면 아래와 같은 코드를 이용하여 factor로 변경해준다.
iris$Species <- as.factor(iris$Species)



(3) 도형 그리기 함수 - geom_도형 계열


그래프를 그리고서 도형으로 사각형으로 특정 구역을 표시하거나 선으로 임계치를 표시하고 싶을 때 사용한다.


선 geom_abline( )

평행선 geom_hline( )

수직선 geom_vline( )

사각형 geom_rect( )

텍스트 geom_text( )


위 함수들을 사용해도 되기는 하지만 실제로 적용시켜보니 투명도 설정에 문제가 있어서 대신 annotate( ) 함수를 소개하려고 한다.

일단 코드를 단순화 하기 위해 앞에서 그렸던 그래프를 g라는 변수에 할당하자.

# 그래프를 g에 할당
g <- ggplot(data = iris,
            mapping = aes(x = Sepal.Length,
                          y = Sepal.Width)) + geom_point(colour = c("purple", "blue", "green")[iris$Species],
                                                         pch = c(0, 2, 20)[iris$Species],
                                                         size = c(1, 1.5, 2)[iris$Species])

# g에 할당된 그래프 출력
g


이 그래프에 3가지 iris$Species 데이터가 모두 겹치는 구역을 사각형과 직선으로 표시해보자. 먼저 위치 좌표를 가진 데이터 프레임을 생성한다.
# ddply 함수를 사용하기 위한 패키지 설치 및 라이브러리 불러오기
install.packages(plyr)
library(plyr)

# Species별 Sepal.Length, Sepal.Width의 최소값과 최대값을 tmp에 할당
tmp <- ddply(iris, .(Species), summarise,
             min_x = min(Sepal.Length),
             max_x = max(Sepal.Length),
             min_y = min(Sepal.Width),
             max_y = max(Sepal.Width))

# 도형을 표시할 지점의 좌표를 계산 : 최소값 중에 최대값, 최대값 중에 최소값
start_x <- max(tmp$min_x)
end_x <- min(tmp$max_x)
start_y <- max(tmp$min_y)
end_y <- min(tmp$max_y)

annotate( ) 함수는 geom 옵션으로 어떤 도형을 그릴 것인지를 결정하고 그에 따라서 세부 시각화 옵션이 따라 붙는다.
사각형으로 모든 iris$Species가 겹치는 구역을 표시해보자.
g + annotate(geom = "rect",
             xmin = start_x,
             xmax = end_x,
             ymin = start_y,
             ymax = end_y,
             fill = "red",
             alpha = 0.2,
             colour = "black",
             lty = 2)

# geom = "도형종류"
# xmin = 왼쪽 아래 x좌표
# xmax = 오른쪽 위 x좌표
# ymin = 왼쪽 아래 y좌표
# ymax = 오른쪽 위 y좌표
# fill = "채우기 색"
# alpha = 투명도
# colour = "선색"
# lty = 선종류


이번에는 4개의 점선으로 모든 iris$Species가 겹치는 구역을 표시해보자.

g + annotate(geom = "segment",
             x = c(start_x, end_x, -Inf, -Inf),
             xend = c(start_x, end_x, Inf, Inf),
             y = c(-Inf, -Inf, end_y, start_y),
             yend = c(Inf, Inf, end_y, start_y),
             colour = "black",
             alpha = 0.5,
             lty = 2,
             size = 1)

# geom = "도형종류"
# x = 선 시작점 x좌표
# xend = 선 종료점 x좌표
# y = 선 시작점 y좌표
# yend = 선 종료점 y좌표
# colour = "선색"
# alpha = 투명도
# lty = 선종류
# size = 선두께



이번에는 행 번호로 점에 라벨을 붙여보자. 라벨의 디폴트 위치는 점의 오른쪽 위 대각선 지점이다.

g + annotate(geom = "text",
             x = iris$Sepal.Length,
             y = iris$Sepal.Width,
             label = rownames(iris),
             colour = "brown",
             alpha = 0.7,
             size = 3,
             hjust = 0.5,
             vjust = -1)

# geom = "도형종류"
# x = x좌표
# y = y좌표
# colour = "글씨색"
# alpha = 투명도
# size = 글씨크기
# hjust = x축 영점 조절
# vjust = y축 영점 조절




(4) 외부 옵션 함수 - coord_계열, labs 등


축이나 그래프 외부 공간에 옵션을 추가하고자 할 때 사용한다.


축 변환 coord_flip( )

축 범위 coord_cartesian( )

라벨링 labs( )



축 변환부터 해보자. 원래 g그래프는 x축이 Sepal.Length, y축이 Sepal.Width였는데, coord_flip( ) 함수를 사용하면 두 축을 변환하는 효과를 주게 되어서 x축이 Sepal.Width, y축이 Sepal.Length가 된다.

g + coord_flip()



이번에는 축 범위를 바꿔보자. 원래 g그래프는 x축 범위가 4.3 ~ 7.9, y축 범위가 2 ~ 4.4 인데 축 범위를 아까 만들어둔 tmp 데이터로 변경해보자.

g + coord_cartesian(xlim = c(start_x, end_x),
                    ylim = c(start_y, end_y))



마지막으로 라벨링을 해보자. 제목, 부제목, 주석을 달고 축 이름도 변경해보겠다.

g + labs(title = "제목",
         subtitle = "부제목",
         caption = "주석",
         x = "x축 이름",
         y = "y축 이름")




이렇게 4단계로 ggplot2에 대하여 한눈에 정리해 보았다.




▼ 추가로 범례를 붙이는 방법, 선 그래프 여러 개 그리기 등 ▼

2017/04/26 - [Analysis/R] - 한눈에 정리하는 ggplot2를 이용한 R 시각화 기초 2





#barchart#barplot#bigdata#boxplot#geom#geom_#ggplot#ggplot2#how to use ggplot2#Plot#r#rstudio#R시각화#Scatterplot#Visualization#그래프#그래프그리기#데이터분석#바차트#바플랏#박스플랏#분석#비주얼라이제이션#빅데이터#빅데이터분석#산점도#산포도#시각화#시각화기초#차트#차트그리기#통계#플랏#플랏그리기#플롯