Menu

R의 ggplot2: 그래픽 문법 입문 가이드

ggplot2가 동작하는 방식 - 데이터 + aes() + geom이라는 사고 모형, 매핑과 설정의 차이, labs(), facet_wrap(), 테마, 그리고 ggsave()로 그래프 저장하기.

ggplot2는 레이어로 그래프를 만듭니다

ggplot2는 R에서 가장 널리 쓰이는 작도 패키지이며, 사람들이 그것을 신뢰하는 이유는 하나의 설계 아이디어에 있습니다: 그래픽 문법(grammar of graphics) 입니다. base R은 차트마다 함수를 하나씩 줍니다 - plot(), hist(), barplot() - 각각 고유한 인자를 가지고요. 반면 ggplot2는 조합 가능한 작은 조각들을 줍니다 - 데이터셋, 열을 시각적 속성에 연결하는 매핑, 그리고 그리기 레이어 - 이들이 +로 결합해 어떤 차트든 만들어 냅니다. 문법을 한 번 배우면 새로운 차트 종류는 단어 하나만 바뀐 같은 문장이 됩니다. 덤으로 기본값(회색 패널, 합리적인 축, 자동 범례)이 별다른 꾸밈 없이도 보여 줄 만합니다.

추가 패키지이므로 한 번의 설치와 세션마다의 로드가 필요합니다:

install.packages("ggplot2")   # once, on your machine
library(ggplot2)              # at the top of every script that uses it

미리 알아 둘 기대 사항이 하나 있습니다: ggplot2는 (흩어진 벡터가 아니라) 데이터 프레임 을 원하며, 이상적으로는 정돈된 긴 형식 - 관측마다 한 행, 변수마다 한 열 - 을 원합니다. 데이터가 넓은 형식이라면 먼저 피벗으로 길게 만드는 것만으로 작도 문제처럼 보이던 것이 대개 해소됩니다.

사고 모형: 데이터, 매핑, 기하

모든 ggplot은 세 가지 질문에 답하며, 각 부분이 하나씩 담당합니다:

  1. 데이터 - 어떤 데이터 프레임인가? ggplot(mtcars, ...)
  2. 매핑 - 어떤 열이 어떤 시각적 속성을 이끄는가? aes(x = wt, y = hp)
  3. 기하 - 관측값을 어떻게 그릴 것인가? + geom_point()

토큰 하나씩 살펴본 해부도입니다:

ggplot(mtcars, aes(x = wt, y = hp)) +
    geom_point()
  • ggplot(mtcars, ...)는 기본 데이터가 mtcars인 그래프를 시작합니다. 그것만으로는 빈 회색 패널을 그립니다 - 아직 레이어가 없으니까요.
  • aes(x = wt, y = hp)미적 매핑 입니다: 가로 위치는 wt 열에서, 세로 위치는 hp에서 옵니다. mtcars$wt가 아니라 열 이름을 그대로 쓴다는 점에 유의하세요 - 매핑은 여러분이 제공한 데이터 안에서 평가됩니다.
  • + geom_point()는 각 행을 점으로 그리는 레이어를 추가합니다. +는 정말로 레이어의 덧셈입니다: 그래프는 여러분이 쌓아 올리는 객체이며, 또 다른 geom, 라벨, 테마를 각각 +로 계속 더할 수 있습니다.

실행하면 산점도 가이드의 base R 버전과 같은 무게 대 마력 산점도가 흰 격자선이 있는 회색 패널 위에 나타납니다. geom_point()geom_line()으로 바꾸면 같은 매핑이 선 그래프가 됩니다 - 문법이 제 일을 하는 것이죠.

실제로 쓰게 될 geom들

geom 열두 개 정도면 일상 작업 대부분이 커버됩니다:

geom_point()       # scatter plot: two numeric variables
geom_line()        # line chart: trends over an ordered variable
geom_col()         # bar chart from pre-computed heights (needs y)
geom_bar()         # bar chart that counts raw rows for you (no y)
geom_histogram()   # distribution of one numeric variable (set binwidth)
geom_boxplot()     # distributions compared across groups
geom_smooth()      # fitted trend line; method = "lm" for straight

레이어는 쌓입니다. 바로 여기서 ggplot2가 표현력 면에서 base R을 앞서기 시작합니다: geom_point() + geom_smooth(method = "lm")은 회귀선 신뢰대가 함께 있는 산점도를 읽기 좋은 한 줄로 만듭니다. 그래프가 객체이므로 기반을 저장해 두고 거기서 갈라져 나갈 수도 있습니다:

p <- ggplot(mtcars, aes(x = wt, y = hp)) + geom_point()

p + geom_smooth(method = "lm")   # one variant
p + geom_smooth()                # another (loess curve)

매핑 vs 설정: 전형적인 aes() 혼동

모든 ggplot2 초보자가 대개 첫 주에 저지르는 실수 하나: 실제 색상을 aes() 안에 넣는 것입니다. 규칙은 짧습니다 - aes() 안은 "데이터에 따라 달라진다", 밖은 "고정된 설정" - 그리고 두 위치는 완전히 다른 일을 합니다:

# MAPPING: color varies by a column - each cylinder count gets its own
# color, and a legend appears automatically
ggplot(mtcars, aes(x = wt, y = hp, color = factor(cyl))) +
    geom_point(size = 2)

# SETTING: every point is literally steelblue - no legend, no mapping
ggplot(mtcars, aes(x = wt, y = hp)) +
    geom_point(color = "steelblue", size = 2)

그리고 함정 그 자체입니다:

# WRONG: "blue" inside aes() is treated as data, not as a color
ggplot(mtcars, aes(x = wt, y = hp, color = "blue")) +
    geom_point()

이것은 연어살빛 분홍색 점을 그리고, 항목이 하나뿐인 범례에 "blue"라는 라벨을 붙입니다. 이유는 이렇습니다: aes()는 열을 속성에 매핑하므로 color = "blue"는 모든 값이 "blue"라는 단어인 가짜 단일 범주 열을 만들고, ggplot은 그 범주에 기본 첫 번째 색을 배정하는데 그것이 마침 붉은 연어색입니다. "점을 파란색으로 만들라"는 뜻이었다면 색은 매핑 밖으로 나가야 합니다: geom_point(color = "blue"). 같은 규칙이 size, shape, fill, alpha에도 적용됩니다. (매핑 예제의 factor(cyl)도 눈여겨보세요: cyl은 수치형이며, factor()로 감싸는 것은 연속적인 색 그러데이션이 아니라 그룹별로 구별되는 색을 요청하는 것입니다.)

라벨, 패싯, 테마

labs()는 모든 이름을 한곳에서 지정합니다 - 그리고 제대로 된 라벨이 붙기 전까지 그래프는 완성된 것이 아닙니다:

ggplot(mtcars, aes(x = wt, y = hp, color = factor(cyl))) +
    geom_point(size = 2) +
    labs(title = "Horsepower vs. weight",
         x     = "Weight (1000 lbs)",
         y     = "Horsepower",
         color = "Cylinders")

패싯(facet) 은 ggplot2의 간판 기능입니다: 하나의 그래프를 그룹마다 패널 하나씩의 작은 그림 여러 개로 나누되 축을 공유해 패널 간 비교가 정직하게 이루어지도록 합니다:

ggplot(mtcars, aes(x = wt, y = hp)) +
    geom_point() +
    facet_wrap(~ cyl)

패널 세 개가 나타납니다 - 4기통, 6기통, 8기통 자동차 각각 하나씩 - 격자로 배치되고 각 패널 위에 그룹 값이 캡션으로 붙습니다. base R에서는 par(mfrow)와 수동으로 맞춘 공통 축 범위를 저글링해야 하지만, 여기서는 한 줄입니다. 패싯은 정돈된 데이터에 보답하며, 그래서 ggplot2가 dplyr 파이프라인과 그토록 자연스럽게 어울립니다 - 필터링하고 요약한 뒤 그 결과를 곧바로 ggplot()으로 흘려보내면 됩니다.

테마(theme) 는 데이터가 아닌 잉크를 한 번의 호출로 다시 꾸밉니다: + theme_minimal()(깔끔한 흰 배경), + theme_bw(), + theme_classic()(격자 없이 축만), 또는 회색 기본값이 있습니다. 프로젝트마다 하나를 골라 일관되게 유지하세요 - 모든 그림이 테마를 공유하는 보고서는 스크랩북이 아니라 하나의 문서처럼 읽힙니다.

ggsave()로 저장하기 - 그리고 base R로 충분한 때

ggsave()는 가장 최근 그래프를 디스크에 쓰며 파일 확장자에서 형식을 추론합니다:

ggsave("hp-vs-weight.png", width = 8, height = 5)          # last plot shown
ggsave("hp-vs-weight.pdf", plot = p, width = 8, height = 5) # a saved object

widthheight는 기본 단위가 인치입니다. 명시적으로 설정하세요. 글꼴 크기가 출력 크기에 따라 조정되는데 기본값이 그림이 놓일 자리에 맞는 경우는 드물기 때문입니다.

언제 이 수고를 들일지에 대해서는 이렇습니다: 분석 도중 변수 하나를 5초 동안 훑어볼 때는 base R의 plot()과 동료 함수들이 타이핑이 적고 의존성도 없습니다 - 모든 곳에 ggplot2를 쓴다고 상을 주지는 않습니다. ggplot2는 그림에 그룹, 범례, 패싯, 혹은 청중이 관여하는 순간부터 값어치를 합니다: 문법은 base R 작도가 애를 써야 다루는 복잡도까지 확장됩니다.

핵심 정리

  • ggplot2는 데이터 + aes() 매핑 + geom 레이어를 +로 이어 모든 차트를 구성합니다. 문법을 한 번 배워 모든 차트 종류에 재사용하세요.
  • aes()는 열을 시각적 속성에 매핑합니다 - 열 이름을 그대로 쓰며 여러분의 데이터 프레임 안에서 평가됩니다.
  • aes() 안 = 데이터에 따라 달라짐(범례가 생김), 밖 = 고정된 설정. aes(color = "blue")가 전형적인 버그입니다.
  • 제목에는 labs(), 작은 그림 여러 개에는 facet_wrap(~ group), 꾸미기에는 theme_minimal() 등, 내보내기에는 크기를 명시한 ggsave()를 쓰세요.
  • 혼자 빠르게 보기: base R. 그룹, 패싯, 또는 청중이 있을 때: ggplot2.

이것으로 작도 장이 마무리됩니다. 여기서 자연스러운 다음 단계는 이 그래프들이 드러낸 형태에 숫자를 붙이는 기술통계입니다.

자주 묻는 질문

R에서 ggplot2는 무엇인가요?

ggplot2는 R에서 가장 널리 쓰이는 작도 패키지입니다. 차트 종류마다 함수를 하나씩 두는 대신, 모든 그래프를 같은 세 조각으로 구성합니다 - 데이터 프레임, 열을 시각적 속성에 연결하는 aes() 매핑, 그리고 하나 이상의 geom_*() 레이어 - 이들을 +로 잇습니다. tidyverse의 일부입니다.

ggplot2는 어떻게 설치하나요?

install.packages("ggplot2")를 한 번 실행한 뒤, 이를 사용하는 모든 스크립트 맨 위에서 library(ggplot2)를 호출합니다. 설치는 패키지를 컴퓨터에 놓는 것이고, library()는 현재 세션으로 불러오는 것입니다.

ggplot2에서 aes()는 무엇을 하나요?

aes()는 데이터의 열을 시각적 속성에 매핑합니다: aes(x = wt, y = hp, color = factor(cyl))은 가로 위치는 wt에서, 세로 위치는 hp에서, 점의 색은 실린더 수에서 온다는 뜻입니다. aes() 안에 있는 것은 데이터에 따라 달라지고, 밖에 있는 것은 고정된 설정입니다.

ggplot의 점이 왜 제가 지정한 색이 아닌가요?

색상을 aes() 안에 넣었기 때문입니다: aes(color = "blue")는 색을 지정하는 것이 아니라 "blue"라는 가짜 범주를 매핑하므로, ggplot이 자체 기본 색을 고르고 범례를 추가합니다. 실제 색을 지정하려면 매핑 밖에 두세요: geom_point(color = "blue").

Coddy programming languages illustration

Coddy로 코딩 배우기

시작하기