22.4 점 추가 : points(x, y)

이번 절에서는 낮은 수준의 그래프 함수 네번째로 points(x, y) 함수를 이용하여 점을 추가하는 방법에 대하여 학습하겠습니다.

points() 함수의 일반적인 사용법은 다음과 같습니다.

points(x, y = NULL, type = "p", ...) 
구분 기능 설명
x,y x, y 좌표 벡터 (coordinate vectors of points to plot)
type = "p" 그래프 유형 = “점 그래프”
... 기호 모양(pch), 색깔(col), 크기(cex) 등의 그래프 모수 (parameters) 사용

MASS 패키지에 내장되어 있는 Cars93 데이터프레임의 차량 무게(Weight), 고속도로 연비 (MPG.highway), 차종 (Type) 변수를 사용해서 점을 추가하는 그래프를 실습해보겠습니다.

높은 수준의 그래프 함수 중에서 plot(x, y, type = 'p') 로 하면 점 그래프 (points plot)을 그릴 수 있습니다.

plot(x, y, type = 'p')산점도를 그리고, 그 위에 points(x, y) 함수로 점을 추가하는 예를 살펴 보겠습니다. 정확히 두 개 그래프가 일치합니다.

library(MASS)

##----------------------------------------- 
## 점 추가 : point(x, y) 
##----------------------------------------- 

# 고수준 함수 plot()을 이용하여 산점도 그리기
attach(Cars93) 
## The following object is masked _by_ .GlobalEnv:
## 
##     Cylinders
plot(Weight, MPG.highway, type = 'p')                     # 점 플롯입니다.

# 플롯 위에 낮은 수준의 함수 point() 를 이용하여 점을 추가합니다.
plot(Weight, MPG.highway, type = 'n')                     # 빈 플롯입니다.
points(Weight, MPG.highway)                               # 위의 플롯과 정확히 똑 같습니다.

detach(Cars93)

그러면 왜 굳이 points() 라는 낮은 수준의 함수를 가지고 점을 추가하려고 하는 것인지 의문이 들것입니다. 그 이유는 points() 함수를 가지고 필요에 따라서 순차적으로 점을 추가할 수 있고, 조건을 부여하고 그래프 모수 중에 색깔이나 기호 모양 등을 다르게 해서 탐색적 분석을 진행하는데 유용하기 때문입니다.

물론 plot(x, y, type = 'p')로 원하는 그래프를 그릴 수 있다면 points()함수를 사용할 필요는 없겠지요. 아래에 points()의 몇 가지 사용 형태를 보시고 필요한 상황에 맞게 골라 쓰면 되겠습니다.

아래에는 차종(Type)별로 기호 모양과 색깔을 달리하면서 무게(Weight)와 고속도로 연비(MPG.highway) 산점도를 그려보겠습니다. 2차원의 x, y 공간에 차종(Type)이라는 제3의 차원을 추가해서 볼 수 있는 매우 유용한 방법입니다.

대신 Base Graphics 에서는 조건의 갯수만큼 손이 참 많이 가는 단점이 있습니다 (참고로, ggplot2 plotting system을 사용하면 조건에 따른 색이나 기호를 달리하도록 지정하는게 한 줄이면 끝나고, 범례(legend)도 알아서 추가해주므로 편합니다).

library(MASS)
attach(Cars93) 
## The following object is masked _by_ .GlobalEnv:
## 
##     Cylinders
#  현재의 빈 플롯에 pch, col, cex 모수를 설정한 점을 추가합니다.
plot(Weight, MPG.highway, type = 'n')                          # 빈 플롯입니다.
points(Weight, MPG.highway, pch = 15, col = "blue", cex = 1.5)

detach(Cars93)

산점도의 점들을 조건에 따라 상이한 문자의 점으로 추가할 수도 있습니다.

library(MASS)
attach(Cars93)
## The following object is masked _by_ .GlobalEnv:
## 
##     Cylinders
# 조건에 따라 상이한 문자의 점을 추가합니다.
plot(Weight, MPG.highway, type = 'n')                      # 빈 플롯을 그립니다.

table(Cars93$Type) 
## 
## Compact   Large Midsize   Small  Sporty     Van 
##      16      11      22      21      14       9
# Type = Compact 인 경우
points(Weight[Type == "Compact"], MPG.highway[Type == "Compact"], pch = 0) 

# Type = Large 인 경우
points(Weight[Type == "Large"], MPG.highway[Type == "Large"], pch = 1) 

# Type = Midsize 인 경우
points(Weight[Type == "Midsize"], MPG.highway[Type == "Midsize"], pch = 17, col = "yellow") 

# Type = Small 인 경우
points(Weight[Type == "Small"], MPG.highway[Type == "Small"], pch = 3) 

# Type = Sporty 인 경우
points(Weight[Type == "Sporty"], MPG.highway[Type == "Sporty"], pch = 9) 

# Type = Van 인 경우
points(Weight[Type == "Van"], MPG.highway[Type == "Van"], pch = 15, col = "blue")
 
title("자동차 종류에 따라 상이한 문자의 점 추가") 
 
# 상단부 오른쪽에 범례를 추가합니다.
legend("topright",                                                     # 범례의 표시 위치입니다.
       c("Compact", "Large", "Midsize", "Small", "Sporty", "Van"),     # 범례로 출력될 문자열입니다.
       col = c("black", "black", "yellow", "black", "black", "blue"),  # 범례의 색깔입니다
       pch = c(0, 1, 17, 3, 9, 15)                                     # 표시될 기호 문자입니다.
)

detach(Cars93)