Mostrando entradas con la etiqueta diagrama de dispersión. Mostrar todas las entradas
Mostrando entradas con la etiqueta diagrama de dispersión. Mostrar todas las entradas

2017-01-16

Destacar subconjunto de puntos en un diagrama de dispersión con ggplot2

Problema

Deseamos resaltar un determinado número de puntos de un diagrama de dispersión. En nuestro ejemplo, usamos el conjunto de datos mpg (Fuel economy data from 1999 and 2008 for 38 popular models of car). Queremos destacar en rojo y con un tamaño mayor, aquellos cuyo displ (engine displacement) sea mayor de 5 y hwy (highway miles per gallon) mayor de 20.

Solución

  • Alternativa 1
  • Añadimos la condición lógica para ambos atributos, color y tamaño del punto dentro de geom_point. Después cambiamos manualmente ambos con scale_colour_manual y scale_size_manual. Finalmente eliminamos la leyenda.

    ggplot(data = mpg) + 
      geom_point(mapping = aes(x = displ, y = hwy, colour = displ > 5 & hwy > 20, size = displ > 5 & hwy > 20)) + 
      scale_colour_manual(values = c("black", "red")) + 
      scale_size_manual(values =c(1.5, 3))+
      theme(legend.position = "none")
    
  • Alternativa 2
  • Creamos dos capas de puntos con geom_point. La primera en negro incluye todos los puntos. La segunda en rojo y con un tamaño de punto mayor para el subconjunto del data frame deseado.

    ggplot(data = mpg) + 
      geom_point(mapping = aes(x = displ, y = hwy), colour= "black") +
      geom_point(data = subset(mpg, displ > 5 & hwy > 20), aes(x = displ, y = hwy), colour= "red", size = 3)
     
    En ggplot2 las capas se añaden en el orden especificado en el código. Si alteráramos el orden de las dos capas (geom_point), obtendríamos el siguiente resultado.

    ggplot(data = mpg) + 
       geom_point(data = subset(mpg, displ > 5 & hwy > 20), aes(x = displ, y = hwy), colour= "red", size = 3) +
       geom_point(mapping = aes(x = displ, y = hwy), colour= "black")
     

    Entradas relacionadas

    2016-01-09

    Cómo añadir etiquetas a los extremos de una leyenda continua en ggplot2

    Title

    Problema

    Queremos añadir etiquetas a los extremos de una legenda continua en ggplot2. Así podremos saber el mínimo y el máximo.

    library(ggplot2)
    d <- subset(diamonds, price >= 257 & price <= 8888)
    ggplot(d, aes(depth, carat, colour = price)) +
      geom_point() +
      scale_colour_gradient(limits = c(257, 8888))
    

    Se observa en la leyenda como las etiquetas van del 2.000 al 8.000 pero no sabemos ni el mínimo ni el máximo.

    Solución

    Dentro de scale_colour_gradient, especificamos los argumentos breaks y labels.

    ggplot(d, aes(depth, carat, colour = price)) +
      geom_point() +
      scale_colour_gradient(limits = c(257, 8888), 
                            breaks = c(257, 2000, 4000, 6000, 8000, 8888),
                            labels = c(257, 2000, 4000, 6000, 8000, 8888))
    

    Ahora hemos añadido a la leyenda el mínimo 257 y el máximo 8.888.

    Extra

    Si queremos que en lugar de una escala de azules, parta de un color diferente, por ejemplo el rojo, añadimos el argumento low. Si queremos modificar el color superior introduciríamos el argumento high.

    ggplot(d, aes(depth, carat, colour = price)) +
      geom_point() +
      scale_colour_gradient(limits = c(257, 8888), 
                            breaks=c(257, 2000, 4000, 6000, 8000, 8888),
                            labels=c(257, 2000, 4000, 6000, 8000, 8888), low = "red")
    

    Referencias

    Entradas relacionadas

    2015-11-23

    Diagramas de dispersión con el paquete car en R

    Title

    Introducción

    La función scatterplot del paquete car nos permite crear diagramas de dispersión mejorados. Incluye diagramas de caja en los márgenes, rectas de regresión suavizadas, identificación de valores atípicos etc. Veremos varios ejemplos usando datos (data frames) incluidos en el propio paquete car: Prestige y UN.

    library(car)
    head(Prestige)
    
                         education income women prestige census type
    gov.administrators      13.11  12351 11.16     68.8   1113 prof
    general.managers        12.26  25879  4.02     69.1   1130 prof
    accountants             12.77   9271 15.70     63.4   1171 prof
    purchasing.officers     11.42   8865  9.11     56.8   1175 prof
    chemists                14.62   8403 11.68     73.5   2111 prof
    physicists              15.64  11030  5.13     77.6   2113 prof
    

    Ejemplos

    1. Gráfico relacionando la renta y la educación, incluyendo diagramas de caja en los ejes y regresión local (línea LOESS). Empleamos el formato fórmula y ~ x para indicar las variables a representar.
    2. scatterplot(education ~ income,
                  data = Prestige,
                  pch = 16,
                  col = "darkblue",
                  main = "Educación y Renta\n del conjunto de datos \"Prestige\"",
                  xlab = "Renta (dollares)",
                  ylab = "Educación (años)")
      
    3. Añadiendo elipses donde se concentran los datos
    4. scatterplot(prestige ~ income, data = Prestige, ellipse = TRUE)
      

    5. Representamos grupos siguiendo el formato y ~ x | z, en el que z evalúa como un factor otra variable pare dividir los datos en grupos.
    6. scatterplot(prestige ~ income|type, data = Prestige, legend.coords = "topleft")

    7. Etiquetar un número determinado de puntos.

    8. Por defecto id.n = 0, lo especificamos para indicar el número de puntos que deseamos etiquetar.
      scatterplot(infant.mortality ~ gdp, log = "xy", data = UN, id.n = 5)

    9. Etiquetar los datos interactivamente.

    10. Utilizamos el argumento id.method para etiquetar de la misma manera que hicimos con la función identify.

      scatterplot(infant.mortality ~ gdp, id.method = "identify", data = UN)

    Entradas relacionadas

    Referencias

    2015-10-21

    Etiquetar un diagrama de dispersión en ggplot2 basándonos en otra columna

    Title

    Problema

    Deseamos etiquetar solamente aquellos puntos de un diagrama de dispersión que cumplan una condición basada en otra columna de un data frame. En nuestro ejemplo, solamente aquellos puntos de la columna b cuyo valor sea mayor de 0.5

    set.seed(1)
    x <- data.frame(a = 1:10, b = rnorm(10))
    x$lab <- letters[1:10]
    
        a          b lab
    1   1 -0.6264538   a
    2   2  0.1836433   b
    3   3 -0.8356286   c
    4   4  1.5952808   d
    5   5  0.3295078   e
    6   6 -0.8204684   f
    7   7  0.4874291   g
    8   8  0.7383247   h
    9   9  0.5757814   i
    10 10 -0.3053884   j
    

    Solución

  • Opción 1
  • Crear un subconjunto (subset) dentro de la función geom_text.

    ggplot(data = x, aes(a, b, label = lab)) + 
      geom_point() + 
      geom_text(data = subset(x, abs(b) > 0.2), vjust = 1.5)
    

  • Opción 2
  • Asignando NA a aquellos valores que no queremos etiquetar

    x$lab[!(abs(x$b) > 0.5)] <- NA
    ggplot(data = x, aes(a, b, label = lab)) + 
        geom_point() + 
        geom_text(vjust = 1.5) 
    
    Usando qplot:
    qplot(a, b, data = x, label = lab, geom = c('point','text'), vjust = 1.5)
    

    Resultado

    Entradas relacionadas

    Referencias

    2015-05-13

    Etiquetar selectivamente los puntos de un diagrama de dispersión con ggplot2

    Title

    Problema

    Tenemos un diagrama de dispersión.

    qplot(dpi, sr, data = LifeCycleSavings)
    
    Si etiquetáramos todos los puntos obtendríamos un gráfico con muchas de las etiquetas superpuestas.

    qplot(dpi, sr, data = LifeCycleSavings, label = rownames(data))+
      geom_text(vjust = 1.5)
    

    Solución

    Opción 1

    LifeCycleSavings$lab <- rownames(LifeCycleSavings)
    newlab <- subset(LifeCycleSavings, lab %in% c("Canada", "Sweden", "United Kingdom", "United States", "Iceland", "Japan", "Spain", "Netherlands", "Switzerland", "Denmark"))
    
    1. lab, creamos una nueva columna con los nombres de las filas.
    2. newlab, subconjunto de las filas que deseamos etiquetar.
    3. Utilizamos lab dentro de aes y las nuevas, newlab, en geom_text.
    • qplot
    qplot(dpi, sr, data = LifeCycleSavings, label = lab)+  
      geom_text(data = newlab , vjust = 1.5)
    
    • ggplot
    ggplot(LifeCycleSavings, aes(x = dpi, y = sr, label = lab)) + 
      geom_point() + 
      geom_text(data = newlab , vjust = 1.5)
    
    Opción 2

    Name <- rownames(LifeCycleSavings)
    idx <- Name %in% c("Canada", "Sweden", "United Kingdom", "United States", "Iceland", "Japan", "Spain", "Netherlands", "Switzerland", "Denmark") 
    Name[!idx] <- NA
    
    1. Name, vector con los nombres de las etiquetas: nombres de las filas.
    2. idx, vector lógico (verdadero o falso) con TRUE para las etiquetas que deseamos conservar.
    3. Asignamos al vector Name el valor NA para aquellos nombres no presentes en el vector anterior.
    • qplot
    qplot(dpi, sr, data = LifeCycleSavings, label = Name)+  
      geom_text(vjust = 1)
    
    • ggplot
    p <- ggplot(LifeCycleSavings, aes(x = dpi, y = sr, label = Name))
    p +  geom_point() + geom_text(vjust = 1.5)
    
    Opción3

    Con el paquete base graphics

    plot(sr ~ dpi, 
         LifeCycleSavings, 
         xlab = 'Real Per-Capita Disposable Income', 
         ylab = 'Aggregate Personal Savings', 
         main = 'Intercountry Life-Cycle Savings Data')
    text(LifeCycleSavings$dpi,
         LifeCycleSavings$sr,
         Name, pos = 1)
    

    Referencias

    2015-04-29

    Etiquetar los puntos de un diagrama de dispersión con ggplot2

    Title Anteriormente vimos cómo etiquetar los puntos de un diagrama de dispersión mediante la función text del paquete graphics. En esta entrada lo haremos como ggplot2.

    Problema

    Tenemos un diagrama de dispersión y deseamos etiquetar puntos. Para ganar en claridad seleccionaremos solamente los 10 primeros puntos.

    data <- LifeCycleSavings[1:10, ]
    qplot(dpi, sr, data = data)
    

    Solución

    Utilizamos la función geom_text para etiquetar los puntos del diagrama de dispersión.

    • qplot
    qplot(dpi, sr, data = data, label = rownames(data))+  
      geom_text(vjust = 1.5)
    
    • ggplot
    p <- ggplot(data, aes(x = dpi, y = sr, label = rownames(data)))
    p +  geom_point() + geom_text(vjust = 1.5)
    

    Notas

    Con el argumento vjust cambiamos la posición de la etiqueta verticalmente. Por defecto encima del punto, lo aumentamos 1.5 para situarlo debajo. Con hjust se puede cambiar la posición de la etiqueta horizontalmente.

    Referencias

    Nube de datos