Lovetoken

저는 개발 취향을 가진 데이터 분석가 Jr. 입니다.

Navigation
 » Home
 » About Me
 » Github

R에서 기본 내장 graphics package를 이용한 데이터 시각화

16 Jun 2017 » R, Data_Visualization



본 글은 R에서 기본 내장 graphics package에 대표격인 plot() 함수의 기초를 설명해보고자 한다.



plot() 함수

x 와 y 의 2개 축을 기준으로 좌표를 찍는 컨셉을 가진 함수이다.
가장 대표적으로 산점도를 표현할 때 간단하게 구현이 가능한 함수로 소개되나,
범용적으로 사용이 가능한 제너릭 함수 (generic function) 이기 때문에
입력되는 데이터의 타입과 클래스에 따라 성격에 맞게 다양한 모습으로 데이터 시각화 결과물이 출력된다.


좌표 찍기

plot(2, 1)

plot() 함수는 x, y 인자 2개를 기본적으로 받는다.
위의 코드를 실행하면 (2, 1)이라는 좌표 한곳에 점을 찍는 모습을 볼 수 있다.
이러한 특성을 잘 이용하면 복수개의 좌표에 점을 찍을 수 있다.

plot(c(1, 2), c(1, 5))

2개의 점이 찍히는데 각각 (1,1), (2,5) 좌표에 찍히는 것을 볼 수 있다.

이런 좌표 찍기 특성을 이용하여 자신이 가지고 있는 데이터셋을 plot() 함수의 x, y 인자에게 넘김으로써 산점도를 표현할 수 있다.

names(cars)
## [1] "speed" "dist"
plot(cars$speed, cars$dist)

built-in 객체 cars에서 차의 속도 정보를 담은 벡터 cars$speed 가 x축으로,
주행거리 정보를 담은 벡터 cars$dist 가 y축으로 입력됨으로써
차량의 속도와 거리 간의 관계를 대략적으로 살펴볼 수 있는 산점도를 보여주는 예제이다.1

참고로 위의 코드 plot(cars$speed, cars$dist) 는 아래의 코드를 실행하는 것과 같다.

plot(dist ~ speed, data = cars)


type 인자

위의 좌표 찍기 두번째 예시인

plot(c(1, 2), c(1, 5))

에서 두 좌표 간 직선을 그리고 싶다면 type 인자를 조정해보면 된다.

plot(c(1, 2), c(1, 5), type = "l")

“line”을 의미할 것 같은 “l” 문자를 type 인자로 넘겨주면 두 좌표가 연결된 선을 그린다.
type 는 그림을 어떻게 그릴 것인지 묻는 인자로써, 이 인자값을 입력하지 않으면 기본적으로 “point”의 의미인 “p” 가 대부분 설정된다.

type 인자가 받을 수 있는 값들은 아래와 같다.

  • type = "p" : 점으로
  • type = "l" : 선으로
  • type = "b" : 점과 선 둘 다 동시에
  • type = "o" : 점과 선 둘 다 동시에 (단 겹쳐짐 : over plotted)
  • type = "h" : 히스토그램과 비슷한 형태로 (histogram)
  • type = "s" : 계단모양으로 (stair steps)
  • type = "S" : 계단모양으로 (upper stair steps)
  • type = "n" : 좌표찍지 않음

type = n인 경우는 특이하게 plot의 토대인 축은 표현되나, 좌표가 찍히지 않음으로써
마치 그림을 그리기 이전 스케치북을 펼치는 것과 같다고 볼 수 있다.

plot(c(1, 2), c(1, 5), type = "n")


이외의 다양한 인자들

plot() 함수는 그래픽스 파라미터 par를 상속받게 되어 다양한 인자들을 사용할 수 있는데, 이 특성을 잘 살리면 더 세부적인 조정이 가능하다.

그래픽스 파라미터 (Graphical Parameters)의 자세한 내용과 사용 가능 인자가 무엇이 있는지 알고 싶다면

?par

를 실행시켜 도움말을 볼 수 있다.
cex, fg, lty, pch 등의 인자만 살펴보자

만약 plotting 결과물에서 좌표 포인트의 크기를 조정하고 싶다면 cex 인자값을 조정한다.

plot(dist ~ speed, data = cars, cex = 2) # 디폴트로 cex=1 임, 즉 2배 크게

plot(dist ~ speed, data = cars, cex = .5) # 2배 작게

축의 색깔을 바꾸고 싶다면 전경색을 조절할 수 있는 fg 인자값을 조정한다.

plot(dist ~ speed, data = cars, fg = "blue")

만약 line type의 그림을 그렸다면 선의 성격을 lty 인자를 통해 바꿀 수 있다.

plot(c(1, 2), c(1, 5), type = "l") # lty 를 언급하지 않았을 때

plot(c(1, 2), c(1, 5), type = "l", lty="dashed")

만약 point type의 그림을 그렸다면 점의 모양을 pch 인자를 통해 바꿀 수도 있다.

plot(dist ~ speed, data = cars) # pch 를 언급하지 않았을 때

plot(dist ~ speed, data = cars, pch = 3)

plot(dist ~ speed, data = cars, pch = 25) # 1 ~ 25개의 모양이 준비되어 있음


좌표 찍기의 특성을 어기는, 아니 똑똑한 제너릭 함수

지금까지 보았듯이 plot()은 좌표 찍기의 컨셉을 이용하여 데이터시각화 결과물을 출력한다.
하지만 좌표 찍기에 적합하지 않은 클래스의 데이터가 입력되면 그에 알맞게 좌표 찍기의 컨셉을 버리고 다른 형태로 출력한다.

아래 코드를 보면

fit <- lm(dist ~ speed, data = cars)
plot(fit)

위의 코드는 cars 를 대상으로 단순회귀적합을 한 lm class의 fit 객체를 plot() 함수에 입력한 결과인데 뭔가 많다.
분명 산점도이긴 산점도인데 더 복잡하고 어떠한 선분과 겹쳐져 그려진 4개의 패널로 구분된 시각화 결과물이 출력된다.
이는 회귀 적합 이후 모형진단 시 자주 사용하는 데이터 시각화 결과물을 plot() 함수가 자동으로 알아서 모두 출력해준 것이다.
산점도 뿐만 아니라 완전히 성격이 바뀐 결과물을 출력하기도 한다.

library(data.tree)
data(acme, package = "data.tree")
plot(acme)

data.tree 라는 패키지가 있는데,
이 패키지에 포함되어 있는 acme 데이터셋은 class 가 data.tree 로써 특이한 구조를 가지고 있는 데이터셋 이다.
이를 plot() 함수에 입력하여 plotting 하면 우리가 기존에 알고 있던 방식의 결과물이 나오지 않고 색다른 결과물이 나온다.
이러한 이유는 plot() 이란 함수는 입력되는 데이터의 class에 알맞게 최적으로 표현해줄 수 있는 방법의 코드로 실행되기 때문이다.
그리고 이러한 특징을 가진 함수는 R에서 generic function이라고 부른다.
generic function은 사용자가 함수에 대한 문법을 정확하게 지키지 않더라도 최대한 사용자가 기대할 것 같은 결과물을 내보내기 위함이다.
이러한 R 시스템은 사용자 편의를 올릴 수 있게 해준다.


  1. R을 공부하다 보면 눈에 자주 띄는 대표적인 그림이기도 하다↩︎