3

我正在使用 beanplot 包的 beanplot 函数,我想不出一种方法来使用该wd=参数并获得良好的结果。

我想要的是

  • 显示宽度取决于样本大小的 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
)

豆图1

4

1 回答 1

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)}
)

豆图

于 2013-06-28T19:03:43.890 回答