그래프를 보는 사람이 직관적으로 그래프를 이해하기 위하여 표준적인 제목, 축라벨, 눈금, 범례 이외에도 개별적인 텍스트나 도형, 표 등을 추가할 수 있다. 이번 장에서는 그래프에 주석을 넣는 방법을 배운다.
이번 장에서 사용할 그래프를 그린다. mtcars데이타를 사용해 자동차의 중량(wt)과 연비(mpg)와의 관계를 그래프로 나타내본다. 먼저 사용할 데이타에 mtcars를 입력하고(1) x축변수에 wt를(2) y축변수에 mpg를 할당하고(3) geomatry options중 point를 선택하면 점그래프를 그릴 수 있다(4).
각 점에 해당하는 자동차의 이름을 표시하고 싶을 때는 geom_text()를 이용하면 된다. geometry options 중 text를 클릭하고(1) label에 rownames(mtcars)를 설정한 후(2) hjust에 -0.1을 설정한다(3).
그래프에 텍스트로 된 주석을 넣고 싶다. annotate()함수는 주석을 넣는 함수로 “text”이외에도 “rect”,“segment”,“pointrange”등을 주석으로 넣을 수 있다. 먼저 “1974 Motor Trend” 라는 잡지 이름을 주석으로 넣으려면 annotate체크박스를 선택하고(1) 주석을 넣을 좌표 x=4,y=32를 입력해 주고(2,3) label에 “1974 Motor Trend”를 입력한다(4). 여기서는 주석의 글씨체를 “Times”로(5), 폰트의 모양은 “italic”으로 설정하고(6) 주석의 색깔은 “blue”로(7) 크기는 7로 설정했다(8).
모든 점의 라벨을 표시하는 대신 일부만 강조하기 위해 일부의 점만 점의 색깔을 빨간색으로 표시하고 라벨을 붙이고 싶다. 예를 들어 Toyota Corolla와 Merc 240D만 라벨을 붙이고 싶으면 어떻게 해야 할까? 먼저 전처리를 통해 name이라는 열을 만들어 자동차의 이름을 저장하고(1) selected라는 열을 만들어 두개의 자동차는 1, 나머지는 0으로 만든다(2). 또한 편의를 위해 selected가 1인 두개의 데이타만 따로 selected라는 데이타 프레임으로 저장한다(3).
mtcars$name=rownames(mtcars) #(1)
mtcars$selected=ifelse(mtcars$name %in% c("Toyota Corolla","Merc 240D"),1,0) #(2)
selected=mtcars[mtcars$selected==1,] #(3)
selected
mpg cyl disp hp drat wt qsec vs am gear carb
Merc 240D 24.4 4 146.7 62 3.69 3.190 20.0 1 0 4 2
Toyota Corolla 33.9 4 71.1 65 4.22 1.835 19.9 1 1 4 1
name selected
Merc 240D Merc 240D 1
Toyota Corolla Toyota Corolla 1
위의 전처리 내용 중 (2)의 %in% 연산자는 include 연산자로 A %in% B 했을때 A가 B중에 포함 되어 있을 경우 TRUE가 반환되고 포함되지 않을때는 FALSE가 된다. ifelse(식,C,D) 연산자는 식이 참일때 C,식이 거짓일때 D가 반환된다. 위의 내용을 데이타 전처리하기에 입력하고(1) 데이타 전처리하기를 선택한다(2).
변수/옵션 초기화 버튼을 눌러 초기화 한다. x축변수에 wt를(1) y축변수에 mpg를 할당하고(2) geomatry options중 point를 선택하면 점그래프를 그릴 수 있다(3). 색깔이 자동으로 정해지는데 이를 수동으로 바꾸려면 연속형변수색깔 바꾸기에 “black”,“red”를 입력하고(5) color에 적용을 누른다(6). 범례를 없애기 위해 범례위치를 “none”으로 바꾼다(7). 우리가 원하는 두개의 점만 빨간색으로 나타났다.
두개의 점에만 라벨을 붙이기 위해 geometry options중 “text”를 선택한 후 “data”에 “selected”를 할당하고 “label”에 “name”을 할당한 후 hjust에 -0.1을 설정한다.
이번에는 주석으로 사각형을 추가해보자. 사각형을 만들기 위해 annotate에서 geom 을 “rect”로 설정한다(1). rect을 만들기 위해 xmin, xmax, ymin, ymax 등 좌표 네 개를 입력한 후(2) 투명도 alpha를 0.2로 설정한다(3).
주석으로 선분(segment)를 추가할 수도 있다. 선분을 만들기 위해 annotate에서 geom 을 “segment”로 설정한다(1). rect을 만들기 위해 xmin, xmax, ymin, ymax 등 좌표 네 개를 입력한 후(2) 색깔 color를 “blue”로 설정하고 투명도 alpha를 1로 설정한다(4).
선분을 없애고 회귀직선을 넣어보자. geometry options 중 annotate는 선택해제하고 smooth를 선택하여(1) 회귀곡선을 그린다. 디폴트로 비선형회귀인 “loess”가 선택되어 있으므로 “lm”으로 바꾼다(2).
회귀선은 ggplot2의 geom_smooth()를 이용하여 쉽게 그렸으나 회귀식을 구하는 것은 다시 회귀분석을 해야 한다. 위의 경우 회귀식은 다음과 같이 구할수 있다.
fit=lm(mpg~wt,data=mtcars)
summary(fit)
Call:
lm(formula = mpg ~ wt, data = mtcars)
Residuals:
Min 1Q Median 3Q Max
-4.5432 -2.3647 -0.1252 1.4096 6.8727
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 37.2851 1.8776 19.858 < 2e-16 ***
wt -5.3445 0.5591 -9.559 1.29e-10 ***
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Residual standard error: 3.046 on 30 degrees of freedom
Multiple R-squared: 0.7528, Adjusted R-squared: 0.7446
F-statistic: 91.38 on 1 and 30 DF, p-value: 1.294e-10
fit$coeff
(Intercept) wt
37.285126 -5.344472
위의 결과로 단순회귀분석의 결과를 알 수 있는데 회귀 직선의 y절편은 37.2851이고 기울기는 -5.3445임을 알 수 있다. y 절편은 fit$coeff[1]로 구할 수 있고 기울기는 fit$coeff[2]로 구할 수 있다. 또한 p값은 summary(fit)$coeff[2,4]로 알 수 있다. a라는 소수를 소숫점 아래 1자리에서 반올림하려면 round(a,1)과 같이 구할 수 있다. 회귀공식을 그래프에 표시하기 위해 y = ax + b 와 같은 회귀공식을 만들려면 위와 같은 과정을 일일이 입력해야 하므로 번거로우므로 이를 자동화해줄 수 있는 lm2equation이라는 함수를 하나 만들었다. 이 함수의 내용은 다음과 같다.
lm2equation=function(mydata,xvar,yvar,parse=FALSE){
fit=eval(parse(text=paste0("lm(",yvar,"~",xvar,",data=",mydata,")")))
intercept=round(coef(fit)[1],1)
slope=round(coef(fit)[2],1)
if(parse) equation=paste0("y==",slope,"*x",ifelse(intercept>=0,'+','-'),abs(intercept))
else equation=paste0("y = ",slope,"x",ifelse(intercept>=0,' + ',' - '),abs(intercept))
p=round(summary(fit)$coeff[2,4],3)
if(p==0) equation=paste(equation,"(p < 0.001)")
else equation=paste(equation,"(p =",p,")")
equation
}
이 함수의 내용을 다 이해하지 못해도 실망할 필요는 없다. 이 함수를 사용하는 방법은 다음과 같다.
lm2equation("mtcars","wt","mpg")
[1] "y = -5.3x + 37.3 (p < 0.001)"
웹 R에서는 이 함수를 이용해 단순회귀분석을 회귀식과 p값을 텍스트로 만들어 준다.
회귀식추가버튼만 누르면(1) 회귀식이 label에 입력된다. label을 출력할 위치를 x좌표와 y좌표로 입력하고(2,3) 글씨 크기를 7로 키우고(4) 폰트를 Times체로(5) face를 italic으로 바꾸어준다(6).
R 명령어를 써서 이 그래프를 그리기 위해서는 다음 명령어를 사용하면 된다.
require(ggplot2)
mtcars$name=rownames(mtcars)
mtcars$selected=ifelse(mtcars$name %in% c("Toyota Corolla","Merc 240D"),1,0)
selected=mtcars[mtcars$selected==1,]
mylabel=lm2equation("mtcars","wt","mpg")
ggplot(mtcars,aes(x=wt,y=mpg,colour=selected))+
geom_text(data=selected,aes(label=name),hjust=-0.1)+
geom_smooth(method=lm)+
geom_point()+
annotate(geom='text',x=4,y=30,size=7,label=mylabel,family='Times',fontface='italic')+
scale_colour_gradientn(colours=c("black","red"))+
theme(legend.position='none')