본문으로 이동
메뉴 여닫기
환경 설정 메뉴 여닫기
개인 메뉴 여닫기
로그인하지 않음
지금 편집한다면 당신의 IP 주소가 공개될 수 있습니다.
ggplot2; 지지플롯2
그래픽 문법(Grammar of Graphics)에 따라 데이터, 미적 매핑, 기하 객체를 층(layer)으로 쌓아 그래프를 만드는 R의 시각화 패키지

ggplot2는 해들리 위컴(Hadley Wickham)이 만든 R 패키지로, 현재 tidyverse 패키지 묶음의 하나로 배포된다. 공식 문서는 ggplot2를 "그래픽 문법(The Grammar of Graphics)에 기반해 그래픽을 선언적으로 만드는 시스템"이라고 소개한다. 사용자는 데이터를 주고, 변수를 미적 속성(aesthetics)에 어떻게 대응시킬지와 어떤 그래픽 기본 요소(geom)를 쓸지만 지정하면 나머지 세부 사항은 패키지가 처리한다.

R 기본 그래픽(plot(), hist(), barplot())이 함수마다 그래프 종류가 정해진 방식이라면, ggplot2는 그래프를 구성 요소로 분해하고 + 연산자로 층을 더해 조립한다. 그래서 산점도에 회귀선을 겹치거나 집단별로 패널을 나누는 일을 같은 문법으로 할 수 있다. ADP 필기 5과목의 '분석 도구를 이용한 시각화 구현'에서 R 기반 시각화 도구로 다룬다.

  • 리랜드 윌킨슨(Leland Wilkinson)은 저서 The Grammar of Graphics(1999, 2판 2005)에서 통계 그래픽을 데이터, 변환, 척도, 좌표계, 기하 요소 같은 독립된 구성 요소의 조합으로 기술하는 문법을 제시했다.
  • 위컴은 논문 "A Layered Grammar of Graphics"(Journal of Computational and Graphical Statistics, 2010)에서 이 문법을 층(layer) 중심으로 재구성했고, ggplot2가 그 구현이다. 한 층은 데이터, 미적 매핑, 통계 변환(stat), 기하 객체(geom), 위치 조정(position)으로 이루어지며, 그래프는 여러 층과 척도, 좌표계, 패싯의 조합이다.
요소 역할 대표 함수
data 그릴 데이터 프레임. 한 행이 한 관측치인 tidy 형식이 기본이다 ggplot(data = df)
aes (미적 매핑) 변수를 x, y 위치, 색(colour), 채움(fill), 크기(size), 모양(shape), 투명도(alpha) 같은 시각 속성에 대응시킨다 aes(x = , y = , colour = )
geom (기하 객체) 점, 선, 막대 등 실제로 그려지는 도형 geom_point(), geom_line(), geom_bar()
stat (통계 변환) 그리기 전에 데이터를 요약·변환한다. 막대 그래프의 개수 세기, 히스토그램의 구간 나누기, 평활선 적합 등 stat_count(), stat_bin(), stat_smooth()
scale (척도) 데이터 값을 시각 속성 값으로 바꾸는 규칙과 축·범례 scale_x_log10(), scale_colour_brewer(), scale_fill_manual()
coord (좌표계) 위치를 평면에 놓는 방식 coord_cartesian(), coord_flip(), coord_polar()
facet (패싯) 범주 변수 값에 따라 데이터를 나누어 작은 그래프 여러 개로 그린다 facet_wrap(), facet_grid()
theme (테마) 배경, 글꼴, 격자선처럼 데이터와 무관한 외형 theme_bw(), theme_minimal(), theme()
  • aes() 안에 쓰면 변수에 따라 값이 바뀌는 매핑이고, aes() 밖에 쓰면(geom_point(colour = "blue")) 모든 점에 같은 값을 주는 고정 설정이다.
  • labs()로 제목과 축 이름을, ggsave()로 그래프를 파일로 저장한다.

기본 코드 예시

편집 원본 편집

R에 내장된 mtcars 데이터(자동차 32대의 연비와 사양)를 쓴다.

library(ggplot2)

# 1) 산점도: 무게(wt)와 연비(mpg), 실린더 수(cyl)별 색
ggplot(mtcars, aes(x = wt, y = mpg, colour = factor(cyl))) +
  geom_point(size = 3) +
  labs(title = "무게와 연비", x = "무게(1000 lbs)", y = "연비(mpg)",
       colour = "실린더")

# 2) 층 더하기: 선형 회귀선과 신뢰구간
ggplot(mtcars, aes(wt, mpg)) +
  geom_point() +
  geom_smooth(method = "lm", se = TRUE)

# 3) 막대 그래프: geom_bar()는 개수를 세어(stat = "count") 그린다
ggplot(mtcars, aes(x = factor(gear))) +
  geom_bar(fill = "steelblue") +
  coord_flip()

# 4) 히스토그램과 패싯
ggplot(mtcars, aes(mpg)) +
  geom_histogram(binwidth = 2) +
  facet_wrap(~ am)

# 5) 상자 그림과 테마, 파일 저장
p <- ggplot(mtcars, aes(factor(cyl), mpg)) +
  geom_boxplot() +
  theme_bw()
ggsave("boxplot.png", p, width = 6, height = 4)
geom 그래프 기본 stat / 비고
geom_point() 산점도 identity. size 매핑으로 버블 차트
geom_line(), geom_path() 선 그래프 geom_line()은 x 순서로, geom_path()는 데이터 순서로 잇는다
geom_bar() 막대 그래프(개수) count. 행 개수를 세어 높이로 쓴다
geom_col() 막대 그래프(값) identity. 데이터에 있는 값을 그대로 높이로 쓴다
geom_histogram() 히스토그램 bin. bins 또는 binwidth로 구간을 정한다
geom_density() 커널 밀도 곡선 density
geom_boxplot() 박스 플롯 boxplot
geom_violin() 바이올린 그림 ydensity
geom_smooth() 평활선·회귀선 smooth. method = "lm"이면 선형 회귀
geom_tile() 히트맵 identity. fill에 값을 매핑
geom_area() 영역(누적 영역) 그래프 여러 집단을 쌓아 누적 연속 그래프를 만든다
geom_text(), geom_label() 글자 표시 label 매핑 필요
  • 파이 차트는 별도 geom이 없고, 한 개의 누적 막대(geom_bar(width = 1))에 coord_polar(theta = "y")를 적용해 만든다.

qplot()과 ggplot()

편집 원본 편집
구분 qplot() / quickplot() ggplot()
형태 R 기본 plot()처럼 함수 하나에 인자로 지정 ggplot()으로 시작해 + 로 층을 더한다
예 qplot(mpg, wt, data = mtcars) ggplot(mtcars, aes(mpg, wt)) + geom_point()
용도 빠르게 한 번 그려 보는 간단한 그래프 여러 층, 척도, 패싯을 조합하는 복잡한 그래프
현재 상태 ggplot2 3.4.0부터 사용 중단 예정(deprecated). 호출하면 경고가 나온다 권장 방식
  • 공식 문서는 qplot()을 deprecated로 바꾼 이유를 사용자가 복잡한 그래프를 만들기 쉬운 ggplot()을 배우도록 하기 위해서라고 설명한다. 오래된 교재와 기출 문제에는 qplot()이 나오므로 형식은 알아 둔다.
  • ggplot2는 윌킨슨의 그래픽 문법과 위컴의 계층적 그래픽 문법(layered grammar)에 기반하며, + 연산자로 층을 쌓는다는 점을 기억한다.
  • 구성 요소(data, aes, geom, stat, scale, coord, facet, theme)의 역할을 구분하는 문제가 나온다. 특히 aes는 변수와 시각 속성의 매핑, facet은 집단별 패널 분할이다.
  • geom_bar()(개수, stat = "count")와 geom_col()(값 그대로)의 차이, geom_histogram()의 구간 지정, geom_smooth(method = "lm")를 알아 둔다.
  • 실기에서 R로 탐색적 시각화를 할 때 바로 쓸 수 있도록 기본 코드 형식을 익혀 둔다.