이 그래프를 그리는 방법은 아주 간단합니다. 즉, 데이타를 불러오면
library(UsingR)
## Loading required package: MASS
data(galton)
tail(galton)
## child parent
## 923 73.7 70.5
## 924 73.7 69.5
## 925 73.7 69.5
## 926 73.7 69.5
## 927 73.7 69.5
## 928 73.7 69.5
table(galton$child,galton$parent)
##
## 64 64.5 65.5 66.5 67.5 68.5 69.5 70.5 71.5 72.5 73
## 61.7 1 1 1 0 0 1 0 1 0 0 0
## 62.2 0 1 0 3 3 0 0 0 0 0 0
## 63.2 2 4 9 3 5 7 1 1 0 0 0
## 64.2 4 4 5 5 14 11 16 0 0 0 0
## 65.2 1 1 7 2 15 16 4 1 1 0 0
## 66.2 2 5 11 17 36 25 17 1 3 0 0
## 67.2 2 5 11 17 38 31 27 3 4 0 0
## 68.2 1 0 7 14 28 34 20 12 3 1 0
## 69.2 1 2 7 13 38 48 33 18 5 2 0
## 70.2 0 0 5 4 19 21 25 14 10 1 0
## 71.2 0 0 2 0 11 18 20 7 4 2 0
## 72.2 0 0 1 0 4 4 11 4 9 7 1
## 73.2 0 0 0 0 0 3 4 3 2 2 3
## 73.7 0 0 0 0 0 0 5 3 2 4 0
이 테이블을 이용해서 plot으로 그림을 그리면 됩니다. 테이블을 바로 그림 그리기는 어려워서 테이블을 데이타프레임으로 바꾸고 열 이름을 정해줍니다.
freqData=data.frame(table(galton$child,galton$parent))
names(freqData) <- c("child", "parent", "freq")
tail(freqData)
## child parent freq
## 149 69.2 73 0
## 150 70.2 73 0
## 151 71.2 73 0
## 152 72.2 73 1
## 153 73.2 73 3
## 154 73.7 73 0
여기서 핵심은 그냥 plot으로 그리면 같은 크기의 점으로 그려지므로 점의 형태를 pch=21로 지정하고 테두리색은 black, 배경색은 lightblue, 점의 크기는 cex로 정해주는데 위 테이블의 숫자 만큼의 크기로 그려줍니다. 여러번 그리는 시행착오를 거쳤더니 freq에 0.15를 곱하는 것이 가장 좋았읍니다. 즉, cex=0.15*freqData$freq입니다.
그런데 문제가 있읍니다.
plot(freqData$child~freqData$parent,pch=21,col="black",bg="lightblue",cex=0.15*freqData$freq)
이렇게 그림이 나오는 이유는 table로 만든 freqData의 child,parent가 숫자가 아닌 범주형 변수로 되어있다는 점입니다.freqData의 구조롤 보면
str(freqData)
## 'data.frame': 154 obs. of 3 variables:
## $ child : Factor w/ 14 levels "61.7","62.2",..: 1 2 3 4 5 6 7 8 9 10 ...
## $ parent: Factor w/ 11 levels "64","64.5","65.5",..: 1 1 1 1 1 1 1 1 1 1 ...
## $ freq : int 1 0 2 4 1 2 2 1 1 0 ...
즉, parent 및 child 열이 숫자가 아니라 범주형 변수입니다. parent 변수는 숫자가 아니라 문자 “64”를 첫번째 범주로 갖는 변수로 이르 숫자로 바꾸기 위해 as.numeric을 쓴다면
as.numeric(freqData$parent)
## [1] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2
## [24] 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 4 4 4 4
## [47] 4 4 4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 5 5 5 5 5
## [70] 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 7 7 7 7 7 7 7 7
## [93] 7 7 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 9 9 9
## [116] 9 9 9 9 9 9 9 9 9 9 9 10 10 10 10 10 10 10 10 10 10 10 10
## [139] 10 10 11 11 11 11 11 11 11 11 11 11 11 11 11 11
우리가 원하는 숫자가 아닌 몇번째 범주냐 하는 숫자가 나옵니다. 우리가 원하는 숫자는 다음과 같이 얻을 수 있읍니다.
as.numeric(levels(freqData$parent)[freqData$parent])
## [1] 64.0 64.0 64.0 64.0 64.0 64.0 64.0 64.0 64.0 64.0 64.0 64.0 64.0 64.0
## [15] 64.5 64.5 64.5 64.5 64.5 64.5 64.5 64.5 64.5 64.5 64.5 64.5 64.5 64.5
## [29] 65.5 65.5 65.5 65.5 65.5 65.5 65.5 65.5 65.5 65.5 65.5 65.5 65.5 65.5
## [43] 66.5 66.5 66.5 66.5 66.5 66.5 66.5 66.5 66.5 66.5 66.5 66.5 66.5 66.5
## [57] 67.5 67.5 67.5 67.5 67.5 67.5 67.5 67.5 67.5 67.5 67.5 67.5 67.5 67.5
## [71] 68.5 68.5 68.5 68.5 68.5 68.5 68.5 68.5 68.5 68.5 68.5 68.5 68.5 68.5
## [85] 69.5 69.5 69.5 69.5 69.5 69.5 69.5 69.5 69.5 69.5 69.5 69.5 69.5 69.5
## [99] 70.5 70.5 70.5 70.5 70.5 70.5 70.5 70.5 70.5 70.5 70.5 70.5 70.5 70.5
## [113] 71.5 71.5 71.5 71.5 71.5 71.5 71.5 71.5 71.5 71.5 71.5 71.5 71.5 71.5
## [127] 72.5 72.5 72.5 72.5 72.5 72.5 72.5 72.5 72.5 72.5 72.5 72.5 72.5 72.5
## [141] 73.0 73.0 73.0 73.0 73.0 73.0 73.0 73.0 73.0 73.0 73.0 73.0 73.0 73.0
또는 다음과 같이 할 수 있읍니다.
as.numeric(as.vector(freqData$parent))
## [1] 64.0 64.0 64.0 64.0 64.0 64.0 64.0 64.0 64.0 64.0 64.0 64.0 64.0 64.0
## [15] 64.5 64.5 64.5 64.5 64.5 64.5 64.5 64.5 64.5 64.5 64.5 64.5 64.5 64.5
## [29] 65.5 65.5 65.5 65.5 65.5 65.5 65.5 65.5 65.5 65.5 65.5 65.5 65.5 65.5
## [43] 66.5 66.5 66.5 66.5 66.5 66.5 66.5 66.5 66.5 66.5 66.5 66.5 66.5 66.5
## [57] 67.5 67.5 67.5 67.5 67.5 67.5 67.5 67.5 67.5 67.5 67.5 67.5 67.5 67.5
## [71] 68.5 68.5 68.5 68.5 68.5 68.5 68.5 68.5 68.5 68.5 68.5 68.5 68.5 68.5
## [85] 69.5 69.5 69.5 69.5 69.5 69.5 69.5 69.5 69.5 69.5 69.5 69.5 69.5 69.5
## [99] 70.5 70.5 70.5 70.5 70.5 70.5 70.5 70.5 70.5 70.5 70.5 70.5 70.5 70.5
## [113] 71.5 71.5 71.5 71.5 71.5 71.5 71.5 71.5 71.5 71.5 71.5 71.5 71.5 71.5
## [127] 72.5 72.5 72.5 72.5 72.5 72.5 72.5 72.5 72.5 72.5 72.5 72.5 72.5 72.5
## [141] 73.0 73.0 73.0 73.0 73.0 73.0 73.0 73.0 73.0 73.0 73.0 73.0 73.0 73.0
따라서 원하는 그래프는
plot(as.numeric(as.vector(freqData$parent)),
as.numeric(as.vector(freqData$child)),
pch = 21, col = "black", bg = "lightblue",
cex = .15 * freqData$freq,
xlab = "parent", ylab = "child")
여기서 우리는 plot을 그릴때 점의 크기를 돗수에 따라 바꾸어 그리는 방법을 배웠고 범주형변수를 숫자로 바꾸는 방법을 배웠읍니다.