ecoinfAEET / Notas_Ecosistemas

Notas ecoinformáticas para la revista Ecosistemas
9 stars 15 forks source link

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

Open Pakillo opened 7 years ago

Pakillo commented 7 years ago

Sugerencia de @CarlosLaraR.

Include R code

Pakillo commented 7 years ago

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 commented 6 years ago

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 commented 6 years ago

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 commented 6 years ago

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

farcego commented 6 years ago

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 commented 6 years ago

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 commented 6 years ago

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 commented 6 years ago

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

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

6) 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 commented 6 years ago

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 commented 6 years ago

Hola,

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

Sólo 2 comentarios de momento:

Gracias!

farcego commented 6 years ago

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 commented 6 years ago

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 commented 5 years ago

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

farcego commented 5 years ago

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 commented 5 years ago

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 commented 5 years ago

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

Un abrazo.

farcego commented 5 years ago

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 commented 5 years ago

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

farcego commented 5 years ago

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

ibartomeus commented 5 years ago

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 commented 5 years ago

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 commented 5 years ago

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

ibartomeus commented 5 years ago

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

Pakillo commented 3 years ago

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 commented 3 years ago

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

ibartomeus commented 3 years ago

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

ibartomeus commented 3 years ago

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