2013-06-28 47 views
2

我正在使用beanplot包的beanplot函數,並且我找不到一種方法來使用wd=參數並獲得好的結果。在beanplot {beanplot}中使用'wd ='來動態地改變bean的寬度

我想要什麼

  • 顯示beanplots的寬度取決於樣本的大小。
  • (現在)明白'wd ='的用法以及如何使用它。

到目前爲止,當我嘗試使用WD參數,作爲列表它給了我一個錯誤,作爲一個載體,它給了我一個很奇怪(WD好像乘到密度估計值)

library(beanplot) 
set.seed(2000) 
Test <- data.frame(
    x=rnorm(30), 
    f1 = factor(c(rep('A', 10), rep('B',20))), 
    f2=factor(c('M','F')) 
) 

beanplot(x~f1,Test, 
     col=list('orange','yellow'), 
     wd=c(1:2/2), 
     boxwex = 1 
) 

beanplot1 http://i41.tinypic.com/wcmg4j.jpg

回答

3

好吧,有點親身試用/錯誤之後,我得到了我的兩個答案:

首先,在查看代碼後,不應該以這種方式使用wd,並且不支持具有多個值(不同於'col =')。看起來'wd ='不是直接用於指定正常使用中的beanplot寬度。事實上,當沒有'wd'(或wd = NA)被提供時,wd是從'maxwidth ='計算的,但歸一化到所有密度函數的最高值。因此,如果要控制bean的寬度,指定'maxwidth ='似乎更合適。

其次,我寫了一些代碼來實現我想要的。它可能是凌亂的,請免費提升它。這個例子可以用於原生函數beanplot不支持的任何參數變化。

您會注意到,代碼顯示了爲什麼'wd ='仍然很重要的一個例子,因爲我們希望所有密度圖的bean的寬度值都被歸一化。

col_list = list('orange','yellow') 
wd_fac = aggregate(x~f1,Test,length)$x # get the size relative to the number of points in each bean 
wd_fac <- wd_fac/max(wd_fac) 

par(mfrow=c(1,2)) 
## Normal plot 
beanplot(x~f1,Test, col=col_list) 
## Our plot 
bp <- beanplot(x~f1,Test,what=c(T,F,F,F)) # plots the line and frames + get the general parmeters 
sapply(1:length(levels(Test$f1)), 
     function(X){ 
     beanplot(subset(Test, f1 == levels(f1)[X])$x, 
        col=col_list[X], 
        bw = bp$bw, # we may want to keep the bandwidth 
        wd= bp$wd*wd_fac[X], 
        at=X, 
        what=!c(T,F,F,F), 
        add = T)} 
) 

beanplot http://i39.tinypic.com/33uxrhf.png

+0

你可以嘗試編寫一個函數來做到這一點。 –

相關問題