R을 이용한 데이터시각화

plot() 함수

A) plot() 함수

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

A-1) 좌표찍기

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)

빌트인 객체 cars 에서 speed 정보를 담은 벡터 cars$speed 가 x축으로,
cars 에서 dist 정보를 담은 벡터 cars$dist 가 y축으로 입력됨으로써
차량의 속도와 거리간의 관계를 대략적으로 살펴볼 수 있는 산점도를 볼 수 있게 됩니다.

참고로 위의 코드 plot(cars$speed, cars$dist) 는 아래의 코드를 실행하는것과 논리가 동일합니다.

plot(dist ~ speed, data=cars)

A-2) 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 인자가 받을 수 있는 값들은 아래와 같습니다.

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

type = n 인 경우는 특이하게 plot 의 토대인 축은 표현되나, 좌표가 찍히지 않음으로써
마치 그림을 그리기 이전 스케치북을 펼치는 행위와 같은 준비를 할 수 있게 해줍니다.

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

A-3) 이외의 다양한 인자들

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개의 모양이 준비되어 있음

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

지금까지 보았듯이 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 은 사용자가 함수에 대한 문법을 정확하게 지키지 않더라도 최대한 사용자가 기대할 것 같은 결과물을 내보내기 위한 다양한 선택지를 제공해 줍니다.
따라서 사용자 편의를 올릴 수 있게 해줍니다.


댓글

댓글 본문
  1. Sansol Park
    안녕하세요! 그래프를 그렸을 때 가장 큰 `y` 값에 대응하는 `x` 값을 구하고 싶다면, `R`에서 다음과 같은 방법을 사용할 수 있습니다.

    ### 예시 데이터
    먼저 예시 데이터를 생성하겠습니다.

    ```r
    # 예시 데이터
    x <- c(1, 2, 3, 4, 5)
    y <- c(10, 20, 15, 30, 25)
    ```

    ### 최대 `y` 값에 대응하는 `x` 값 구하기

    1. **최대 `y` 값 구하기**:
    `y` 값 중에서 가장 큰 값을 구합니다.

    ```r
    max_y <- max(y)
    print(max_y) # 30
    ```

    2. **최대 `y` 값의 인덱스 찾기**:
    `which.max()` 함수를 사용하여 최대 `y` 값이 위치한 인덱스를 찾습니다.

    ```r
    max_index <- which.max(y)
    print(max_index) # 4
    ```

    3. **해당 인덱스의 `x` 값 구하기**:
    위에서 찾은 인덱스를 사용하여 `x` 값을 구합니다.

    ```r
    corresponding_x <- x[max_index]
    print(corresponding_x) # 4
    ```

    ### 전체 코드

    위의 내용을 하나로 합친 코드입니다.

    ```r
    x <- c(1, 2, 3, 4, 5)
    y <- c(10, 20, 15, 30, 25)

    max_y <- max(y)
    max_index <- which.max(y)
    corresponding_x <- x[max_index]

    cat("가장 큰 y 값은", max_y, "이고, 이 값에 대응하는 x 값은", corresponding_x, "입니다.")
    ```

    ### 결과
    이 코드를 실행하면 다음과 같은 결과가 출력됩니다:

    ```
    가장 큰 y 값은 30이고, 이 값에 대응하는 x 값은 4입니다.
    ```

    이 방법을 사용하면 그래프에서 가장 큰 `y` 값에 대응하는 `x` 값을 손쉽게 구할 수 있습니다. 다른 데이터나 상황에도 동일하게 적용할 수 있습니다.
    대화보기
    • mango
      안녕하세요? 함수를 이용해서 그래프를 그렸는데, 가장 큰 y 값에 대응하는 x 값을 구하고 싶을 때는 어떻게 해야 하나요?
    • 지나가는 나그네
      xlim(c(1,10)) 이런 식으로 쓰시면 됩니다.
      대화보기
      • yujoo oh
        안녕하세요 게시글 보다가 궁금한 점이 생겨서 여쭤봅니다.
        그래프를 이미지로 저장할때 그래프 내부영역이라고 그 point로 값들이 찍히는
        그 영역 크기가 커서 y축이 짤려서 저장이 되는데 혹시 그 영역크기를 설정하는 방법도 알고 계신가요?
      • Daehyeop Ko
        감사합니다. 잘 배우고 갑니다.
      버전 관리
      lovetoken
      현재 버전
      선택 버전
      graphittie 자세히 보기