2019-01-31

Cómo controlar la dispersión de puntos dentro de un diagrama de violín con ggplot2

Problem

Queremos controlar la dispersión de puntos dentro de un diagrama de violín con ggplot2.

library(tidyverse)
p <- ggplot(mpg, aes(class, hwy))
p + geom_violin() + geom_jitter()

Solución

  • Opción 1
  • Ampliamos la anchura del diagrama de violín (width = 1.3), y jugamos con la transparencia y la variación horizontal de geom_ jitter con (width = .02). No es una opción enteramente satisfactoria. Al restringir la variación horizontal de geom_ jitter, limitamos la propia finalidad de la función que es evitar la superposición de puntos.

    p + geom_violin(width = 1.3) + geom_jitter(alpha = 0.2, width = .02)
    
  • Opción 2
  • Empleamos la función geom_quasirandom del paquete geom_beeswarm:

    The quasirandom geom is a convenient means to offset points within categories to reduce overplotting. Uses the vipor package

    library(ggbeeswarm)
    p + geom_violin(width = 1.3) + geom_quasirandom(alpha = 0.2, width = 0.2)
    

Entradas relacionadas

Referencias

How to restrain scattered jitter points within a violin plot using ggplot2

Problem

We would like to restrain the scattered jitter points within a violin plot using ggplot2.

library(tidyverse)
p <- ggplot(mpg, aes(class, hwy))
p + geom_violin() + geom_jitter()

Solution

  • Option 1
  • Not a completely satisfactory option, because by restricting the horizontal jitter we defeat the purpose of handling overplotting. But we can enlarge the width of the violin plots (width = 1.3), and play with alpha for transparency and limit the horizontal jitter (width = .02).

    p + geom_violin(width = 1.3) + geom_jitter(alpha = 0.2, width = .02)
    
  • Option 2
  • Using the function geom_quasirandom from package geom_beeswarm:

    The quasirandom geom is a convenient means to offset points within categories to reduce overplotting. Uses the vipor package

    library(ggbeeswarm)
    p + geom_violin(width = 1.3) + geom_quasirandom(alpha = 0.2, width = 0.2)
    

Related posts

References

2019-01-18

Cómo transponer un data frame en R

Problema

Queremos transponer un data frame.

df <-
  structure(
    list(
      Country.Name = c("Country1", "Country2", "Country3"),
      `1997` = c(1L, 2L, 4L),
      `1998` = c(1L, 4L, 2L),
      `1999` = c(1L, 7L, 1L),
      `2000` = c(1L, 10L, 5L)
    ),
    .Names = c("Country.Name",
               "1997", "1998", "1999", "2000"),
    class = "data.frame",
    row.names = c(NA,-3L)
  )
  Country.Name 1997 1998 1999 2000
1     Country1    1    1    1    1
2     Country2    2    4    7   10
3     Country3    4    2    1    5

Solución

Empleamos la función t que transpone una matriz o data frame.

# Transpone todas las columnas menos la primer
df_transpose <- data.frame(t(df[-1]))
# Añadimos los nombres de las columnas
colnames(df_transpose) <- df[, 1]
df_transpose
     Country1 Country2 Country3
1997        1        2        4
1998        1        4        2
1999        1        7        1
2000        1       10        5

Entradas relacionadas

Referenciass

2019-01-16

How do I transpose a data frame in R?

Problem

We need to transpose a data frame.

df <-
  structure(
    list(
      Country.Name = c("Country1", "Country2", "Country3"),
      `1997` = c(1L, 2L, 4L),
      `1998` = c(1L, 4L, 2L),
      `1999` = c(1L, 7L, 1L),
      `2000` = c(1L, 10L, 5L)
    ),
    .Names = c("Country.Name",
               "1997", "1998", "1999", "2000"),
    class = "data.frame",
    row.names = c(NA,-3L)
  )
  Country.Name 1997 1998 1999 2000
1     Country1    1    1    1    1
2     Country2    2    4    7   10
3     Country3    4    2    1    5

Solution

The t function will return the transpose of a matrix or data frame.

# Transpose all but the firs column
df_transpose <- data.frame(t(df[-1]))
# Add column names
colnames(df_transpose) <- df[, 1]
df_transpose
     Country1 Country2 Country3
1997        1        2        4
1998        1        4        2
1999        1        7        1
2000        1       10        5

Related posts

References

2019-01-10

Loops with ggplot2

Problem

We want to create a loop and save plots for each subset of data using ggplot2. Instead of plotting on the same panel using facet_wrap o facet_grid, we'd like to display and save eachplot separately.

library(tidyverse)
p <- ggplot(iris, aes(Sepal.Length, Sepal.Width)) + geom_point()
p + facet_wrap(vars(Species), scales = "free")

Solution

We create an empty list to store all plots. Then, we start a loop for each unique element of the variable (column) Species. To keep the same title format, we leave the function facet_wrap.

# Loop
plots <- list() # Empty list
p_list <- unique(iris$Species)
for (i in seq_along(p_list)) {
  # Plot for each Species
  p <- iris %>% filter(Species == p_list[i]) %>%
    ggplot(aes(Sepal.Length, Sepal.Width)) +
    geom_point() +
    facet_wrap( ~ Species) # Títulos
  plots[[i]] = p
  print(p)
}
To print the whole plot list or a specific element:

# Print list
print(plots)
# Print an element of the list
print(plots[[1]])

Related posts

References

2019-01-09

Usar bucles en ggplot2

Problema

Queremos crear y guardar gráficos separadamente con ggplot2. Es decir, en lugar de mostrar los gráficos en un mismo panel con facet_wrap o facet_grid, queremos crear gráficos independientes, cada uno en un panel y almacenarlos en una lista.

library(tidyverse)
p <- ggplot(iris, aes(Sepal.Length, Sepal.Width)) + geom_point()
p + facet_wrap(vars(Species), scales = "free")

Solución

Creamos una lista vacía donde almacenaremos los gráficos. Iniciamos un bucle generando uno gráfico con ggplot2 para cada elemento único de la lista de especies. Dejamos la función facet_wrap, aunque cada gráfico está en un único panel, para obtener el título de cada especie.

# Bucle
plots <- list() # Creamos una lista vacía
p_list <- unique(iris$Species)
for (i in seq_along(p_list)) {
  # Gráfico por especie
  p <- iris %>% filter(Species == p_list[i]) %>%
    ggplot(aes(Sepal.Length, Sepal.Width)) +
    geom_point() +
    facet_wrap( ~ Species) # Títulos
  plots[[i]] = p
  print(p)
}
Para volver a imprimir la lista completa de gráficos o uno específico.

# Imprime lista completa
print(plots)
# Imprime uno específico
print(plots[[1]])

Entradas relacionadas

Referencias

2019-01-02

Representar shapefiles (SHP) con ggplot2

Problema

Deseamos representar shapefiles (SHP) con ggplot2. Obtendremos los datos de las regiones administratitvas siguiendo los pasos de esta entrada.

Solución

Voy a representar los municipios de España. Generaré unos datos aleatorios para cada uno de ellos y asignarles luego una escala continua. Creo dos gráficos separados para península y Baleares, y Canarias para ganar en claridad. Finalmente represento Castilla-La Mancha, y dejo un enlace a un pdf para poder hacer zoom en el resto de la península y Baleares y apreciar el detalle.

library(tidyverse)
library(raster)
shp <- getData("GADM", country = "ES", level = 4)
shp.pen <- shp[shp@data$NAME_1 != "Islas Canarias", ]
shp.can <- shp[shp@data$NAME_1 == "Islas Canarias", ]

# Convertimos shapefiles a data frames
df.spain <- fortify(shp, region = "NAME_4")
df.pen <- fortify(shp.pen, region = "NAME_4")
df.can <- fortify(shp.can, region = "NAME_4")

# Datos aleatorios
set.seed(2015)
random.df <- data.frame(id = unique(df.spain[, 'id']),
                        random = runif(
                          n = length(unique(df.spain[, 'id'])),
                          min = 25,
                          max = 75
                        ))
df.pen <-
  merge(df.pen, random.df, by = 'id', all.x = TRUE)
df.can <-
  merge(df.can, random.df, by = 'id', all.x = TRUE)

# Gráficos con ggplot2
# Península y Baleares
p.pen <-
  ggplot(df.pen, aes(x = long, y = lat, group = group)) +
  geom_polygon(aes(fill = random), colour = "white", size = 0.1) +
  labs(x = " ", y = " ") +
  theme_bw() +
  scale_fill_viridis_c('Datos aleatorios', option = "magma", direction = -1) +
  coord_map() +
  theme(
    panel.grid.minor = element_blank(),
    panel.grid.major = element_blank(),
    panel.border = element_blank(),
    axis.ticks = element_blank(),
    axis.text.x = element_blank(),
    axis.text.y = element_blank(),
    legend.position = "bottom"
  )

# Canarias
p.can <-
  ggplot(df.can, aes(x = long, y = lat, group = group)) +
  geom_polygon(aes(fill = random), colour = "white", size = 0.1) +
  labs(x = " ", y = " ") +
  theme_bw() +
  scale_fill_viridis_c('Datos aleatorios', option = "magma", direction = -1) +
  coord_map() +
  theme(
    panel.grid.minor = element_blank(),
    panel.grid.major = element_blank(),
    panel.border = element_blank(),
    axis.ticks = element_blank(),
    axis.text.x = element_blank(),
    axis.text.y = element_blank(),
    legend.position = "bottom"
  )


# Mostramos los gráficos
p.pen
p.can

Mapas

Enlace al pdf.

  • Península y Baleares
  • Canarias
  • Castilla-La Mancha
  • Entradas relacionadas

    Referencias

    Nube de datos