본문 바로가기
R/R시각화

ggplot 산점도 완전 정복

by 슬통이 2021. 1. 6.
반응형

이 포스팅은 다음 유튜브 산점도 그리기로 배우는 ggplot2 완전 정복 튜토리얼 내용을 요약한 포스팅입니다.

ggplot2 패키지를 이용한 산점도 그리기

오늘은 ggplot2 패키지를 사용해 산점도를 그리는 방법에 대하여 정리해본다. 숙제를 하거나, 논문을 쓸 때, 가장 많이 그리는 그래프이기도 하며, 매번 ggplot 쓰면서 까먹고 찾아보던 것을 정리해보았다.

데이터 불러오기 및 highlow 칼럼 생성

우리가 예제로 사용할 데이터를 불러오자. 다음의 데이터를 다운 받아 R코드가 있는 폴더에 넣어놓자.

examscore2.csv
0.00MB

mydata <- read.csv("examscore2.csv", header = TRUE)

# highlow 칼럼 생성
mydata$highlow <- 
    ifelse(mydata$midterm + mydata$final < 150, "low", "high")

# 데이터 확인
dim(mydata)
## [1] 30  5
head(mydata)
##   student_id gender midterm final highlow
## 1          1      M      62    63     low
## 2          2      F      60    53     low
## 3          3      M      60    62     low
## 4          4      M      30    26     low
## 5          5      F      80    91    high
## 6          6      F      33    29     low

데이터 로드

ggplot2 패키지를 로드하고, 데이터를 플랏에 로드한다. 테마는 가장 깔끔한 bw로 설정함.

library(ggplot2)

    # 데이터 로드
p <- ggplot(data = mydata) + 
    # 그래프 테마 선택
    theme_bw()
p

산점도 정보 입력

산점도 레이어를 입력한다. x축과 y축에 사용될 정보를 입력한다.

p <- p + 
    # 산점도 정보 입력
    geom_point(aes(x = midterm, y = final))
p   

제목 입력

그래프에 사용되는 제목들을 입력할 때에는 다음과 같이 labs 함수를 이용한다.

p <- p + labs(title = "학생들 성적 분포도", 
     subtitle = "중간 vs. 기말 성적",
     x = "중간고사", y = "기말고사",
     caption = "https://statisticsplaybook.tistory.com/18")
p

속성 (aesthetic) 입력

ggplot을 처음 접할 때 가장 이해하기 힘든 것이 aesthetic 인 것 같다. 그래프의 속성을 데이터와 이어주는 요소들을 aesthetic이라고 정의하고, aes() 함수를 사용하여 접근한다고 생각하자.

p <- p + 
    aes(
      # 성별 색깔 다르게
      color = gender, 
      # 사이즈 처음 15개 1, 나머지 5
      size  = rep(c(2.5, 5), each = 15), 
      # 성별 모양 다르게
      shape = gender, 
      # 전체 투명도 0.8
      alpha = 0.8)
p

색상 설정 (수동)

# 수동 색상 설정
p + scale_color_manual(
        values = c("red", "blue"),
        labels = c("여자","남자")
    )

색상 설정 (팔레트 이용)

# 팔레트 통한 색상 설정    
# BrBG, PiYG, PRGn, PuOr, RdBu, RdGy, RdYlBu, RdYlGn, Spectral
# Accent, Dark2, Paired, Pastel1, Pastel2, Set1, Set2, Set3
p <- p + 
    scale_color_brewer(palette = "Set1",
                       labels = c("여자", "남자")) +
    scale_shape_discrete(labels = c("상위권", "하위권"))
p

속성 확정하기

# 속성 finalization
p <- p + 
    scale_alpha_identity() +
    scale_size_identity()
p

범례 설정

# 범례(legend) 설정
mygender <- guide_legend(title = "성별",
             ncol = 2, reverse = TRUE, order = 1)
myhighlow <- guide_legend(title = "성적별",
             ncol = 2, order = 2)
p <- p + 
  # color, shape 속성에 똑같이 적용
  guides(color = mygender,
         shape = myhighlow) +
  # 범례 위치 변경
  theme(legend.position = "bottom",
        )
p

축 단위 변경하기

# 축 설정
p <- p + 
    scale_x_continuous(
        limits = c(10, 105),
        breaks = 1:5 * 20,
        labels = paste0(1:5 * 20, "점")) +
    scale_y_continuous(
        limits = c(10, 105),
        breaks = 1:5 * 20,
        labels = paste0(1:5 * 20, "점"))
p

그래프에 글자 넣기

# 글자 쓰기
p <- p + annotate("text",
                  x = 80, y = 10,
                  label = "© 2020 Issac Lee",
                  alpha = 0.5)
p

데이터 설명 추가하기

library(ggrepel)
mypoints <- mydata[mydata$midterm>80,]

p <- p + 
  geom_label_repel(
    data = mypoints,
    aes(x = midterm,
        y = final,
        label = paste("(",midterm, ", ",final,")")),
    color = "black",
    size = 2)
p

비율 조정

# 비율 조정
p <- p + coord_fixed()
p

완성된 산점도의 모습

 

반응형

댓글