본문 바로가기
Data Science

2차원 밀도 시각화, contour 및 rater

by Jacey312 2023. 12. 31.

geom_contour()geom_raster() 함수는 ggplot2 패키지에서 제공되는 함수 중에서 2차원 밀도를 시각화하거나 히트맵을 그릴 때 사용되는 함수들입니다. 본 포스팅에서는 geom_contour() 함수와 geom_rater() 함수에 대해 각각 살펴보도록 하겠습니다.

 

geom_contour() 개요

geom_contour() 함수는 등고선(Contour)을 그릴 때 사용됩니다. 등고선 하면 떠오르는게 "산" 맞으신가요? 지리시간에 많이 봤던 기억이 나는데요, ggplot2 패키지에도 2차원 데이터의 등고선을 시각화하여 데이터의 밀도를 나타내는 등고선 함수가 있습니다.

 

등고선에 대해 모르시는 분이 있을수도 있으니 간략하게 집고 넘어가겠습니다. 등고선은 같은 값을 가진 데이터 포인트들을 연결한 선으로, 등고선이 가까울수록 해당 지점의 데이터가 더 밀집되어 있음을 나타냅니다. 이는 데이터의 분포와 밀도를 시각적으로 이해하는 데 도움이 됩니다. 

 

그럼 등고선을 그리기 적절한 데이터로 R의 기본 데이터셋 중 하나인 faithful 데이터셋을 활용해보도록 하겠습니다. faithful 데이터셋은 미국 예루살렘 국립공원 내 Old Faithful의 화산 폭발 정보를 담고 있고, eruptions(간격마다의 화산 폭발 지속 시간)과 waiting(현재 화산 폭발과 다은 화산 폭발 사이의 대기 시간) 변수를 포함하고 있습니다.

 

아래 코드는 이 두 변수를 geom_contour() 함수에 적용하여 Old Faithful의 화산 폭발 패턴을 살펴보는 코드로, "after_stat(level)" 은 등고선의 높이 수준에 따라 색상을 다르게 지정하라는 의미입니다. 그림에서와 같이 크게 2개의 폭발 패턴이 보입니다.

 

ggplot(faithful, aes(eruptions, waiting))+geom_contour(aes(z=density, after_stat(level)))

geom_contour() 함수 적용

 

geom_raster() 개요

 

geom_contour() 함수 외에도 등고선 유형의 데이터를 시각화하는 방법으로 geom_raster() 함수가 있습니다. geom_raster() 함수는 2차원 데이터를 히트맵(heatmap) 또는 러스터 플롯(raster plot)으로 시각화할 때 사용됩니다. 이 함수는 주로 연속형 변수를 가진 데이터의 밀도를 시각화하는 데 활용됩니다.

 

위에서 살펴본 faithful 데이터셋을 geom_contour() 함수 대신 geom_raster() 함수를 적용해보도록 하겠습니다. 이때 geom_raster() 함수의 인자로 fill을 density로 설정하여 높이 수준에 따라 색상을 다르게 지정하도록 하겠습니다.

 

아래 그림에서도 등고선 그림과 같이 크게 2개의 폭발 패턴이 보이는 것을 확인할 수 있습니다.

 

ggplot(faithful, aes(eruptions, waiting))+geom_raster(aes(fill=density))

geom_raster() 함수 적용

 

 

<추가> label 표시하기

faithful 데이터셋을 geom_raster() 함수나 geom_contour() 함수에 적용한 결과 크게 두 개의 패턴이 보이는 것을 확인할 수 있었습니다. 이 그림을 보는 사람들이 더욱 쉽게 이해할 수 있도록 하기 위해 geom_label() 함수를 추가로 사용해줄 수 있습니다. 이때 geom_lable() 함수는 배경(background)를 적용해주는 기능 말고는 geom_text() 함수와 동일한 역할을 합니다.

 

아래 코드에서는 geom_raster() 함수를 사용했던 코드에서 geom_label() 함수를 추가로 적용해주어 폭발의 중심으로 판단되는 위치에 "peak one", "peak two" 라는 라벨을 추가해주었습니다.

 

이렇게 라벨을 추가해주면 색상 변화 외에도 해당 부분의 의미를 텍스트로 전달해줄 수 있기 때문에 보다 정확한 정보 전달이 가능합니다.

# label 정의
label <- data.frame( waiting = c(55, 80), 
                     eruptions = c(2, 4.3), label = c("peak one", "peak two") )

# geom_label 추가
ggplot(faithful, aes(eruptions, waiting))+geom_raster(aes(fill=density))+
                                          geom_label(data=label, aes(label=label))

'Data Science' 카테고리의 다른 글

geom_freqpoly vs. geom_density  (0) 2024.01.01
범주형 변수 비중 분석, geom_mosaic()  (0) 2023.12.31
geom_histogram() 살펴보기  (0) 2023.12.30
geom_point() vs. geom_jitter()  (0) 2023.12.30
대표적인 범주형 plot, geom_bar()  (0) 2023.12.30