31 votos

Visualizar muchas variables en un diagrama

Me gustaría mostrar cómo los valores de ciertas variables (~ 15) cambiar a lo largo del tiempo, pero también me gustaría mostrar cómo las variables difieren de uno a otro en cada año. Así que he creado este de la parcela:

enter image description here

Pero incluso cuando se cambia el esquema de colores o la adición de diferentes línea/tipo de formas esto se ve desordenado. Existe una mejor manera de visualizar este tipo de datos?

Los datos de prueba con código R:

structure(list(Var = structure(c(1L, 2L, 2L, 2L, 2L, 2L, 2L, 
2L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 6L, 
6L, 6L, 6L, 6L, 6L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 8L, 8L, 8L, 8L, 
8L, 8L, 8L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 11L, 11L, 11L, 11L, 11L, 
11L, 11L, 12L, 12L, 12L, 12L, 12L, 12L, 13L, 14L, 14L, 14L, 14L, 
14L, 14L, 14L, 16L, 16L, 16L, 16L, 16L, 16L, 17L, 17L, 17L, 17L, 
17L, 17L, 17L, 18L, 18L, 18L, 18L, 18L, 18L, 18L), .Label = c("A", 
"B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", 
"O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"), class = "factor"), 
    Year = c(2015L, 1991L, 1993L, 1996L, 2000L, 2004L, 2011L, 
    2015L, 1991L, 1993L, 1996L, 2000L, 2004L, 2011L, 2015L, 1991L, 
    1993L, 1996L, 2000L, 2004L, 2011L, 2015L, 1993L, 1996L, 2000L, 
    2004L, 2011L, 2015L, 1991L, 1993L, 1996L, 2000L, 2004L, 2011L, 
    2015L, 1991L, 1993L, 1996L, 2000L, 2004L, 2011L, 2015L, 1991L, 
    1993L, 1996L, 2000L, 2004L, 2011L, 2015L, 1991L, 1993L, 1996L, 
    2000L, 2004L, 2011L, 2015L, 1993L, 1996L, 2000L, 2004L, 2011L, 
    2015L, 2015L, 1991L, 1993L, 1996L, 2000L, 2004L, 2011L, 2015L, 
    1991L, 1993L, 1996L, 2000L, 2011L, 2015L, 1991L, 1993L, 1996L, 
    2000L, 2004L, 2011L, 2015L, 1991L, 1993L, 1996L, 2000L, 2004L, 
    2011L, 2015L), Val = c(25.6, 22.93, 20.82, 24.1, 24.5, 29, 
    25.55, 24.5, 24.52, 20.73, 25.8, 25.5, 29.5, 27.7, 25.1, 
    25, 24.55, 26.75, 25, 30.5, 27.25, 25.1, 22.4, 27.07, 26, 
    29, 27.2, 24.2, 23, 24.27, 27.68, 27, 30.5, 28.1, 24.9, 23.75, 
    22.75, 27.25, 25, 29, 28.45, 24, 20.25, 17.07, 24.45, 25, 
    28.5, 26.75, 24.9, 21.25, 20.65, 25.1, 24.5, 26.5, 25.35, 
    23.5, 21.93, 26.5, 24.5, 29, 29.1, 26.4, 28.1, 23.75, 26.5, 
    28.05, 27, 30.5, 25.65, 23.3, 23.25, 24.57, 26.07, 27.5, 
    28.85, 27.7, 22, 23.43, 26.88, 27, 30.5, 29.25, 28.1, 23, 
    23.8, 28.32, 27, 29.5, 29.15, 27.6)), row.names = c(1L, 4L, 
5L, 6L, 7L, 8L, 9L, 10L, 13L, 14L, 15L, 16L, 17L, 18L, 19L, 20L, 
21L, 22L, 23L, 24L, 25L, 26L, 27L, 28L, 29L, 30L, 31L, 32L, 35L, 
36L, 37L, 38L, 39L, 40L, 41L, 44L, 45L, 46L, 47L, 48L, 49L, 50L, 
53L, 54L, 55L, 56L, 57L, 58L, 59L, 62L, 63L, 64L, 65L, 66L, 67L, 
68L, 69L, 70L, 71L, 72L, 73L, 74L, 75L, 78L, 79L, 80L, 81L, 82L, 
83L, 84L, 87L, 88L, 89L, 90L, 91L, 92L, 95L, 96L, 97L, 98L, 99L, 
100L, 101L, 104L, 105L, 106L, 107L, 108L, 109L, 110L), na.action = structure(c(2L, 
3L, 11L, 12L, 33L, 34L, 42L, 43L, 51L, 52L, 60L, 61L, 76L, 77L, 
85L, 86L, 93L, 94L, 102L, 103L), .Names = c("2", "3", "11", "12", 
"33", "34", "42", "43", "51", "52", "60", "61", "76", "77", "85", 
"86", "93", "94", "102", "103"), class = "omit"), class = "data.frame", .Names = c("Var", 
"Year", "Val"))

50voto

Nick Cox Puntos 22819

Casualidad o no, su ejemplo es de tamaño óptimo (hasta 7 valores para cada uno de los 15 grupos) en primer lugar, para mostrar que no es un problema gráficamente; y en segundo lugar, para permitir que otros y bastante simple de las soluciones. El gráfico es de un tipo que a menudo se llama espaguetis por personas en diferentes campos, aunque no siempre es claro si el término se entiende como afectivos o abusivo. El gráfico muestra la colectividad o de la familia el comportamiento de todos los grupos, pero es bastante desesperada en la que muestra el detalle para ser explorado.

Una alternativa estándar es sólo para mostrar los grupos independientes en paneles separados, pero que a su vez puede hacer que precisa de grupo-a-grupo de comparaciones difícil; cada grupo se separa de su contexto de los otros grupos.

Así que ¿por qué no combinar ambas ideas: un panel separado para cada grupo, sino que también la de otros grupos como telón de fondo? Esto depende mucho del resaltando el grupo que está en el foco y en restar importancia a los demás, lo que es bastante fácil en este ejemplo, dado un cierto uso de la línea de color, grosor, etc. En otros ejemplos, marcador o símbolo de punto de opciones podría ser natural en su lugar.

enter image description here

En este caso, los detalles de las posibles prácticos o científicos de importancia o de interés se destacan:

  1. Sólo tenemos Un valor para una y M.

  2. No tenemos todos los valores de todos los años en todos los demás casos.

  3. Algunos grupos de la parcela de alta, baja, y así sucesivamente.

No voy a intentar una interpretación de aquí: los datos son anónimos, pero que es el investigador de la preocupación que, en cualquier caso.

Dependiendo de lo que es fácil o posible en su software, hay margen para cambiar pequeños detalles aquí, como si las etiquetas del eje y los títulos se repiten (no son simples argumentos a favor y en contra).

El mayor problema es en qué medida esta estrategia funcione de manera más general. El número de grupos es el principal motor, más que el número de puntos en cada grupo. A grandes rasgos, el enfoque podría funcionar hasta alrededor de 25 grupos (5 x 5 pantalla, digamos): con más grupos, no sólo los gráficos se vuelven más pequeños y más difíciles de leer, pero incluso el investigador pierde la inclinación a un análisis de todos los paneles. Si hubo cientos (miles, ...) de los grupos, por lo general, esencial para seleccionar un pequeño número de grupos. Una combinación de criterios tales como la selección de algunos de los "típicos" y algunos de "extrema" de los paneles sería necesario; que debe ser impulsado por los objetivos del proyecto y una idea de lo que tiene sentido para cada conjunto de datos. Otro enfoque que puede ser eficiente es hacer hincapié en un pequeño número de serie en cada panel. Así que, si no eran de 25 grandes grupos, cada grupo amplio podría ser demostrado con todos los demás como telón de fondo. Alternativamente, podría haber algunas promedio o el resumen de los otros. El uso de (por ejemplo) director o componentes independientes también podría ser una buena idea.

Aunque el ejemplo de las llamadas para la línea de las parcelas, el principio es, naturalmente, mucho generales. Los ejemplos podrían multiplicarse, diagramas de dispersión, modelo de diagnóstico de terrenos, etc.

Algunas referencias para este enfoque [otros son la mayoría de la recepción]:

Cox, N. J. 2010. Representación gráfica de los subconjuntos. Stata Journal 10: 670-681.

Knaflic, C. N. 2015. La narración de historias con los Datos: los Datos de Visualización de la Guía de para los Profesionales de Negocios. Hoboken, NJ: Wiley.

Koenker, R. 2005. Cuantil De Regresión. Cambridge: Cambridge University Pulse. Vea las páginas 12-13.

Schwabish, J. A. 2014. Un economista de la guía para la visualización de datos. Diario de Perspectivas Económicas 28: 209-234.

Unwin, A. 2015. Gráfica de Análisis de Datos con R. Boca Raton, FL: CRC Pulse.

Wallgren, A., B. Wallgren, R. Persson, U. Jorner, y J.-A. Haaland. 1996. Representación gráfica de Estadísticas y Datos: la Creación de Mejores Gráficos.Newbury Park, CA: Sage.

Nota: El gráfico fue creado en Stata. subsetplot debe ser instalado en primer lugar con ssc inst subsetplot. Los datos fueron copiados y pegados de R y las etiquetas de valor se define a mostrar años como 90 95 00 05 10 15. El principal comando es

subsetplot connected Val Year, by(Var) c(L) lcolor(gs12) backdrop(line) xtitle("") combine(imargin(small)) subset(lcolor(blue) mcolor(blue))

26voto

Doug Kavendek Puntos 1244

Como complemento a la respuesta de Nick, aquí es un código de R para hacer una trama similar usando datos simulados:

library(ggplot2)

get_df <- function(label="group A", n_obs=10, drift=runif(1)) {
    df <- data.frame(time=seq(1, n_obs), label=label)
    df$y <- df$time * drift + cumsum(rnorm(n_obs))
    return(df)
}
df_list <- lapply(sprintf("group %s", toupper(letters[1:9])),
                  function(label) { get_df(label) })
df <- do.call(rbind, df_list)
df$label2 <- df$label

p <- (ggplot(df, aes(x=time, y=y, group=label2)) +
      geom_line(size=0.9, alpha=0.8,
                data=df[, c("time", "y", "label2")], color="grey") +
      geom_line(size=1.1, color="black") +
      ylab("") +
      theme_bw() +
      theme(panel.border=element_blank()) +
      theme(strip.background=element_blank()) +
      facet_wrap(~ label))
p
ggsave("example_facet.png", p, width=10, height=8)

example plot

11voto

Antony Unwin Puntos 11

Para aquellos que quieran utilizar un ggplot2 enfoque en I considerar la facetshade función en el paquete extracat. Esto ofrece un enfoque general, no sólo para los gráficos de línea. Un ejemplo con diagramas de dispersión se puede encontrar en el pie de esta página: http://www.gradaanwr.net/content/ch10/

EDIT: el Uso de Adrian del conjunto de datos simulados de su anterior respuesta:

biblioteca(extracat)

facetshade(df), aes(x=, y=y), f = .~etiqueta, bg.todos = FALSE, mantener.orig = TRUE) + geom_line(aes(x=, y=y, group=orig.la etiqueta),color = alfa(1,0.3)) + geom_line(datos=df, aes(color=label), size = 1.2) + xlab("") + ylab("")

5voto

agateau Puntos 898

Aquí es una solución inspirada por Ch. 11.3, la sección de "Texas los Datos de la Vivienda", en Hadley Wickham, el Libro de ggplot2. Aquí estoy de ajuste de un modelo lineal para cada serie de tiempo , tomar los residuos (que se centra alrededor de media 0), y dibujar una línea de resumen en un color diferente.

library(ggplot2)
library(dplyr)
#works with dplyr version 0.4.3.9000 from Github (hadley/dplyr@4f2d7f8), or higher

df1 <- as.data.frame(list(Var = structure(c(1L, 2L, 2L, 2L, 2L, 2L, 2L, 
                                 2L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 6L, 
                                 6L, 6L, 6L, 6L, 6L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 8L, 8L, 8L, 8L, 
                                 8L, 8L, 8L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 11L, 11L, 11L, 11L, 11L, 
                                 11L, 11L, 12L, 12L, 12L, 12L, 12L, 12L, 13L, 14L, 14L, 14L, 14L, 
                                 14L, 14L, 14L, 16L, 16L, 16L, 16L, 16L, 16L, 17L, 17L, 17L, 17L, 
                                 17L, 17L, 17L, 18L, 18L, 18L, 18L, 18L, 18L, 18L), .Label = c("A", 
                                                                                               "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", 
                                                                                               "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"), class = "factor"), 
               Year = c(2015L, 1991L, 1993L, 1996L, 2000L, 2004L, 2011L, 
                        2015L, 1991L, 1993L, 1996L, 2000L, 2004L, 2011L, 2015L, 1991L, 
                        1993L, 1996L, 2000L, 2004L, 2011L, 2015L, 1993L, 1996L, 2000L, 
                        2004L, 2011L, 2015L, 1991L, 1993L, 1996L, 2000L, 2004L, 2011L, 
                        2015L, 1991L, 1993L, 1996L, 2000L, 2004L, 2011L, 2015L, 1991L, 
                        1993L, 1996L, 2000L, 2004L, 2011L, 2015L, 1991L, 1993L, 1996L, 
                        2000L, 2004L, 2011L, 2015L, 1993L, 1996L, 2000L, 2004L, 2011L, 
                        2015L, 2015L, 1991L, 1993L, 1996L, 2000L, 2004L, 2011L, 2015L, 
                        1991L, 1993L, 1996L, 2000L, 2011L, 2015L, 1991L, 1993L, 1996L, 
                        2000L, 2004L, 2011L, 2015L, 1991L, 1993L, 1996L, 2000L, 2004L, 
                        2011L, 2015L), 
               Val = c(25.6, 22.93, 20.82, 24.1, 24.5, 29, 
                       25.55, 24.5, 24.52, 20.73, 25.8, 25.5, 29.5, 27.7, 25.1, 
                       25, 24.55, 26.75, 25, 30.5, 27.25, 25.1, 22.4, 27.07, 26, 
                       29, 27.2, 24.2, 23, 24.27, 27.68, 27, 30.5, 28.1, 24.9, 23.75, 
                       22.75, 27.25, 25, 29, 28.45, 24, 20.25, 17.07, 24.45, 25, 
                       28.5, 26.75, 24.9, 21.25, 20.65, 25.1, 24.5, 26.5, 25.35, 
                       23.5, 21.93, 26.5, 24.5, 29, 29.1, 26.4, 28.1, 23.75, 26.5, 
                       28.05, 27, 30.5, 25.65, 23.3, 23.25, 24.57, 26.07, 27.5, 
                       28.85, 27.7, 22, 23.43, 26.88, 27, 30.5, 29.25, 28.1, 23, 
                       23.8, 28.32, 27, 29.5, 29.15, 27.6)), 
               row.names = c(1L, 4L, 
                           5L, 6L, 7L, 8L, 9L, 10L, 13L, 14L, 15L, 16L, 17L, 18L, 19L, 20L, 
                           21L, 22L, 23L, 24L, 25L, 26L, 27L, 28L, 29L, 30L, 31L, 32L, 35L, 
                           36L, 37L, 38L, 39L, 40L, 41L, 44L, 45L, 46L, 47L, 48L, 49L, 50L, 
                           53L, 54L, 55L, 56L, 57L, 58L, 59L, 62L, 63L, 64L, 65L, 66L, 67L, 
                           68L, 69L, 70L, 71L, 72L, 73L, 74L, 75L, 78L, 79L, 80L, 81L, 82L, 
                           83L, 84L, 87L, 88L, 89L, 90L, 91L, 92L, 95L, 96L, 97L, 98L, 99L, 
                           100L, 101L, 104L, 105L, 106L, 107L, 108L, 109L, 110L), 
               na.action = structure(c(2L, 
                          3L, 11L, 12L, 33L, 34L, 42L, 43L, 51L, 52L, 60L, 61L, 76L, 77L, 
                          85L, 86L, 93L, 94L, 102L, 103L), 
                .Names = c("2", "3", "11", "12","33", "34", "42", "43", "51", "52", "60", 
                           "61", "76", "77", "85", "86", "93", "94", "102", "103"), class = "omit"), 
                class = "data.frame", .Names = c("Var","Year", "Val"))


df1 %>%
        group_by(Var) %>%
        do(mutate(.,resid = resid(lm(Val ~ Year, data=., na.action = na.exclude)))) %>%
        ggplot(aes(Year, resid)) +
        labs(y=paste0("Val "), x="Year") +
        geom_line(aes(group = Var), alpha = 1/5) +
        geom_line(stat = "summary", fun.y = "mean", colour = "red")

enter image description here

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