2012-09-28 5 views
9

Sto creando dei boxplot usando ggplot e vorrei rappresentare la dimensione del campione che contribuisce a ogni scatola. Nella funzione base plot è disponibile l'opzione varwidth. Ha un equivalente in ggplot?Esiste un equivalente in ggplot all'opzione varwidth nel grafico?

Per esempio, nella trama di base

data <- data.frame(rbind(cbind(rnorm(700, 0,10), rep("1",700)), 
         cbind(rnorm(50, 0,10), rep("2",50)))) 
data[ ,1] <- as.numeric(as.character(data[,1])) 
plot(data[,1] ~ as.factor(data[,2]), varwidth = TRUE) 

enter image description here

+3

mi sembra di ricorda qualcuno che ha chiesto questo sulla mailing list un po 'di tempo fa e gli è stato detto che w non è possibile. Non vedo nulla che faccia riferimento a questo nei problemi su github, quindi potrebbe non essere ancora possibile. (Un'alternativa è usare i colori di riempimento.) – joran

+0

Non possibile con ggplot, se si sta generando un solo grafico è possibile modificarlo in Illustrator o qualcosa di simile – by0

+1

@joran Ho imparato dall'esperienza amara che chiamare qualsiasi cosa in R impossibile solo serve da esca per qualcuno per dimostrare che hai torto. In questo caso, migthy @ kohske ha fornito una soluzione alternativa. – Andrie

risposta

7

Non elegante, ma si può fare da:

data <- data.frame(rbind(cbind(rnorm(700, 0,10), rep("1",700)), 
                         cbind(rnorm(50, 0,10), rep("2",50)))) 
data[ ,1] <- as.numeric(as.character(data[,1])) 
w <- sqrt(table(data$X2)/nrow(data)) 
ggplot(NULL, aes(factor(X2), X1)) + 
    geom_boxplot(width = w[1], data = subset(data, X2 == 1)) + 
    geom_boxplot(width = w[2], data = subset(data, X2 == 2)) 

enter image description here

Se si dispone di diversi livelli per X2 , quindi puoi fare a meno di h ardcoding tutti i livelli:

ggplot(NULL, aes(factor(X2), X1)) + 
    llply(unique(data$X2), function(i) geom_boxplot(width = w[i], data = subset(data, X2 == i))) 

Inoltre è possibile inviare una richiesta di funzionalità: https://github.com/hadley/ggplot2/issues

2

Le attuali versioni di ggplot2 (V 2.1.0) contiene ora un varwidth un'opzione:

data <- data.frame(rbind(cbind(rnorm(700, 0,10), rep("1",700)), 
        cbind(rnorm(50, 0,10), rep("2",50)))) 
data$X1 <- as.numeric(as.character(data$X1)) 
ggplot(data = data, aes(x = X2, y = X1)) + 
    geom_boxplot(varwidth = TRUE) 

Example output plot from ggplot2

Problemi correlati