2012-05-02 53 views
2

下面給出一個頻率表密度:如何繪製從頻率表

> print(dat) 
V1 V2 
1 1 11613 
2 2 6517 
3 3 2442 
4 4 687 
5 5 159 
6 6 29 

# V1 = Score 
# V2 = Frequency 

我們怎樣才能繪製密度(即y軸範圍從0到1.0)。

目前我有頻率情節如下:

plot(0,main="table",type="n"); 
lines(dat,lty=1) 

# I need to use lines() and plot() here, 
# because need to make multiple lines in single plot 

不知道如何處理,對於密度。

回答

4

假設每一行都是一個單獨的塊,每個塊的密度將爲V2/sum(V2)

爲您的數據

dat <- data.frame(V1 = 1:6, V2 = c(11613, 6517, 2442, 687, 159, 29)) 

我得到:

> with(dat, V2/sum(V2)) 
[1] 0.541474332 0.303865342 0.113862079 0.032032452 0.007413624 0.001352170 

,我們可以檢查,使用R的工具。一是擴大您的緊湊型頻率表

dat2 <- unlist(apply(dat, 1, function(x) rep(x[1], x[2]))) 

然後使用hist()來計算我們想要

dens <- hist(dat2, breaks = c(0:6), plot = FALSE) 

看看結果對象的值:

> str(dens) 
List of 7 
$ breaks  : int [1:7] 0 1 2 3 4 5 6 
$ counts  : int [1:6] 11613 6517 2442 687 159 29 
$ intensities: num [1:6] 0.54147 0.30387 0.11386 0.03203 0.00741 ... 
$ density : num [1:6] 0.54147 0.30387 0.11386 0.03203 0.00741 ... 
    $ mids  : num [1:6] 0.5 1.5 2.5 3.5 4.5 5.5 
$ xname  : chr "dat2" 
$ equidist : logi TRUE 
- attr(*, "class")= chr "histogram" 

注意density組分,它是:

> dens$density 
[1] 0.541474332 0.303865342 0.113862079 0.032032452 0.007413624 0.001352170 

這與我通過原始頻率表格表示的手邊計算是一致的。

至於繪圖,如果你只是想畫密度,而不是再試試:

dat <- transform(dat, density = V2/sum(V2)) 
plot(density ~ V1, data = dat, type = "n") 
lines(density ~ V1, data = dat, col = "red") 

如果要強制軸範圍做:

plot(density ~ V1, data = dat, type = "n", ylim = c(0,1)) 
lines(density ~ V1, data = dat, col = "red")