2013-06-28 3 views
2

J'utilise la fonction beanplot du paquet beanplot, et je n'arrive pas à trouver un moyen d'utiliser le paramètre wd= avec un bon résultat.Utilisation de 'wd =' dans beanplot {beanplot} pour changer dynamiquement la largeur des beans

Ce que je veux

  • beanplots d'affichage dont la largeur dépend de la taille de l'échantillon. (Et maintenant) comprendre quelle est l'utilisation de 'wd =' et comment l'utiliser.

Jusqu'à présent, lorsque je tente d'utiliser le paramètre wd, comme une liste, il me donne une erreur, comme un vecteur, il me donne quelque chose de bizarre (wd semble multiplier les estimations de la densité des valeurs)

Exemple

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

Répondre

3

Bon, après un peu d'essais/erreur personnelle, je suis mes deux réponses:D'abord, après avoir regardé le code, wd n'est pas censé être utilisé de cette façon, et ne supporte pas d'avoir plusieurs valeurs (contrairement à 'col ='). Il semble que 'wd =' n'est pas destiné à être utilisé directement pour spécifier la largeur du beanplot dans une utilisation normale. En effet, quand aucun 'wd' (ou wd = NA) n'est fourni, wd est calculé à partir de 'maxwidth =', mais normalisé à la valeur la plus élevée de toutes les fonctions de densité. Il semble donc plus approprié de spécifier 'maxwidth =' si l'on veut contrôler la largeur des beans. Deuxièmement, j'ai écrit du code pour réellement réaliser ce que je veux. Il peut être en désordre, s'il vous plaît n'hésitez pas à l'améliorer. Cet exemple peut être utilisé pour toute variation de paramètre qui n'est pas supportée nativement par la fonction beanplot.

Vous remarquerez que le code montre un exemple de pourquoi «wd =» est toujours important, puisque nous voulons que toutes les valeurs de largeur du bean soient normalisées une fois, pour tous les graphiques de densité.

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

Vous pouvez essayer d'écrire une fonction pour le faire. –

Questions connexes