이동식 저장소

5. ggplot2 본문

CS/R 전산실습

5. ggplot2

해스끼 2020. 12. 3. 14:21

ggplot2를 사용하여 그래프를 그려 보자.

1. ggplot2 시작하기

데이터프레임 mpg의 변수 displhwy의 관계를 산점도로 나타내 보자. displ은 리터 단위 배기량이고, hwy는 고속도로 연비이다.

ggplot(data=mpg) +
    geom_point(mapping=aes(x=displ, y=hwy))

그래프 작성은 ggplot()으로 시작한다. ggplot()에서는 그래프 작성에 사용할 데이터프레임을 지정하고, 그래프가 작성될 좌표계를 준비한다. ggplot()만으로는 실질적인 그래프가 작성되지 않으며, 막대그래프, 히스토그램, 산점도 등의 레이어를 추가해야 한다.

위에서는 geom_point()를 이용하여 산점도를 작성하였다. 이처럼 ggplot2에서는 하나 이상의 레이어가 겹쳐져서 그래프가 완성된다.

그래프를 그리는 일반적인 문법은 다음과 같다.

ggplot(data=<Data>) + 
    <Geom_function>(mapping=aes(<Mappings>)) +
    <Geom_function> +
    <Geom_function> +
    ...
  • <Data>: 그래프 작성에 사용될 데이터프레임
  • <Geom_function>: 레이어를 작성하는 함수.
    • 여러 개의 레이어를 덧셈 기호로 연결하여 레이어를 겹칠 수 있다.
    • 데이터를 지정할 수도 있고, 지정하지 않은 경우 ggplot()에서 지정된 데이터프레임을 사용한다.
  • <Mappings>: 시각적 요소(점의 크기, 모양, 색깔 등)와 데이터를 연결한다.

2. 시각적 요소와의 연결: Mapping과 Setting

시각적 요소는 그래프를 시각적으로 인식하는 데에 필요한 요소이다. 예를 들어 산점도의 시각적 요소는 점의 위치, 크기, 모양 및 색깔 등이 있다. 시각적 요소를 데이터와 연결지어 지정하고 싶다면(mapping) aes() 안에서 요소를 지정해야 한다. 데이터와 관계없이 어떤 값을 지정하고 싶다면(setting) aes() 밖에서 지정해야 한다.

mapping

mapping은 데이터의 값에 따라 시각적 요소를 부여하는 방식이다. 데이터프레임 mpg에서 변수 class의 값에 따라 점의 색깔을 다르게 해 보자. 색깔이 너무 많기 때문에 그래프를 알아보기 힘들다.

ggplot(data=mpg) +
    geom_point(mapping=aes(x=displ, y=hwy, color=class))

이번에는 변수 drv의 값에 따라 점의 모양을 다르게 해 보자. 물론 난잡하기는 마찬가지이므로 예제로만 받아들이자.

ggplot(data=mpg) + 
    geom_point(mapping=aes(x=displ, y=hwy, shape=drv))

물론 여러 시각적 요소를 한꺼번에 설정할 수도 있다. 시각적 요소가 많아질수록 그래프를 알아보기 힘들어진다는 점에 주의하자.

ggplot(data=mpg) + 
    geom_point(mapping=aes(x=displ, y=hwy,
                           color=class, shape=drv, size=cyl)) # 점의 색깔, 모양, 크기

setting

setting은 데이터의 값에 상관없이 특정한 값을 지정하는 방법이다. 예를 들어 모든 점의 색깔을 파란색으로 지정하고 싶다면 다음과 같이 하면 된다.

ggplot(data=mpg) + 
    geom_point(mapping=aes(x=displ, y=hwy), color="blue") # setting

단, 아래의 mapping 예제와 헷갈리지 말도록 하자. 아래의 예제는 변수 color를 새로 만들고, 모든 color의 값을 blue로 설정한 경우이다. 점의 색깔을 파란색으로 지정한 것이 아니다.

ggplot(data=mpg) +
    geom_point(mapping=aes(x=displ, y=hwy, color="blue")) # mapping!

3. 그룹별 그래프 작성: facet

어떤 변수가 다른 변수에 미치는 영향을 확인하고 싶다면, 범주형 변수로 그룹을 나누어 각 그룹의 그래프를 그려보는 방법이 있다. 이것을 faceting이라고 한다.

  • facet_wrap(): 변수 하나에 의한 faceting
  • facet_grid(): 변수 하나 또는 두 개에 의한 faceting

facet_wrap()

데이터를 구분하는 변수가 하나인 경우에 사용한다. 예를 들어 데이터프레임 mpg의 변수 displhwy의 산점도를 class의 그룹별로 작성하려면 다음과 같이 한다.

ggplot(data=mpg) +
    geom_point(mapping=aes(x=displ, y=hwy)) +
    facet_wrap(~ class)

facet_wrap()을 사용하면 그래프 여러 개가 격자 형태로 그려진다. 격자의 배치를 수정하고 싶다면 열의 개수 ncol을 지정할 수 있다. 또는 그래프가 열에 먼저 배치되도록 할 수 있다.

plot = ggplot(data=mpg) + 
    geom_point(mapping=aes(x=displ, y=hwy))

plot + facet_wrap(~ class, ncol=2)           # 2열로 배치
plot + facet_wrap(~ class, ncol=2, dir="v")  # 2열로 배치, 세로 방향으로 배치

facet_grid()

facet_grid(y ~ x)
  • y: 행의 범주
  • x: 열의 범주

하나의 행 또는 열로 그래프를 배치하고 싶다면, y 또는 x의 자리에 .을 쓰면 된다.

facet_grid(. ~ x) # 모든 그래프를 하나의 행에 배치

데이터프레임 mpg에서 displhwy의 산점도를 drvcyl의 범주별로 그리려면 다음과 같이 하면 된다.

ggplot(data=mpg) +
    geom_point(mapping=aes(x=displ, y=hwy)) +
    facet_grid(drv ~ cyl) # 행: drv, 열: cyl

4. 기하 객체: Geometric object

  • geom_point(): 점 그래프
  • geom_line(): 선 그래프

데이터프레임 mpg의 변수 displhwy를 그래프에 나타내 보자. 이때 geom_smooth()를 사용하여 비모수 회귀곡선을 그려 보자.

ggplot(data=mpg) +
    geom_smooth(mapping=aes(x=displ, y=hwy))

현재 ggplot2에는 다음과 같은 geom 함수가 존재한다.

  • 하나의 변수에 대한 함수: geom_bar(), geom_histogram(), geom_denstiy(), geom_dotplot()
  • 두 변수에 대한 함수: geom_point(), geom_smooth(), geom_text(), geom_line(), geom_boxplot()
  • 세 변수에 대한 함수: geom_contour(), geom_tile()

더 많은 정보는 RStudio에서 Help > Cheatsheets > Data Visualization with ggplot2에서 확인할 수 있다.

전역 매핑과 지역 매핑

전역 매핑은 ggplot()에서의 매핑으로, 해당 그래프의 모든 레이어에 적용된다. 따지고 보면 data=mpg도 전역 매핑이라 볼 수 있겠다. 여러 함수에 동일한 매핑을 사용하고 싶다면 전역 매핑을 사용하자.

지역 매핑은 geom 함수에서의 매핑으로, 해당 레이어에만 적용된다. 지역 매핑은 전역 매핑보다 우선적으로 적용된다.

# 중복!
ggplot(data=mpg) +
    geom_point(mapping=aes(x=displ, y=hwy)) +
    geom_smooth(mapping=aes(x=displ, y=hwy))

# 중복 제거
ggplot(data=mpg, mapping=aes(x=displ, y=hwy)) +
    geom_point() +
    geom_smooth()

다음과 같이 전역 매핑과 지역 매핑을 섞어서 쓸 수도 있다.

ggplot(data=mpg, mapping=aes(x=displ, y=hwy)) +
    geom_point(mapping=aes(color=drv), size=2)) +
    geom_smooth(mapping=aes(linetype=drv))

ggplot()에서 그래프를 그릴 변수를 지정한 후, 각 geom 함수에서는 그래프의 시각적 요소를 지정하였다.

각 geom 함수에서 다른 데이터 사용

mpg의 변수 displhwy의 산점도를 그린다. 이때 drv의 값에 따라 색을 구분한다. 여기에 drv4인 데이터만을 대상으로 비모수 회귀곡선을 추가해 보자.

ggplot(data=mpg, mapping=aes(x=displ, y=hwy)) +
    geom_point(mapping=aes(color=drv), size=2) +
    geom_smooth(data=filter(mpg, drv=="4"), color="red")

5. 통계적 변환: skip

6. 위치 조정

흔들기 (jittering)

산점도를 그릴 때, 같은 값을 갖는 데이터가 많을 경우 점이 한 곳에 전부 겹치는 문제가 있다, 예컨대 x=1, y=2인 데이터가 10개 존재함에도 불구하고 그래프에서는 하나의 점밖에 보이지 않는다는 것이다.

이 문제를 해결하려면 자료에 약간의 난수값을 더하여 점을 흔들어 줄 필요가 있다. 이러한 기법을 jittering이라고 한다.

ggplot(data=mpg, mapping=aes(x=displ, y=hwy)) +
    geom_point(position="jitter")

또는 geom_jitter()를 사용할 수도 있다. 이 함수를 사용하면 x축과 y축 방향으로 얼마나 흔들 것인지를 지정할 수 있다.

ggplot(data=mpg, mapping=aes(x=displ, y=hwy)) +
    geom_jitter(width=0.2, height=0.1) # width: 가로로, height: 세로로 흔드는 정도

이변량 막대그래프/상자그림

172~173p 참고

7. 좌표계

x, y축 범위 조정: coord_cartesian()

x축의 범위를 [3, 6]으로 조정하고자 할 경우 다음과 같이 사용하면 된다. y축의 범위를 조정할 때도 마찬가지이다.

ggplot(data=mpg, mapping=aes(x=displ, y=hwy)) +
    geom_point() +
    geom_smooth() +
    coord_cartesian(xlim=c(3, 6))

scale()을 이용하여 범위를 조정할 수도 있다. 그러나 scale 함수를 사용하는 경우 범위를 벗어난 자료는 NA로 간주되어 모두 삭제된다. 하지만 coord_cartesian()은 데이터를 삭제하지 않고 지정한 범위만 확대하여 보여준다.

그래프 회전: coord_flip()

그래프의 x축과 y축을 바꾸고 싶다면 coord_flip()을 활용할 수 있다. 예를 들어 geom_boxplot()은 수직 방향의 상자를 그리는데, coord_flip()을 적용할 경우 상자가 수평 방향으로 누워있게 된다.

ggplot(data=mpg, mapping=aes(x=displ, y=hwy)) +
    geom_boxplot() +
    coord_flip()

(skip) 파이 그래프 작성: coord_polar()

'CS > R 전산실습' 카테고리의 다른 글

7. R 프로그래밍  (0) 2020.12.05
4. dplyr  (0) 2020.12.02
Comments