이 그래프를 그리는 방법은 아주 간단합니다. 즉, 데이타를 불러오면

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)

plot of chunk unnamed-chunk-3

이렇게 그림이 나오는 이유는 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 of chunk unnamed-chunk-8

여기서 우리는 plot을 그릴때 점의 크기를 돗수에 따라 바꾸어 그리는 방법을 배웠고 범주형변수를 숫자로 바꾸는 방법을 배웠읍니다.