6 votos

¿Cómo puedo dibujar un boxplot sin cajas en R?

Usando R, me gustaría trazar dos boxplots sin las cajas-sólo los puntos.

Crear boxplots limpios en R es trivial:

business <- runif(50, min = 65, max = 100)
law <- runif(50, min = 60, max = 95)

boxplot(business, law, horizontal=TRUE, names=c("Business", "Law"), col=c('green', 'red'), main="Salary example (boxplot)")

Regular boxplots

Sin embargo, la única forma que he encontrado para trazar sólo los puntos de las dos distribuciones aleatorias parece innecesariamente complicada: Superpongo dos gráficos de dispersión con cada variable trazada contra 1 o 2, para hacer una línea plana:

plot(business, rep(1, length(business)), xlim=range(business, law), ylim=c(0, 3), pch=20, col='green', main="Salary example (dots)")
points(law, rep(2, length(law)), col='red', pch=20)

Sample dotted boxplot

Si bien esto funciona, requerirá una tonelada más de ajustes para que los ejes, las marcas y las etiquetas coincidan con lo que hace R con boxplot() . Parece que tiene que haber una forma más sencilla, más parecida a la de R, de hacer esto. ¿Cuál es la mejor manera de dibujar un boxplot sin la caja y los bigotes, sólo los puntos individuales?

0 votos

Sólo para aclarar, usted está buscando una manera de trazar los marcadores de cuantiles, ¿correcto? Un diagrama de caja es simplemente un diagrama "elegante" (término utilizado de forma imprecisa aquí) de cuantiles y valores atípicos.

0 votos

No, estoy buscando una manera de usar boxplot() a no dibujar los marcadores de cuantiles, y sólo dibujar los puntos. Ya dibuja los valores atípicos como puntos; espero que haya una forma de dibujar todos los valores del vector como puntos.

8voto

jamesh Puntos 9849

La función stripchart de la biblioteca de gráficos parece ser lo que quieres si quieres trazar los datos en una dimensión para cada grupo. Produce un gráfico algo básico, pero se puede personalizar

business <- runif(50, min = 65, max = 100)
law <- runif(50, min = 60, max = 95)
df <- data.frame(group = rep(c("Business", "Law"), each = 50), value = c(business, law), stringsAsFactors = F)

stripchart(value ~ group, data = df, 
   main = "Salary Example (dots)",
   pch = 16,
   col = c("red", "green"))

0 votos

¡Impresionante! No tenía ni idea stripchart existió. Eso es exactamente lo que estaba buscando.

0 votos

(+1) He desarrollado ideas similares utilizando lattice pero tu respuesta está bien.

6voto

DavLink Puntos 101

Una aplicación interesante de R stripchart() es que se puede utilizar el jittering o el stacking cuando hay algún solapamiento en los puntos de datos (ver method= ). Con celosía la función correspondiente es stripplot() , pero carece del argumento del método anterior para separar los puntos coincidentes (pero véase más abajo fo una forma de lograr el apilamiento).

Una forma alternativa de hacer lo que quieres es utilizar el diagrama de puntos de Cleveland. Aquí hay algunas variaciones en torno a esta idea utilizando lattice :

my.df <- data.frame(x=sample(rnorm(100), 100, replace=TRUE), 
                    g=factor(sample(letters[1:2], 100, replace=TRUE)))
library(lattice)
dotplot(x ~ g, data=my.df)               # g on the x-axis
dotplot(g ~ x, data=my.df, aspect="xy")  # g on the y-axis
## add some vertical jittering (use `factor=` to change its amount in both case)
dotplot(g ~ x, data=my.df, jitter.y=TRUE)  
stripplot(g ~ x, data=my.df, jitter.data=TRUE)  
## use stacking (require the `HH` package)
stripplot(g ~ x, data=my.df, panel=HH::panel.dotplot.tb, factor=.2)
## using a custom sunflowers panel, available through
## http://r.789695.n4.nabble.com/ Grid- graphics- issues- tp797307p797307.html
stripplot(as.numeric(g) ~ x, data=my.df, panel=panel.sunflowerplot, 
          col="black", seg.col="black", seg.lwd=1, size=.08)
## with overlapping data, it is also possible to use transparency
dotplot(g ~ x, data=my.df, aspect=1.5, alpha=.5, pch=19)

Algunos avances de los comandos anteriores:

enter image description here

1voto

Max Gordon Puntos 2361

Tengo un poco de curiosidad de cómo el violinplot funciona cuando vi esta pregunta. Esto también me llevó a la beanplot que podrían estar en el mismo tema.

La creación de datos base para las tres parcelas:

business <- runif(50, min = 65, max = 100)
law <- runif(50, min = 60, max = 95)

La trama del violín

library(vioplot)
vioplot(business, law, names=c("Business", "Law"), 
        horizontal=T, col=c("lightblue"), rectCol=c('gold'))

Da abajo, diferentes colores no son posibles sin un ajuste:

Basic violin plot

Para obtener diferentes colores encontré esta solución un poco más avanzada de Ben Bolker

plot(1,1,ylim=c(0,2.5),xlim=range(c(business, law)),type="n",
     xlab="",ylab="",axes=FALSE)
## bottom axis, with user-specified labels
axis(side=2,at=1:2,labels=c("Business", "Law"))
axis(side=1)
vioplot(business,at=1,col="blue",add=TRUE, horizontal=T)
vioplot(law,at=2,col="gold",add=TRUE, horizontal=T)

Y se ve así:

Violin plot with different colors

La trama de los frijoles

En mi búsqueda también me topé con el beanplot de Peter Kampstra que parece interesante:

library(beanplot)
beanplot(business, law, horizontal=T, 
         names=c("Business", "Law"), 
         col=c("blue", "gold"))

Da esto:

Beanplot

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X