본문으로 바로가기



R을 이용하여 쿨(Cool)한 그래프 - 2. 배경색지정 및 수학기호로 제목달기

category R Programming/Graphics 2017.05.24 00:49

지난 포스팅에서 우리는 주어진 x벡터와 y벡터를 가지고 그래프를 그리는 방법에 대하여 알아봤다. 포인트를 선으로 바꾸는 방법과 보여지는 축의 범위를 조정하고 x, y축을 표시하여 아래와 같은 그래프를 얻을 수 있었다.

지금도 충분히 처음 plot()을 사용했을 때보다 그럴싸 해보이지만, 아직 몇 가지 할 일이 남았다. 먼저 그래프 제목과 x, y 축의 제목을 달아보도록 하자.

이것을 위해서는 다음과 같이 plot() 함수의 main, xlab, 그리고 ylab 항목을 알맞게 설정하면 된다.

x <- seq(-10, 10, length.out = 100)
y <- x^2
plot(x,y,
     main = "y = x^2 그래프",     # 제목 설정
     xlab = "x 축",               # x 축 제목
     ylab = "y 축",               # y 축 제목
     xlim = c(-2,2),              # x 축 범위 설정
     ylim = c(0,4),               # y 축 범위 설정
     type = 'l',                  # 라인 타입 '라인'으로 설정
     col = "Blue"                 # 색 설정
     )

# 참조선 넣기
abline(h = 0:4, v = -2:2, col = "Gray", lty=3)
abline( v = 0, lty = 1)           # adding y axis
abline( h = 0, lty = 1)           # adding x axis

위의 코드에서 알 수 있듯, main 항목에 “”를 사용하여 문자열을 넣어주면 그것이 그래프에 반영된다. 하지만 한가지 문제점은 우리는 수학기호 \(y=x^2\)가 보여지는 것을 원했으나 결과값은 “x^2” 과 같이 쿨하지 못하게 나온것을 확인할 수 있다. 이 부분은 expression() 함수를 이용하여 다음과 같이 바꿔줄 수 있다. 위 코드의 main항목을 다음과 같이 바꿔보자.

plot(...
     main = expression(paste(y, " = ", x^2, " 그래프")),
     ...
     )

아래와 같이 제목이 예쁘게 출력되는 것을 확인 할 수 있다. 위의 코드에서 paste() 함수가 쓰였는데, 이 함수는 의미 그대로 여러개의 문자열을 하나로 합쳐주는 함수이다. 이 함수에 대해서는 추후 문자열 다루기 포스팅에서 자세히 설명할 예정이므로 간단한 예제를 통하여 개념만 알고 넘어가도록 하자. 다음의 R 코드는 “치킨”, " 맥주“, 두 개의 문자열을 하나로 합쳐주는 코드이다.

paste("치킨", "맥주")
## [1] "치킨 맥주"

우리가 좋아하는 치맥이 반환되었다.

제목과 축 제목까지 첨가된 그래프가 이제 제법 쿨(Cool)해 보인다. 하지만 어딘지 모르게 칙칙한 느낌이 든다. 흰색과 검정색 뿐인 이 칙칙함에서 벗어나기 위해 색깔을 넣어 보도록 하자. 이제부터 설명할 내용은 배경색을 넣는 방법을 설명할 것인데, 조금 어렵게 느껴지는 독자도 있을 것이라 생각한다. 하지만 차근차근 설명을 따라가면 충분히 이해할 수 있을 것이므로 걱정하지 말자.

시작하기에 앞서 이번 포스팅의 마지막에 어떤 그래프를 얻게 될 지 미리 결과를 보여주도록 하겠다. 예쁜 그래프를 보면 조금이라도 동기부여가 될 것이다.

형형색색의 그래프를 보고 있자니 코드 공부를 하고 싶은 욕망이 생겨난다. 다음은 위의 그래프를 만들기 위한 코드이다.

par(bg = "light cyan")  # set the color of pallet

# Generate empty plot
plot(c(-2,2),c(0,4),    # just two points
     main = expression(paste("Plot of ", y, " = ", x^2)),
     xlab = "x axis",
     ylab = "y axis",
     xlim = c(-2,2),
     ylim = c(0,4),
     type = 'n',        # line type is null!
     col = "Blue")

# Draw gray rectangle
loc <- par("usr")
rect(loc[1], loc[3], loc[2], loc[4],
     col = "lemonchiffon")

# Draw a red line
points(x,y, type = 'l', col = "Red")

# Setting reference lines
abline(h = 0:4, v = -2:2, col = "black", lty=3)
abline( v = 0, lty = 1)
abline( h = 0, lty = 1)

시작부터 처음보는 par()라는 명령어가 보인다.

우리가 처음으로 이해해야 할 개념이 바로 이 명령어와 관련된 개념인 ‘팔렛트’ 개념이다. 이제까지 우리가 팔렛트의 개념을 이야기 하지 않은 이유는 그래프를 한 개만 그리면 되었기 때문이다. 여러 개의 그래프를 그리기 위해서 팔렛트를 조정해주는 작업이 필요한데 이것은 다음 시간에 설명하도록 하겠다. 지금은 이 팔렛트가 무엇인지만 이해하고 넘어가도록 하자.

’팔렛트’는 말 그대로 그래프를 그리기 위한 가상의 스케치북(혹은 나무판자)이라고 생각하면 쉽다. 이것을 이해하기 위해서 다음과 같은 명령어를 사용하여 스케치북 색깔을 노란색으로 바꿔보자.

par(bg = "Yellow")

이 명령어 만을 입력하면 아무것도 일어나지 않는 것처럼 보이지만 그 이유는 아직 우리가 아무것도 그리지 않았기 때문이다. 추가적으로 명령어 plot(c(0,1),c(0,1), type = ‘n’)를 입력하여 보자.

par(bg = "Yellow")
plot(c(0,1),c(0,1), type = 'n')

위와 같이, 노란색의 팔렛트를 확인 할 수 있다. 이전까지는 기본색인 흰색으로 설정되어 있었기 때문에 우리가 인지하지 못했던 것이다. 즉, R에서 그래프를 그릴때 그리기 전에 R은 가상의 스케치북을 준비하고 그 위에 그래프를 그리는 것이라고 생각하면 된다. plot(c(0,1),c(0,1), type = ‘n’) 명령어는 두 개의 점, (0,0)과 (1,1),을 그리되 표시하지는 말라는 의미이다. 실제 두 점을 확인하고 싶은 독자는 ’n’을 ’p’로 바꿔보면 양쪽 모서리에 찍힌 두 개의 점을 확인 할 수 있다.

그래프 배경색 변경은 rect() 함수를 사용하여 변경한다. 이 함수는 사각형(rectangle)을 원하는 위치에 그릴 수 있도록 해주는 함수이며 문법은 다음과 같다.

rect(xleft, ybottom, xright, ytop, density = NULL, angle = 45,
     col = NA, border = NULL, lty = par("lty"), lwd = par("lwd"),
     ...)

따라서, x축 0에서부터 1까지, y축 0에서부터 1까지 넓이 1의 사각형을 rect() 함수를 이용하여 그려보도록 하자.

par(bg = "Yellow")
plot(c(0,1),c(0,1))
loc <- par("usr")
rect(0,0,1,1, col = "blue")    #사각형 그리기

그래프에서 알 수 있듯, 배경색을 채우기 위해서는 우리가 그린 사각형보다 살짝 더 큰 사각형을 사용해야 하는 것을 알 수 있다. 하지만 정확한 좌표를 찾기가 어렵다는 것이 문제이다. 이 문제를 해결하기 위해 사용된 코드가 바로 par(“usr”) 부분인데 여기에 그래프의 실제 보이는 범위의 좌표가 저장되어 있다. 이 정보를 loc 변수에 저장 시켜 놓았으므로 실제 좌표를 확인해 보자.

loc
## [1] -0.04  1.04 -0.04  1.04

loc 변수의 값은 차례로 왼쪽 x값, 오른쪽 x값, 아래쪽 y값, 위쪽 y값을 의미한다. 숫자에서 알 수 있듯, 우리가 그린 사각다형의 각 끝점보다 그래프 사각형의 끝점이 0.04만큼의 크다.

이 사실을 이용하여 다음과 같이 그래프의 전체 영역에 딱 맞는 사각형을 그릴 수 있다.

par(bg = "light cyan")
plot(c(0,1),c(0,1))
loc <- par("usr")
rect(loc[1], loc[3], loc[2], loc[4],
     col = "lemonchiffon")

자, 이제 그려진 그래프 위에 우리가 그리고 싶은 점들을 추가하는 일만이 남았다. 이미 우리가 처음 함수를 셋팅하기 위하여 plot()를 사용하였기 때문에, 다시 한번 사용하지 못하는 관계로 다음과 같이 points() 함수를 이용하여 점 두 개를 추가해보자. (plot()을 사용하여 추가하면 그래프가 다시 리셋되어 이제까지 작업한 것들이 무용지물이 된다.)

par(bg = "light cyan")
plot(c(0,1),c(0,1))
loc <- par("usr")
rect(loc[1], loc[3], loc[2], loc[4],
     col = "lemonchiffon")
points(c(0,1),c(0,1), type = 'p', col = "Red")

예상대로 두 개의 빨간 점이 추가된 것을 확인할 수 있다. 이제까지의 학습한 내용을 바탕으로 설명하기 전에 보여주었던 R코드를 다시 한번 살펴보면 한줄 한줄 모두 이해할 수 있을 것이다.

par(bg = "light cyan")  # 팔레트 색깔 하늘색으로 설정

# Generate empty plot
plot(c(-2,2),c(0,4),    # 점 두개 생성
     main = expression(paste("Plot of ", y, " = ", x^2)),
     xlab = "x axis",   # x 축 제목
     ylab = "y axis",   # y 축 제목
     xlim = c(-2,2),    # x축 범위
     ylim = c(0,4),     # y축 범위
     type = 'n'         # '표시 안함'으로 설정
     )

# 배경 노란색으로 설정
loc <- par("usr")
rect(loc[1], loc[3], loc[2], loc[4],
     col = "lemonchiffon")

# 빨간선을 사용하여 데이터 표시
points(x,y, type = 'l', col = "Red")

# 참조선 작업(이전 포스팅 참조)
abline(h = 0:4, v = -2:2, col = "black", lty=3)
abline( v = 0, lty = 1)
abline( h = 0, lty = 1)


꽤 긴 포스팅이 되었다. 다음 포스팅에는 한 그래프에 여러 함수를 그리는 방법과 여러개의 그래프를 동시에 그리는 방법에 대하여 알아보겠다. 혹시 이해가 되지 않는 부분은 댓글로 남겨주기 바란다.


SHARE TO



티스토리 툴바