R에 도전하자... 따라가다 보면 나도 R유저2

2017 WINTER

교 육

심송용 | 한림대학교 금융정보통계학과 교수

R에 도전하자…
따라가다보면, 나도 R유저②


'R에 도전하자…따라가다보면, 나도R유저①' 주제는 2017년 여름호에 삽입

R에 도전하자 ①에서 R의 설치부터 시작하여 몇 가지 기능을 따라 해보고 R을 끝내는 과정을 보았다. 이번엔 R에서 설정할 수 있는 색깔에 대해서 알아보기로 하자.

1. 사용되는 몇 가지 함수의 소개

막대그래프

색깔의 출력을 확인하기 위해 막대그래프를 그려서 막대의 색을 바꾸는 방법으로 R의 색깔 설정을 확인하기로 하자. 막대그래프는 barplot함수를 사용하여 그리며 일반적인 사용법은
barplot(height, space = NULL, names.arg = NULL, col = NULL, axes = TRUE,...)
* height 막대의 높이를 저장한 벡터 또는 행렬
* space 막대 사이의 공간
* names.arg 막대그래프의 막대 이름 설정
* col 막대의 색깔 설정
* xlab, ylab x축, y축의 이름
* axes TRUE/FALSE로 설정하며 빈도수에 해당하는 축을 그릴지 설정한다.

rep 함수와 반복

rep 함수는 R 개체를 반복하여 생성하게 하는 함수로
rep(x, times, ...)로 사용하여 x를 time 만큼 반복하여 생성한다. 아래는 1을 다섯 번 반복 생성한다.
> rep(1,5)
[ 1 ] 1 1 1 1 1
:(콜론)으로 1씩 증가하기
:(콜론)은 m:n과 같이 사용하며 m, m+1, m+2, ..., n의 값을 얻는다. 일반적으로 m과 n은 정수를 사용하나 소숫점이 사용될 수도 있다.
> 0:10
[ 1 ] 0 1 2 3 4 5 6 7 8 9 10

등차수열과 seq 함수

등차수열을 만들 수 있는 함수로 seq 함수가 있으며 이 함수는
seq(from = 1, to = 1, by, length.out, ...)로 사용하여 from부터 to까지 by만큼 증가하는 수열을 생성한다. by 대신에 length를 설정하면 from부터 to까지의 length의 수 만큼의 등간격의 숫자를 생성한다.
> seq(1,10,by=2)
[ 1 ] 1 3 5 7 9
> seq(1,10,length=10)
[ 1 ] 1 2 3 4 5 6 7 8 9 10

length 함수와 원소의 개수

벡터를 매개변수로 length 함수를 호출하면 원소의 개수를 얻는다. 아래는 x에 1부터 10까지의 자연수를 저장하고 length 함수를 호출한 결과이며 원소의 개수가 10이므로 10을 얻는다.
> x <- 1:10
> length(x)
[ 1 ] 10

as.character 함수

숫자 등을 문자열 형식으로 바꾸고자 할 때 사용하는 함수이다. 이 함수의 결과는 문자열이므로 산술연산에는 사용하지 못한다.
> x <- 1:10
> as.character(x)
[ 1 ] "1" "2" "3" "4" "5" "6" "7" "8" "9" "10"
> sum(as.character(x)) #숫자가 아니므로 합이 계산 안됨 → 에러

2. 색깔 설정의 방법

R에서 색깔 설정은 여러 가지 방법으로 할 수 있다. 다른 패키지를 추가하지 않고 R에 내장된 기본 함수만 사용하는 방법에 대해서 살펴보기로 하며, viridis RColorBrewer 등의 패키지를 사용하면 좀 더 확장된 방법으로 색을 정의할 수 있다.

색깔 번호로

R에서는 0부터 8 사이의 숫자로 색깔을 설정할 수 있으며 이 색깔은 0부터 8까지 순서대로 흰색(white), 검정, 빨강(red), 녹색(green), 파랑(blue), 시안(cyan), 마젠타(magenta), 노랑(yellow), 회색(grey 또는 gray)이다. 0번 흰색의 경우 엄밀하게는 흰색이 아니고 R 그래픽 설정에서 배경색(background color)이며 R 그래픽의 기본 설정이 배경색이 흰색이므로 대부분 흰색이 된다. 이 0부터 8번까지의 위의 아홉가지 색깔은 기본 파레트가 적용되었을 때의 색이며 R에서는 파레트 개념을 사용하여 색을 미리 정의할 수 있으며 파레트를 따로 정의하면 번호에 따른 색깔은 달라질 수 있다. 파레트는 이원고의 뒤 부분에서 소개하기로 한다.
> barplot(rep(1,9), space=0, axes=F, names.arg=as.character(0:8), col=0:8)

색깔 이름으로 설정하기

R 언어의 색은 색깔의 이름으로 설정할 수도 있다. 색깔의 이름은 반드시 큰 따옴표 또는 작은 따옴표를 사용하여 표현한다.
> barplot(rep(1,7), space=0, axes=F,
> col=c("red", "blue", "green", "cyan", "magenta", "yellow", "aquamarine"))

R에서 사용할 수 있는 색깔의 이름은 657개가 있으며 이 이름들은
> color()
명령으로 확인할 수 있다. 657개 중 앞의 10개와 끝의 10개의 이름은 다음과 같다.
> head(colors(), 10)
[ 1 ] "white" "aliceblue" "antiquewhite" "antiquewhite1" "antiquewhite2"
[ 6 ] "antiquewhite3" "antiquewhite4" "aquamarine" "aquamarine1" "aquamarine2"
> tail(colors(), 10)
[ 1 ] "wheat2" "wheat3" "wheat4" "whitesmoke" "yellow"
[ 6 ] "yellow1" "yellow2" "yellow3" "yellow4" "yellowgreen"

빛의 삼원색과 rgb 함수

빛의 삼원색은 빨강(red), 녹색(green), 파랑(blue)이며 보통 RGB라고 부른다. R에서 이 세 가지 원색의 농도를 설정 하여 색을 만들 수 있으며 이를 위해 rgb 함수를 사용한다. 이 함수는
rgb(red, green, blue, alpha, ...)

로 설정하며 red, green, blue에는 RGB의 농도를 설정한다. 예를 들어 rgb(1,0,0)은 red만 최고 농도이고 다른 색은 없으므로 빨강, rgb(1,1,1)은 모든 색을 최고 농도로 사용하므로 흰색, rgb(0,0,0)은 모든 빛을 사용하지 않으므로 검정색이 된다. 다음 그림은 RGB의 기본색과 이들 중 두 색이 100%씩 사용되었을 때의 색깔(Y=yellow, M=magenta, C=cyan)을 그려본 것이다. 세 가지 모두 최대의 농도를 사용하면 흰색(W=white)이다.
alpha에는 투명도(opacity; 엄밀하게는 불투명도)를 설정하며 1은 불투명, 0은 투명이다.

다음은 기본 배경색인 흰색에 대해서 빨강의 농도만 최대로 나머지는 두 색은 0으로 설정하고 alpha값을 0부터 1까지 0.1씩 증가한 경우의 색을 확인하였다.
> mycol0 <- rgb(1,0,0,seq(0,1,length=10))
> barplot(rep(1,10), space=0, axes=F, col=mycol0)

투명도는 이전 색이 일부분 나타나는 경우이므로 배경색이 다르면 다른 색이 나타난다. 다음은 배경색은 검정, 글자색은 흰색으로 변경한 경우 투명도 설정에 따른 색의 표현이다. 이번에는 배경색이 검정이므로 가장 오른쪽의 색을 제외하고 나머지의 색은 위와 같이 mycol0로 색을 설정함에도 배경이 흰색일 때와 다른 색이 나타난다.
> win.graph( )
> par(bg=”black”, fg=”white”)
> barplot(rep(1,10), space=0, axes=F, col=mycol0)

HTML 형식의 색깔 설정

Red, Green, Blue의 삼원색의 농도를 0-255사이의 16진수 (00-FF)의 값으로 원하는 색을 설정할 수도 있다. 이 색깔 설정은 여섯 개의 문자로 이루어지며 첫 두 문자는 빨강, 두 번째는 녹색, 세 번째는 파랑의 농도를 16진수로 표시한다. 예를 들어 빨간색의 경우 col="#FF0000"과 같이 설정한다. FF0000의 경우 빨간색은 FF(십진수 255), Green 및 Blue는 모두 0이므로 빨간색이다. 이와 같은 방법으로 설정할 경우 00FF00은 녹색(Green), 0000FF는 파랑(Blue), FFFFFF는 흰색, 000000는 검정색 등이다. 555555와 같이 이 삼원색의 모두 같은 값인 경우 회색(검정 및 흰색 포함)이 된다. 16진수이므로 반드시 #로 시작하고 큰 따옴표 또는 작은 따옴표를 사용하여야 한다. 예를 들어 아래는 히스토그램에서 FF00FF(=cyan) 색깔로 기둥을 그린 것이다. hist와 rnorm 함수는 R에 도전하자 ①에서 간단히 설명한 바 있다.
> hist(rnorm(100), col="#FF00FF")

색상, 명도, 채도와 hsv 함수

색깔을 설정하는 또다른 방법으로 색상(hue), 명도(value/brightness), 채도(saturation)를 설정하는 방법이 있다. 이 방법은 R에서 hsv 함수를 사용하여 설정한다. hsv 함수는
hsv(h = 1, s = 1, v = 1, alpha)
로 색상(h), 채도(s), 명도(v) 와 투명도를 0과 1사이의 값으로 설정한다. 색상을 0부터 1까지 등간격으로 설정한 결과는 다음과 같다.
> mycol1 <- hsv(seq(0,1, length=10), s=1, v=1, alpha=1)
> barplot(rep(1,10), space=0, axes=F, col=mycol1)

같은 색상에서 채도를 0.5로 낮추면 다음과 파스텔 계열의 색을 얻는다.
> mycol2 <- hsv(seq(0,1, length=10), s=0.5, v=1, alpha=1)
> barplot(rep(1,10), space=0, axes=F, col=mycol2)

밝기(value)를 0.5로 낮추면 어두운 색이 표현된다.
> mycol3 <- hsv(seq(0,1, length=10), s=1, v=0.5, alpha=1)
> barplot(rep(1,10), space=0, axes=F, col=mycol3)

HCL 색깔 모형

HSV 색깔모형에서 색의 종류에 따라 채도가 다르게 느껴진다는 점을 개선하기 위한 색깔 모형으로 HSV와 다른 형식의 색상(Hue), 채도(Chroma) 명도(Luminance)를 설정하는 색깔 모형이다. 이 모형은 R언어에서 hcl 함수로 사용할 수 있으며
hcl(h = 0, c = 35, l = 85, alpha, ...)
h는 색상을 설정하며 0부터 360사이의 값을 설정한다. 양 끝점 포함하며 원의 둘레의 각도라고 생각하면 된다. 0은 빨강, 120은 green, 240은 blue이다. 360은 다시 빨강이다.
c는 양숫값으로 설정할 수 있는데 최대로 설정할 수 있는 값이 정해져 있지 않다. 이 값이 클수록 채도가 높아진다. l은 0부터 100사이의 값을 양 끝점 포함하여 설정하며 밝기를 설정한다.
alpha는 투명도의 설정으로 0은 투명, 1은 불투명으로 0과 1사이의 실수로 설정한다.
다음은 hcl 함수에서 색상이 green이고(h=120) 밝기가 최대(l=100)일 때 채도의 값을 0부터 200까지 바꾸어 색을 얻어 본 결과이다.
> color.den <- seq(0, 200, length=11)
> barplot(rep(1,length(color.den)), space=0, axes=F, names.arg=as.character(color.den), col=hcl(120, color.den, 100))

무채색과 grey/gray 함수

회색(흰색,검정색 포함)을 grey 또는 gray 함수로 만들 수 있다. 이 함수는
gray(level, alpha = NULL) 또는 grey(level, alpha = NULL)
로 level은 0과 1사이의 숫자로 설정하며 0은 검정색, 1은 흰색이며 그 사이의 값은 회색이 된다. alpha는 투명도를 설정한다.
> par(fg="cyan")
> color.den <- seq(0,1, by=0.1)
> barplot(rep(1,length(color.den)), space=0, axes=F, names.arg=as.character(color.den), col=grey(color.den))

무채색(검정부터 흰색 사이의 회색)은 rgb 함수의 red, green, blue의 값을 모두 같게 하여 얻을 수도 있다.

특정 규칙의 색깔 함수

특정한 규칙을 가지는 색깔함수로 rainbow(무지개색), cm.colors(cyan에서 magenta 사이의 색 농도 변환), topo.colors(지도에서 바다와 육지의 깊이와 고도를 표시하는 색의 변화), heat.colors(열을 표시하는 색깔변화), terrain.colors(지도에서 육지의 고도를 표시하는 색의 변화) 함수가 있으며 이들은 자연수 n을 사용할 때 n개의 색을 해당 규칙에서 생성해준다. n외에 투명도 등의 매개변수를 추가로 설정할 수 있으므로 help 명령으로 확인해보기로 한다.
> barplot(rep(1,10), space=0, axes=F, col=rainbow(10))

> barplot(rep(1,10), space=0, axes=F, col=heat.colors(10))

> barplot(rep(1,10), space=0, axes=F, col=topo.colors(10))

> barplot(rep(1,10), space=0, axes=F, col=cm.colors(10))

> barplot(rep(1,10), space=0, axes=F, col=terrain.colors(10))

palette 함수를 사용한 색의 설정

R은 사용자가 색을 정의할 수 있도록 palette 함수를 제공한다. 이 함수를 사용하여 색을 정하면 이 후부터 사용자가 정한 색을 번호로 정할 수 있다. 따로 정하지 않으며 0부터 8까지 설정할 수 있음은 앞에서 확인하였다. 파레트를 다르게 정의하더라도 0번 색은 배경색(기본값: 흰색)이다.
다음은 palette 명령없이, 즉 기본 파레트를 사용한 경우의 색이다. 기본 파레트인 경우 색의 종류는 배경색 포함 9개인데 기둥은 12개이므로 10번째 기둥(아래의 9번)부터는 다시 1번 색깔부터 반복됨을 확인할 수 있다.
> barplot(rep(1,12), space=0, axes=F, names.arg=as.character(0:11), col=0:11)

이번엔 cm.colors 함수에 의한 11개의 색을 파레트로 설정해보자. 파레트 설정은
> palette(cm.colors(11))
로 하고, 앞에서와 똑 같은 명령을 실행할 때 얻어지는 색은 cm.colors의 색깔임을 알 수 있다. 아래의 경우 palette함수의 cm.colors에 11개의 색이 얻어지므로 1번 색깔부터 다시 시작하지 않는다.
> barplot(rep(1,12), space=0, axes=F, names=as.character(0:11), col=0:11)

현재의 파레트의 색깔 번호별 색깔을 확인하려면 매개변수 없이 palette 함수를 호출한다. 위의 cm.colors를 사용한 palette 함수가 유효한 상태에서 palette 함수를 호출하면
> palette( )
[ 1 ] "#80FFFF" "#99FFFF" "#B3FFFF" "#CCFFFF" "#E6FFFF" "white" "#FFE6FF"
[ 8 ] "#FFCCFF" "#FFB3FF" "#FF99FF" "#FF80FF"
로 11개 색의 16진수 값을 얻을 수 있다.
 
palette 명령은 한 번 설정하면 다른 palette 명령이 나올 때까지 계속 유효하다. 파레트를 R의 기본 파레트로 바꾸려면 다음과 같이 매개변수에 "default"를 사용한다.
> palette("default")