본문 바로가기

정리/시각화

[R] ggplot2 서로 다른 그래프 겹치기

728x90

안녕하세요. 이번에는 ggplot2 패키지를 이용해서 서로 다른 그래프를 겹치는 방법을 소개하겠습니다.

 

[목차]

1. ggplot2 의 그래프 그리는 방식

2. 히스토그램과 확률 밀도 함수 겹치기  ( histogram , probability density function)

3. 산점도와 회귀선 겹치기 (point, line)

4. 산점도와 박스 겹치기 (scatter, Boxplot )

 

 

[내용]

1. ggplot2 의 그래프 그리는 방식

층층이 쌓인  layer (가장 마지막에 쌓인 것이 맨 위에 보여진다.)


ggplot2에서 그래프를 결합하는 방법은 + 연산자를 사용하여 간단하게 수행됩니다. ggplot2는 그래프를 레이어(layer) 단위로 작성하며, 각 레이어는 +로 결합됩니다.  이러한 방식은 누적해서 그래프를 구성할 수 있고, 각각의 함수는 특정 그래프 요소를 추가하거나 수정합니다. 결합된 ggplot 객체를 변수에 할당하면 나중에 그래프를 수정하거나 저장할 때 유용합니다. 이러한 방식으로 + 연산자를 사용하여 여러 레이어를 결합하여 복잡한 그래프를 만들 수 있습니다.

한편 이 "레이어 추가"는 그래프에 추가되는 구성 요소로, 기하 객체 (geom)와 통계적 변환 (stat)으로 구성됩니다.
기하 객체 (geom): 데이터를 시각화하는 요소로, 점, 선, 막대, 상자 등이 있습니다. geom_* 함수를 사용하여 추가합니다.
geom_point()  # 산점도를 추가

통계적 변환 (stat): 데이터에 통계적 변환을 적용하는 요소로, 회귀선, 히스토그램 등이 있습니다. stat_* 함수를 사용하여 추가합니다.
stat_smooth()  # 회귀선을 추가

여러 레이어를 함께 사용하여 그래프를 만들 수 있습니다.

 

 

 

2. 히스토그램과 확률 밀도 함수 겹치기

히스토그램은 데이터를 구간별로 나누어 각 구간에 속하는 데이터의 빈도를 막대로 나타낸 그래픽 표현이고 확률 밀도 함수는 확률 변수의 값이 특정 구간에 속할 확률을 나타내는 함수입니다. 각각은 모수 대비 발생 빈도를 나타내는데 유용한 그래프 입니다. 두 그래프를 겹쳐서 그려보겠습니다.

 

 

# 데이터 생성
set.seed(123)
data <- data.frame(value = rnorm(1000))

# 히스토그램과 밀도 추정 그래프를 겹치기
ggplot(data, aes(x = value)) +
  geom_histogram(aes(y = ..density..), binwidth = 0.5, fill = "lightblue", color = "black", alpha = 0.7) +
  geom_density(color = "red") +
  ggtitle("Histogram and Density Plot") +
  xlab("Value") +
  ylab("Density")

히스토그램과 확률 밀도 함수의 합

 

3. 산점도와 회귀선 겹치기

mod <- loess(hwy ~ displ, data = mpg)
grid <- data.frame(displ = seq(min(mpg$displ), max(mpg$displ), length = 50))
grid$hwy <- predict(mod, newdata = grid)

std_resid <- resid(mod) / mod$s
outlier <- subset(mpg, abs(std_resid) > 2)


ggplot(mpg, aes(displ, hwy)) + 
  geom_point() + 
  geom_line(data = grid, colour = "blue", size = 1.5) + 
  geom_text(data = outlier, aes(label = model))

mod <- loess(hwy ~ displ, data = mpg):  "mpg" 데이터셋에서 "hwy" (고속도로 연비)와 "displ" (배기량) 변수 간의 관계를 모델링하기 위해 로컬 가중치 스무딩 회귀 모델을 적합시킵니다. 그 후 연산하는 부분은 생략하고 그리는 부분을 설명하겠습니다.

ggplot(mpg, aes(displ, hwy)) + ...: "mpg" 데이터셋을 기반으로 하는 ggplot을 생성합니다. "displ"을 x축으로, "hwy"를 y축으로 하는 산점도를 그리고, 이후에 나오는 라인 및 텍스트 레이어를 추가합니다.
geom_point() +  : 산점도를 추가합니다.
geom_line(data = grid, colour = "blue", size = 1.5) +  : "grid" 데이터프레임을 사용하여 회귀선을 그립니다. 선의 색상은 파란색이고, 굵기는 1.5로 지정합니다.
geom_text(data = outlier, aes(label = model)): "outlier" 데이터프레임의 이상치에 대한 텍스트를 추가합니다. "model" 변수를 라벨로 사용합니다.

 

산점도와 회귀선 겹치기

 

 

4. 산점도와 박스 겹치기

 

library(ggplot2)
ggplot(aes(y = hwy,x = class,fill= class),data = mpg) +
geom_boxplot() +
geom_jitter(alpha = .2, colour = "black", fill = "white") +
theme_minimal() +
theme(legend.position="right") +
xlab("class") +
ylab("hwy") +
scale_fill_manual(values=c("111111","2CCDDD","#5C9AC5","#82BD4E","#EDD054","#EE6A64","#F40000"))


ggplot(aes(y = hwy, x = class, fill = class), data = mpg)  : ggplot 함수를 사용하여 그래프를 생성합니다.
aes 함수를 사용하여 y축은 hwy, x축은 class로 설정하고, fill은 class로 지정합니다.
데이터는 mpg를 사용합니다.

geom_boxplot() + : geom_boxplot 함수를 사용하여 상자그림을 추가합니다.
geom_jitter(alpha = .2, colour = "black", fill = "white") + :  geom_jitter 함수를 사용하여 산점도를 추가합니다. alpha는 점의 투명도, colour는 점의 테두리 색, fill은 점의 색을 설정합니다.


theme_minimal() +  : theme_minimal 함수를 사용하여 그래프의 테마를 간결한 스타일로 설정합니다.

theme(legend.position = "right") + : theme 함수를 사용하여 그래프의 추가적인 테마를 설정합니다. 여기서는 범례(legend)를 오른쪽에 위치시킵니다.

xlab("class") +
ylab("hwy") +

scale_fill_manual(values = c("111111", "2CCDDD", "#5C9AC  : scale_fill_manual 함수를 사용하여 class 변수에 따라 채우는 색을 수동으로 설정합니다.