ggplot2는 tidyverse에 포함된 시각화 패키지입니다.
그래프의 문법(Grammar of Graphics)을 기반으로 설계되어, 그래프를 레이어를 쌓는 방식으로 구성합니다.
ggplot2의 구조를 이해하면 다양한 그래프를 일관된 방식으로 만들 수 있습니다.
library(ggplot2)
# 또는
library(tidyverse)
기본 문법
ggplot2 그래프는 세 가지 핵심 요소로 구성됩니다.
ggplot(data = df, aes(x = 열이름, y = 열이름)) +
geom_*(옵션)
- ggplot(): 그래프의 기반을 설정합니다. 사용할 데이터와 전역 심미적 매핑을 지정합니다.
- aes(): 데이터의 열을 시각적 요소(x축, y축, 색상, 크기 등)에 매핑합니다.
- geom_*(): 어떤 종류의 그래프를 그릴지 지정합니다. +로 레이어를 추가합니다.
# 구성 요소를 단계별로 보면
p <- ggplot(df, aes(x = coverage, y = gc)) # 기반 설정
p <- p + geom_point() # 점 레이어 추가
p <- p + labs(title = "Coverage vs GC") # 제목 추가
p
+ 뒤에서 줄바꿈이 가능합니다.
코드 가독성을 위해 geom_*(), labs(), theme() 등을 줄바꿈하면서 작성합니다.
데이터셋 로드 및 확인
예시로 R에 내장된 mtcars 데이터셋을 사용합니다.
data(mtcars)
head(mtcars)
str(mtcars)
mtcars는 자동차 32종의 연비, 실린더 수, 마력 등의 정보가 담긴 데이터셋입니다.
열 이름을 미리 파악해두면 아래 예시 코드를 따라가기 쉽습니다.
# 주요 열
# mpg: 연비 (miles per gallon)
# cyl: 실린더 수
# hp : 마력 (horsepower)
# wt : 차량 무게
# am : 변속기 종류 (0: 자동, 1: 수동)
Scatter Plot: geom_point()
두 수치형 변수 간의 관계를 점으로 나타냅니다.
ggplot(mtcars, aes(x = wt, y = mpg)) +
geom_point()

aes() 안에 색상, 크기, 모양도 매핑할 수 있습니다.
ggplot(mtcars, aes(x = wt, y = mpg, color = factor(cyl), size = hp)) +
geom_point(alpha = 0.7)

- color = factor(cyl): 실린더 수에 따라 색상을 다르게
- size = hp: 마력에 따라 점 크기를 다르게
- alpha: 투명도 (0~1, 1이 불투명)
aes() 안의 설정은 데이터에 따라 달라지고, aes() 밖의 설정은 모든 점에 동일하게 적용됩니다.
ggplot(mtcars, aes(x = wt, y = mpg)) +
geom_point(color = "blue", size = 3) # 모든 점에 동일 적용

Text Plot: geom_text(), geom_label()
점 대신 텍스트를 표시합니다.
각 데이터 포인트에 이름이나 값을 표시할 때 사용합니다.
# geom_text(): 텍스트만 표시
ggplot(mtcars, aes(x = wt, y = mpg, label = rownames(mtcars))) +
geom_text()
# geom_label(): 텍스트에 배경 박스 추가
ggplot(mtcars, aes(x = wt, y = mpg, label = rownames(mtcars))) +
geom_label()
점과 텍스트를 함께 표시하려면 레이어를 쌓습니다.

ggplot(mtcars, aes(x = wt, y = mpg)) +
geom_point() +
geom_text(aes(label = rownames(mtcars)),
hjust = -0.1, vjust = 0.5, size = 3)

- hjust, vjust: 텍스트 위치 조정 (0.5가 중앙, 음수면 오른쪽으로 이동)
Box Plot: geom_boxplot()
그룹별 분포를 요약해서 보여줍니다.
중앙값, 사분위수, 이상값을 함께 확인할 수 있습니다.
ggplot(mtcars, aes(x = factor(cyl), y = mpg)) +
geom_boxplot()

x축에 연속형 변수를 그대로 넣으면 하나의 박스만 그려집니다.
그룹 변수는 factor()로 감싸서 범주형으로 변환해야 합니다.
ggplot(mtcars, aes(x = factor(cyl), y = mpg, fill = factor(cyl))) +
geom_boxplot(alpha = 0.7) +
labs(x = "Cylinders", y = "MPG", fill = "Cylinders")

Line Plot: geom_line()
시간이나 순서에 따른 변화를 선으로 나타냅니다.
# 예시 데이터
df <- data.frame(
time = 1:10,
value = c(3, 5, 4, 7, 6, 8, 7, 9, 8, 10)
)
ggplot(df, aes(x = time, y = value)) +
geom_line()
# 선과 점을 함께
ggplot(df, aes(x = time, y = value)) +
geom_line() +
geom_point()

그룹별 선을 그리려면 group과 color를 지정합니다.
df_group <- data.frame(
time = rep(1:5, 2),
value = c(1, 3, 2, 4, 3, 2, 4, 3, 5, 4),
group = rep(c("A", "B"), each = 5)
)
ggplot(df_group, aes(x = time, y = value, color = group, group = group)) +
geom_line() +
geom_point()

group 매핑이 없으면 선이 제대로 연결되지 않습니다.
그룹 구분 없이 선을 하나만 그릴 때도 group = 1을 명시하는 경우가 있습니다.
Bar Plot: geom_bar(), geom_col()
두 함수는 비슷하지만 입력 데이터가 다릅니다.
geom_bar(): 빈도 자동 계산
x 변수의 각 값이 몇 번 등장하는지 자동으로 계산해서 막대를 그립니다.
ggplot(mtcars, aes(x = factor(cyl))) +
geom_bar()

geom_col(): 값을 직접 지정
이미 집계된 데이터에서 x와 y를 직접 지정합니다.
df_sum <- data.frame(
group = c("A", "B", "C"),
count = c(15, 23, 9)
)
ggplot(df_sum, aes(x = group, y = count)) +
geom_col()

# fill로 색상 채우기, 누적 막대
ggplot(mtcars, aes(x = factor(cyl), fill = factor(am))) +
geom_bar()
# 나란히 배치
ggplot(mtcars, aes(x = factor(cyl), fill = factor(am))) +
geom_bar(position = "dodge")

- position = "stack": 누적 (기본값)
- position = "dodge": 나란히
- position = "fill": 비율로 정규화
Histogram: geom_histogram()
하나의 연속형 변수의 분포를 구간으로 나눠 보여줍니다.
ggplot(mtcars, aes(x = mpg)) +
geom_histogram()
# 구간 수 또는 구간 너비 지정
ggplot(mtcars, aes(x = mpg)) +
geom_histogram(bins = 10)
ggplot(mtcars, aes(x = mpg)) +
geom_histogram(binwidth = 3, fill = "steelblue", color = "white")

- bins: 구간 수
- binwidth: 구간 너비
- fill: 막대 채우기 색상
- color: 막대 테두리 색상
그룹별로 겹쳐서 보려면 alpha로 투명도를 조정합니다.
ggplot(mtcars, aes(x = mpg, fill = factor(cyl))) +
geom_histogram(binwidth = 3, alpha = 0.6, position = "identity")

aes() 안 vs 밖
ggplot2에서 가장 헷갈리는 부분 중 하나입니다.
# aes() 안: 데이터에 따라 달라짐
ggplot(mtcars, aes(x = wt, y = mpg, color = factor(cyl)))
# aes() 밖: 모든 점에 동일하게 적용
ggplot(mtcars, aes(x = wt, y = mpg)) +
geom_point(color = "blue")
color = factor(cyl)은 데이터에 따라 색이 달라지므로 aes() 안에 넣고, color = "blue"처럼 고정된 값은 aes() 밖에 넣습니다.
색상 이름을 aes() 안에 넣으면 범례가 생기면서 의도치 않은 결과가 나옵니다.
'BI&Programming-Tools > R' 카테고리의 다른 글
| R 기초 - 11. ggplot2 시각화 심화 (0) | 2026.06.30 |
|---|---|
| [R 기초] 9. Tidyverse (0) | 2026.06.29 |
| [R 기초] 8. 데이터 전처리 (0) | 2026.06.29 |
| [R 기초] 7. 제어문과 함수 (0) | 2026.06.29 |
| [R 기초] 6. 데이터 구조 (행렬, 데이터프레임) (0) | 2026.06.28 |
