¿Cuál es una buena manera de usar R para hacer un diagrama de dispersión que separa los datos por tratamiento?

30

Soy muy nuevo con R y las estadísticas en general, pero necesito hacer un diagrama de dispersión que creo que podría estar más allá de sus capacidades nativas.

Tengo un par de vectores de observaciones y quiero hacer un diagrama de dispersión con ellos, y cada par se divide en una de tres categorías. Me gustaría hacer un diagrama de dispersión que separe cada categoría, ya sea por color o por símbolo. Creo que esto sería mejor que generar tres diagramas de dispersión diferentes.

Tengo otro problema con el hecho de que en cada una de las categorías, hay grandes grupos en un punto, pero los grupos son más grandes en un grupo que en los otros dos.

¿Alguien sabe una buena manera de hacer esto? ¿Paquetes que debo instalar y aprender a usar? Alguien hizo algo similar?

Gracias

crf
fuente

Respuestas:

53

grupos grandes : si la sobreimpresión es un problema, puede usar un alfa más bajo, por lo que los puntos individuales son tenues, pero el sobreimpresión produce un color más intenso. O cambia a histogramas 2D o estimaciones de densidad.

require ("ggplot2")
  • ggplot (iris, aes (x = Sepal.Length, y = Sepal.Width, colour = Species)) + stat_density2d ()
    densidad
    Probablemente quieras enfrentar esto ...

  • ggplot (iris, aes (x = Sepal.Length, y = Sepal.Width, fill = Species)) + stat_binhex (bins=5, aes (alpha = ..count..)) + facet_grid (. ~ Species)
    hexbin
    Si bien puedes obtener esta trama también sin facetas, el orden de las especies influye en la imagen final.

  • Puede evitar esto si está dispuesto a ensuciarse un poco las manos (= enlace a la explicación y al código) y calcular colores mezclados para los hexágonos: ingrese la descripción de la imagen aquí

  • Otra cosa útil es usar contenedores (hex) para áreas de alta densidad y trazar puntos individuales para otras partes:

    ggplot (df, aes (x = date, y = t5)) + 
      stat_binhex (data = df [df$t5 <= 0.5,], bins = nrow (df) / 250) +
          geom_point (data = df [df$t5 > 0.5,], aes (col = type), shape = 3) +
      scale_fill_gradient (low = "#AAAAFF", high = "#000080") +
      scale_colour_manual ("response type", 
        values = c (normal = "black", timeout = "red")) + 
      ylab ("t / s")
    

    ingrese la descripción de la imagen aquí


En aras de la exhaustividad de los paquetes de trazado, me dejó también mencionan lattice:

require ("lattice")
  • xyplot(Sepal.Width ~ Sepal.Length | Species, iris, pch= 20)
    <code> xyplot (Sepal.Width ~ Sepal.Length | Species, iris, pch = 20) </code>

  • xyplot(Sepal.Width ~ Sepal.Length, iris, groups = iris$Species, pch= 20)
    <code> xyplot (Sepal.Width ~ Sepal.Length, iris, groups = iris $ Species, pch = 20) </code>

  • xyplot(Sepal.Width ~ Sepal.Length | Species, iris, groups = iris$Species, pch= 20)
    <code> xyplot (Sepal.Width ~ Sepal.Length | Species, iris, groups = iris $ Species, pch = 20) </code>

cbeleites apoya a Monica
fuente
¡Encantador! Muchas gracias, ¡los contenedores hexagonales funcionaron perfectamente!
crf
22

Este es uno de los problemas clásicos para el conjunto de datos 'Iris'. Este es un enlace a un conjunto completo de proyectos de trazado basados ​​en ese conjunto de datos con código R, que puede adaptar a su problema.

Aquí hay un enfoque que se usa con base R en lugar de un paquete complementario.

plot(iris$Petal.Length, iris$Petal.Width, pch=21, 
     bg=c("red","green3","blue")[unclass(iris$Species)], 
     main="Edgar Anderson's Iris Data")

que produce esta figura:

ingrese la descripción de la imagen aquí

A partir de ahí, dependiendo de su trama, puede comenzar a jugar con los niveles alfa / transparencia para permitir la sobreplotación, etc., pero primero me basaría en un gráfico muy básico.

Si bien hay muchas razones para seguir con la base R, otros paquetes simplifican el trazado. Separar los datos por una característica distintiva es uno de los puntos fuertes de los paquetes ggplot2 y reticular . ggplot2 crea gráficos particularmente atractivos visualmente. Ambos paquetes se muestran en la respuesta de @cbeleites.

Fomite
fuente
44
Ligeramente confuso porque, aunque recomienda ggplot2, ¿no lo usa en su ejemplo? Un equivalente de ggplot2 sería una biblioteca (ggplot2); qplot (Petal.Length, Petal.Width, color = Species, data = iris, main = "Edgar Anderson Iris Data"). Esto también tiene la ventaja de producir automáticamente una leyenda.
Peter Ellis
@PeterEllis Eso es porque si bien puedo reconocer algo que se presta bien a ggplot2, solo soy pasivamente competente con los gráficos básicos.
Fomite
1
Gran truco con unclass () en gráficos base BTW
Peter Ellis
16

O con ggplot2:

ggplot(iris, aes(x = Sepal.Length, y = Sepal.Width, colour = Species)) + geom_point()
ggplot(iris, aes(x = Sepal.Length, y = Sepal.Width)) + geom_point() + facet_grid(~Species)

Que produce

ingrese la descripción de la imagen aquí

ingrese la descripción de la imagen aquí

Roman Luštrik
fuente