Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Dataviz: boxplots & barplots - pros and cons (and R code) #12

Open
Pakillo opened this issue May 29, 2017 · 27 comments
Open

Dataviz: boxplots & barplots - pros and cons (and R code) #12

Pakillo opened this issue May 29, 2017 · 27 comments

Comments

@Pakillo
Copy link
Member

Pakillo commented May 29, 2017

Sugerencia de @CarlosLaraR.

Include R code

@Pakillo
Copy link
Member Author

Pakillo commented May 29, 2017

Related: https://cdn.rawgit.com/benmarwick/new-data-presentation-paradigm-using-r/582a80eaba654237231fe4b06d3eda5a61587d73/Weissgerber_et_al_supplementary_plots.html

Why dotplots and similar are most times better than boxplots and barplots. There are many similar examples out there.,..

@ibartomeus
Copy link
Member

Adaptar esto: http://journals.plos.org/plosbiology/article?id=10.1371/journal.pbio.1002128 y añadir algun codigo rápido para hacerlo en R.

@farcego
Copy link

farcego commented May 18, 2018

Hola, que tal?
Yo tengo algo de codigo ya hecho para ejemplificar los problemas asociados a los boxplots (el clasico de las distribuciones bimodales etc...) y alternativas como dotplots o violinplots ya que hice una minipresentacion de 5 minutos para el grupo en el que estoy. No seria muy complicado adaptarlo a una nota ecoinformatica y a lo que se comenta en el articulo que habeis enlazado...
Me podria poner a ello en unas dos semanas, cuando regrese del campito :)
saludos
Fer

@ibartomeus
Copy link
Member

Estupendo! Fichado! Gracias Fer. Si hay espacio, podrias añadir una linea o dos "contra los pie charts".

@farcego
Copy link

farcego commented May 19, 2018

Será un placer xD. No me gustan nada los pie charts (ni siquiera las tartas comestibles). Del los pie charts creo que bastaría con decir que cuando hay más de oos o tres quesitos son totalmente inútiles ya que engañan a la vista, y que en términos prácticos, una pequeña tabla con los porcentajes gana en claridad...
Saludos
Fer

@farcego
Copy link

farcego commented Jun 1, 2018

Tras unos dias de regreso a la jungla de asfalto, ya estoy un poco en ello...
Me surge la pregunta, Ignasi, sobre el tema de añadir codigo en R para hacer alguno de los ejemplos del articulo que enlazasteis de Plos Biology. No seria (demasiado) complicado de cara a qu epudiera ser reciclado automaticamente a modo funcion, pero de todos modos, pensando en transformar slides en graficos, y estando un poco condicionados por el espacio, estaba pensando en hacer algo como este ejemplo que pongo:
ejemplo

En realidad, seria mas bien un ejemplo de cuando algunos graficos clasicos como los boxplot funcionan y cuando no (el ejemplo concreto aqui esta basado en el caso en que un boxplot parece razonable (los bigotes tienen una longitud similar, aunque la mediana esta desviada), pero una cola es mas relevante que la otra (la inferior). Para la nota seria este grafico pero añadiendo barplot, y hacerlo en el caso de que los graficos basados en resumenes estadisticos (boscplot, barplot con barra de desviacion) funcionan, y cuando no (con un ejemplo de distribucion bimodal mas marcado).

No se como lo veis. Yo veo, por espacio, importante no pasar de 2 graficos, aunque si se acepta info suplementaria en formato online pueden ir ahi ejemplos con mas codigo.

El codigo es este (ignorar el problema al cerrar el violinplot, ando un poco obtuso ultimamente con el tema de hacer poligonos... ira corregido cuando suba la primera version)

set.seed(666)
muestra <- c(rnorm(100,10,3),c(rnorm(100,12.1)))     
boxplot(muestra, xlim = c(0,4.2), width =1)
boxplot(rep(2,length(muestra)),muestra, add = TRUE)
points(jitter(rep(2,length(muestra)),5), pch = 19,
       muestra, cex = .8, col= adjustcolor('dodgerblue',.5))
u <- density(muestra, from = min(muestra), to = max(muestra))
points((u$y*2)+3,u$x, type = 'l')
points(-(u$y*2)+3,u$x, type = 'l')
polygon(c((-(u$y*2)+3)[1],-(u$y*2)+3,(u$y*2)+3,((u$y*2)+3)[1]),
        c(-u$x[1],u$x,u$x, u$x[1]), col = 'dodgerblue')
points(rep(0,length(muestra)),muestra)
points(runif(length(muestra),3.7,4.2),muestra, pch = 19, col = adjustcolor('dodgerblue', .2))

Edito: son diferentes visualizaciones de los mismos datos, usando simplemente el ploteo de puntos, boxplot, boxplot + puntos con jitter, violinplot y simplemente puntos + jittter (probablemente la mas informativa de todas...)

@ibartomeus
Copy link
Member

A mi e gusta, y si cabe el codigo no veo mal añadirlo al propio texto. Son solo 11 lineas. Pero como tu veas, que eres el que te lo estas currando.

@farcego
Copy link

farcego commented Jun 3, 2018

Buenas. Vuelvo un poco a ello tras el fin de semana que he podido meter tiempo a esta nota, y asi a lo largo de la semana pueda recibir feedback. Sere (demasiado) esquematico, pero asi, a vuelapluma, esta es la idea:

  1. los graficos son la polla para visualizar datos, tanto como parte del proceso exploratorio como de cara a hacer un articulo
  2. R es la caña de España para hacer graficos. Es de los programass mas flexibles, tiene cantidad de liberias para hacer graficos como ggplot2 etc (los graficos estan hechos en R base, BTW, no se usar mas que por encima los paquetes para hacer rasters y rollos espaciales, me entran escalofrios cada vez que leo codigo de ggplot2)
  3. a la hora de representar variables univariadas (perdon por la redundancia) se puede hacer horizontal o verticalmente.
  4. hrizontal: Muy bueno cuando es una o pocas variables (o pocos factores de una misma variable). Metodos: histograma, densidad, boxplot. Aqui la primera en la frente a los boxplot. Una variable bimodal cuyo boxplot parece perfecto (mediana centrada, quartiles y bigotes balanceados....) pero que en este caso resulta muy engañoso (Nota: No tengo nada contra los boxplot, pero es un ejemplo muy claro de lo sproblemas que pueden generar especialmente en analisis exploratorios de variables xD ):

uno

  1. vertical: Mejor si se quieren comparar varias variables o factores. Metodos: boxplot, puntos, puntos + boxplot o violinplot (en realidad es un density plot, y he descubierto esta tarde que a lo que he hecho se le llama beanplot al que he pintado en la grafica...)

dos

Personalizacion de graficos. Ejemplo de como con unas pocas lineas de codigo se pueden generar graficos mas explicativos o con mayor capacidad exploratoria. Comparacion de dos variables en teoria independientes, en la que segun el boxplot una tiene valores en promedio mas altos que la otra seguidos de graficos de puntos que meustran que la relacion no es tan clara (en general A es mayor que B), pero los valores mas bajos de A se parean con los mas altos de B (ejemplos de eventos climaticos, dimorfismo sexual en gamusinos....). Ademas, le meto los quartiles del boxplot :)

tres

  1. barplots y pie charts. Aun lo estoy dando vueltas, ya que no son graficos que suela usar. Igual variables muy similares y dissimilares, y multiples proporciones en un grafico de tarta?

Cada tipo de grafico llevaria a lo largo del texo una descripcion del mismo, los puntos a favor, y los puntos en contra. Un parrafito por grafico empleado

Que opinais?, cualquier critica o idea es bienvenida
saludos
Fer

Perdon, edito anyadiendo el codigo:

Generacion de variables:

set.seed(666)
muestra1 <- c(rnorm(100,0,2 ), rnorm(100, 9, 2))
muestra2 <- c(rnorm(100,10,3), rnorm(100,12, 1))
muestra3 <- c(rnorm(100,10,3), rnorm(100, 8, 1))

Primer grafico

##jpeg('uno.jpg')
bred <- adjustcolor('firebrick',.4)
par(mfrow=c(3,1), mar = c(1,3,0.5,1))
hist(muestra1, col = bred, main = '', axes = FALSE, xlim = c(-10,20))
axis(1, pos = 0)
axis(2, pos = -10.2)
de <- density(muestra1)
plot(de, type = 'l', main = '', axes = FALSE, xlim = c(-10,20))
polygon(de, col = bred)
axis(1, pos = 0)
axis(4, pos = 20.2)
boxplot(muestra1, col = bred, horizontal = TRUE, xaxt  = 'n',
        ylim = c(-10,20), frame = FALSE, outline = TRUE)
axis(1, pos = .75)
##dev.off()

Segundo:

##jpeg('dos.jpg')
bblue <- adjustcolor('dodgerblue',.3)
jit <- runif(200, -.19,.19)
boxplot(muestra2, xlim = c(.5,4.2), col = bblue, outline=TRUE)
points(3+jit, pch = 21, bg = bblue,
       muestra2, cex = 1.2, col= 'white')
boxplot(muestra2, at = 3, xlim = c(.5,4.2),
        col = bblue, outline=FALSE, add = TRUE)
u <- density(muestra2, from = min(muestra2), to = max(muestra2))
points((u$y*1.5)+4,u$x, type = 'l')
points(-(u$y*1.5)+4,u$x, type = 'l')
polygon(c(-(u$y*1.5)+4,rev((u$y*1.5)+4)),
        c(u$x,rev(u$x)),col = bblue)
points(2+jit,muestra2, cex = .9, col = bblue, pch = 19)
axis(1, at = c(1,2,3,4), labels = c('A','B','C','D'))
##dev.off()

Y tercero:

##jpeg('tres.jpg')
m1 <- jitter(rep(3,200),3)
m2 <- jitter(rep(4,200),2)
boxplot(muestra2,muestra3, xlim = c(.5,4.5))
##plot(m1,muestra2, xlim = c(-3,4), cex = 1, pch = 19, col = adjustcolor('black',.2))
points(m2,muestra3, xlim = c(1,2), cex = 1, pch = 19, col =adjustcolor('dodgerblue',.2))
points(m1,muestra2, xlim = c(1,2), cex = 1, pch = 19, col =adjustcolor('dodgerblue',.2))
scol <- ifelse(muestra2 - muestra3 > 0, 'dodgerblue', 'firebrick')
segments(m1,muestra2,m2,muestra3, lwd = .8, lty = 2, col = scol)
mtext(c('A','B'), side = 1, line = 1, at = c(1,2))
axis(3, at = c(3,4), labels=c('A','B'))
axis(4, at = round(quantile(muestra3)[2:4],1), pos = max(m2)+ .05,
     cex.axis = 1, las = 1, lwd = 2, col = 'dodgerblue3')
axis(2, at = round(quantile(muestra2)[2:4],1), pos = min(m1)- .05,
     cex.axis = 1, las = 1, lwd = 2, col = 'dodgerblue3')
##dev.off()

@ibartomeus
Copy link
Member

My guapo!

A ver como queda de larga y valoramos si va en el texto principal todo el codigo, o solo de algunos graficos.

Sobre barplots y pie charts yo me limitiria a decir que ocultan más información que aportan, y no perderia mucho el tiempo con ellos. Mirate los links al principio de este hilo para ver como lo enfocan esos paper si quieres.

Un abrazo,
Nacho

@Pakillo
Copy link
Member Author

Pakillo commented Jun 4, 2018

Hola,

Muchas gracias @farcego . Muy buena pinta lo que vas mostrando :)

Sólo 2 comentarios de momento:

  • Si el código es largo podemos mostrar sólo las partes más relevantes y enlazar a un repositorio online (e.g. Zenodo)
  • Como te veo animado y con mucho material igual te interesa preparar un artículo más largo (revisión) para Ecosistemas. O varias notas si ves que te quedas sin espacio... Creo que mejor eso que meter cosas en un material suplementario.

Gracias!

@farcego
Copy link

farcego commented Jun 10, 2018

Gracis @ibartomeus y @Pakillo .
En principio, y sin abusar demasiado, creo que me podria ir alrededor de las 2000 palabras. Me cuesta un poquito a veces ser conciso, pero ahi va poco a poco...

De cara al codigo, mi idea seria incluir dentro del cuerpo del manuscrito el minimo necesario (p.ej. hist(muestra1) para el histograma, o con una personalizacion minima, porque el tema de la personalizacion va en el texto explicada) y despues en repositprio online el codigo exacto para hacer los graficos de la nota. el codigo bien podria subirse aqui. Ademas, hay una nota ecoinformatica saliendo del horno sobre GitHub por lo que seria miel sobre hojuelas.

Para mi seria ideal dejar esto dentro de un mismo documento/nota. La idea subyacente es la visualizacion de variables "univariadas", incluyendo sucintamente el caso de medidas pareadas, ya que el ejemploal final seian medidas biometricas de machos y hembras de algun pajarito.

Los graficos creo que seran los mostrados, salvo que alguien sugiera alguna otra tecnica de visualizacion de este tipo de variables.

Ya que uno de los primeros puntos es sobre graficar la escala en el eje horizontal, o vertical, he anyadido dos visualizaciones verticales de densidad y de histograma en la ultima (veo que la tendre que alargar, para hacerla en formato + larga que alta)

tres

## jpeg('tres.jpg')
m1 <- jitter(rep(3,200),3)
m2 <- jitter(rep(4,200),2)
boxplot(muestra2,muestra3, xlim = c(.5,7.2), col = c(bblue,bred), ylim = c(2,18))
points(m2,muestra3, xlim = c(1,2), cex = 1, pch = 19, col =bred)
points(m1,muestra2, xlim = c(1,2), cex = 1, pch = 19, col =bblue)
scol <- ifelse(muestra2 - muestra3 > 0, 'dodgerblue', 'firebrick')
segments(m1,muestra2,m2,muestra3, lwd = .8, lty = 2, col = scol)
mtext(c('A','B'), side = 1, line = 1, at = c(1,2))
axis(3, at = c(3,4), labels=c('A','B'))
## pendiente tengo de anyadir la proyeccion en los nuevos ejes del boxplot
axis(4, at = round(quantile(muestra3)[2:4],1), pos = max(m2)+ .05,
     cex.axis = 1, las = 1, lwd = 2, col = 'firebrick')
axis(2, at = round(quantile(muestra2)[2:4],1), pos = min(m1)- .05,
     cex.axis = 1, las = 1, lwd = 2, col = 'dodgerblue3')
u <- density(muestra2)##, from = min(muestra2), to = max(muestra2))
u2 <- density(muestra3)##, from = min(muestra2), to = max(muestra2))
points(-(u$y*2)+5.2,u$x, type = 'l')
points((u2$y*2)+5.2,u2$x, type = 'l')
polygon(-(u$y*2) + 5.2, u$x, col = bblue)
polygon((u2$y*2) + 5.2, u2$x, col = bred)
text(4.7,15,'A')
## para anyadir en vertical los hists
## help(hist)
a <- hist(muestra2, plot = FALSE)
b <- hist(muestra3, plot = FALSE)
##plot( NA, xlim = c(4.5,5.5),ylim = c(0,20))
rect(6.5 - a$density*3,a$breaks[-length(a$breaks)],
     rep(6.5,length(a$breaks)-1),
     a$breaks[-length(a$breaks)]+unique(diff(a$breaks)), col = bblue)
rect(rep(6.5,14),b$breaks[-length(b$breaks)],
     6.5 + b$density*3,b$breaks[-length(b$breaks)]+unique(diff(b$breaks)),
     col = bred)
## dev.off()

Saludos

Fer

@ibartomeus
Copy link
Member

Perfecto, si puedes resumir y no pasar de 1500 palabras (que ya seria una nota larga) se agradecera. Todo lo que puedas simplificar dirigiendo a gente a otros articulos te puede ayudar a cortar palabras. Gracias!

@ibartomeus
Copy link
Member

@farcego como llevas la nota? Seria genial sacarla en el proximo numero. Gracias!

@farcego
Copy link

farcego commented Nov 15, 2018

Perdon, vacaciones y trabajo de campo :(. estoy de vuelta en casa. Podria dejar la nota para que se revise hacia el 25-26 de este mes (luego me vuelvo al campo desde el 28-29 hasta el 7 de Dec mas o menos), os parece adecuado?

@farcego
Copy link

farcego commented Nov 15, 2018

quiero decir enviarla los ultimos dias del mes para que la reviseis aqui y ver como mejorarla, no para enviarla a ecosistemas... se enviaria una vez aqui estemos contentos :)
saludos
Fer

@ibartomeus
Copy link
Member

Sera estupendo Fer! Recuerda el limite de 1000 palabras y estoy desando leerla.

Un abrazo.

@farcego
Copy link

farcego commented Nov 15, 2018

uff, el mayor problema ha sido y sigue siendo acotar 1000 palabras... Estara cerca pero no garantizo 999 palabras (tampoco seran 1800....). Pero saldra corta!
Un abrazote:
Fer

@ibartomeus
Copy link
Member

Hola @farcego , como va esta nota? Algún progreso? Si necesitas ayuda, pidela y la rematamos. Gracias!

@farcego
Copy link

farcego commented Jun 16, 2019

Pues ha estado danzando por mi ordenador demasiado tiempo (phd life...) me fijo un deadline el domingo que viene. Te parece bien?

@ibartomeus
Copy link
Member

Lo comprendo perfectamente! El domingo que viene seria genial, a ver si entra en este numero. Encantado de hechar una mano si necesitas, y recuerda que ha de ser corto (1000 palabras) y al grano! Gracias!

@farcego
Copy link

farcego commented Jun 16, 2019

Soy nulo escribiendo, asi que ayuda pues bienvenida, antes o despues tendreis que editar mi pobre semantica. A ver is a lo largo de la semana lo subo, imagino que via pull request? o como?

@ibartomeus
Copy link
Member

Claro, tu envia y lo revisamos. Via pull request ideal, sino como adjunto aqui o lo que sea más fácil.

@ibartomeus
Copy link
Member

@farcego ya se que soy muy pesado, pero seria genial tenerla ya para incluirla en el siguiente numero. Muchas gracias!

@Pakillo
Copy link
Member Author

Pakillo commented Mar 29, 2021

Hola @farcego !

Parece que tu nota estaba ya muy madura. Si subes lo que tengas al repositorio (o nos la envías por email y la subimos nosotros) podemos terminarla entre todos. Esas gráficas tenían muy buena pinta!

Gracias!

@farcego
Copy link

farcego commented Mar 30, 2021

Hola!
Perdon, llevo una temporada larga que en fin...
Lo subo esta semana, ok?
gracias por el recordatorio
saludos
Fer

@ibartomeus
Copy link
Member

Gracias Fer, esta va a ser una nota muy consultada. Sube lo que tengas y la rematamos :)

@ibartomeus
Copy link
Member

@farcego no se si somos muy pesados, pero como decia Paco, si subes lo que tienes podemos ayudarte a rematarlo. Gracias!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

3 participants