Capítulo 4. Gráficos lineales

Este trabajo se ha traducido utilizando IA. Agradecemos tus opiniones y comentarios: translation-feedback@oreilly.com

Línea Los gráficos se suelen utilizar para visualizar cómo cambia una variable continua, en el eje y, en relación con otra variable continua, en el eje x. A menudo, la variable x representa el tiempo, pero también puede representar alguna otra cantidad continua; por ejemplo, la cantidad de un fármaco administrado a sujetos experimentales.

Como con los gráficos de barras, hay excepciones. Los gráficos de líneas también pueden utilizarse con una variable discreta en el eje x. Esto es adecuado cuando la variable está ordenada (por ejemplo, "pequeño", "mediano", "grande"), pero no cuando la variable no está ordenada (por ejemplo, "vaca", "ganso", "cerdo"). La mayoría de los ejemplos de este capítulo utilizan una variable continua x, pero veremos un ejemplo en el que la variable se convierte en un factor y, por tanto, se trata como una variable discreta.

4.1 Hacer un gráfico lineal básico

Problema

En querrás hacer un gráfico lineal básico.

Solución

Utiliza ggplot() con geom_line(), y especifica qué variables has mapeado a x y y (Figura 4-1):

ggplot(BOD, aes(x = Time, y = demand)) +
  geom_line()
Basic line graph
Figura 4-1. Gráfico lineal básico

Debate

En este conjunto de datos de muestra, la variable x, Time, está en una columna y la variable y, demand, está en otra:

BOD
#>   Time demand
#> 1    1    8.3
#> 2    2   10.3
#> 3    3   19.0
#> 4    4   16.0
#> 5    5   15.6
#> 6    7   19.8

Los gráficos de líneas pueden hacerse con variables discretas (categóricas) o continuas (numéricas) en el eje x. En este ejemplo, la variabledemand es numérica, pero podría tratarse como una variable categórica convirtiéndola en un factor con factor() (Figura 4-2). Cuando la variable x es un factor, también debes utilizar aes(group=1) para asegurarte de que ggplot sabe que los puntos de datos pertenecen juntos y deben conectarse con una línea (consulta la Receta 4.3 para obtener una explicación de por qué group es necesaria con los factores):

BOD1 <- BOD  # Make a copy of the data
BOD1$Time <- factor(BOD1$Time)

ggplot(BOD1, aes(x = Time, y = demand, group = 1)) +
  geom_line()
Basic line graph with a factor on the x-axis (notice that no space is allocated on the x-axis for 6)
Figura 4-2. Gráfico lineal básico con un factor en el eje x (observa que no se ha asignado espacio en el eje x para 6)

En el conjunto de datos BOD no hay ninguna entrada para Time = 6, por lo que no hay nivel 6 cuando Time se convierte en un factor. Los factores contienen valores categóricos, y en ese contexto, 6 es sólo otro valor. Da la casualidad de que no está en el conjunto de datos, así que no hay espacio para él en el eje x.

Con ggplot2, el rango y por defecto de un gráfico lineal es el justo para incluir los valores y de los datos. Para algunos tipos de datos, es mejor que el rango y comience en cero. Puedes utilizar ylim() para establecer el rango, o puedes utilizar expand_limits() para ampliar el rango e incluir un valor. Esto fijará el rango desde cero hasta el valor máximo de la columna de demanda en BOD (Figura 4-3):

# These have the same result
ggplot(BOD, aes(x = Time, y = demand)) +
  geom_line() +
  ylim(0, max(BOD$demand))

ggplot(BOD, aes(x = Time, y = demand)) +
  geom_line() +
  expand_limits(y = 0)
Line graph with manually set y range
Figura 4-3. Gráfico lineal con rango y ajustado manualmente

Ver también

Consulta la Receta 8.2 para saber más sobre el control de el alcance de los ejes.

4.2 Añadir puntos a una gráfica lineal

Problema

En quieres añadir puntos a un gráfico lineal.

Solución

Añade geom_point() (Figura 4-4):

ggplot(BOD, aes(x = Time, y = demand)) +
  geom_line() +
  geom_point()
Line graph with points
Figura 4-4. Gráfico lineal con puntos

Debate

A veces es útil indicar cada punto de datos en un gráfico lineal. Esto es útil cuando la densidad de observaciones es baja, o cuando las observaciones no se producen a intervalos regulares. Por ejemplo, en el conjunto de datosBOD no hay ninguna entrada para Time=6, pero esto no se aprecia en un simple gráfico lineal (compara la Figura 4-3 con la Figura 4-4).

En el conjunto de datos worldpop, los intervalos entre cada punto de datos no son coherentes. En el pasado lejano, las estimaciones no eran tan frecuentes como en el pasado más reciente. La visualización de los puntos en el gráfico ilustra cuándo se realizó cada estimación(Figura 4-5):

library(gcookbook) # Load gcookbook for the worldpop data set

ggplot(worldpop, aes(x = Year, y = Population)) +
  geom_line() +
  geom_point()

# Same with a log y-axis
ggplot(worldpop, aes(x = Year, y = Population)) +
  geom_line() +
  geom_point() +
  scale_y_log10()
Top: points indicate where each data point is; bottom: the same data with a log y-axis
Figura 4-5. Arriba: los puntos indican dónde está cada punto de datos; Abajo: los mismos datos con un eje log y

Con el eje log y, puedes ver que la tasa de cambio proporcional ha aumentado en los últimos mil años. Las estimaciones para los años anteriores a 0 tienen una tasa de cambio aproximadamente constante de 10 veces por cada 5.000 años. En los últimos 1.000 años, la población ha aumentado a un ritmo mucho más rápido. También podemos ver que las estimaciones de población son mucho más frecuentes en los últimos tiempos, ¡y probablemente más precisas!

Ver también

Para cambiar el aspecto de los puntos, consulta la Receta 4.5.

4.3 Hacer una gráfica lineal con varias líneas

Problema

En querrás hacer un gráfico lineal con más de una línea.

Solución

En además de las variables asignadas a los ejes x e y, asigna otra variable (discreta) a colour o linetype, como se muestra en la Figura 4-6:

library(gcookbook) # Load gcookbook for the tg data set

# Map supp to colour
ggplot(tg, aes(x = dose, y = length, colour = supp)) +
  geom_line()

# Map supp to linetype
ggplot(tg, aes(x = dose, y = length, linetype = supp)) +
  geom_line()
A variable mapped to colour (left); A variable mapped to linetype (right)
Figura 4-6. Una variable asignada a un color (izquierda); Una variable asignada a un tipo de línea (derecha)

Debate

Los datos de tg tienen tres columnas, incluido el factor supp, que hemos asignado a colour y linetype:

tg
#>   supp dose length
#> 1   OJ  0.5  13.23
#> 2   OJ  1.0  22.70
#> 3   OJ  2.0  26.06
#> 4   VC  0.5   7.98
#> 5   VC  1.0  16.77
#> 6   VC  2.0  26.14
Nota

Si la variable x es un factor, también debes decirle a ggplot que agrupe por esa misma variable, como se describe a continuación.

Línea Los gráficos pueden utilizarse con una variable continua o categórica en el eje x. A veces, la variable asignada al eje x se concibe como categórica, aunque esté almacenada como un número. En este ejemplo, hay tres valores de dose: 0,5, 1,0 y 2,0. Puede que quieras tratarlos como categorías en lugar de como valores de una escala continua. Para ello, convierte dose en un factor(Figura 4-7):

ggplot(tg, aes(x = factor(dose), y = length, colour = supp, group = supp)) +
  geom_line()
Line graph with continuous x variable converted to a factor
Figura 4-7. Gráfica lineal con la variable continua x convertida en factor

Fíjate en el uso de group = supp. Sin esta declaración, ggplot no sabrá cómo agrupar los datos para dibujar las líneas, y dará un error:

ggplot(tg, aes(x = factor(dose), y = length, colour = supp)) + geom_line()
#> geom_path: Each group consists of only one observation. Do you need to
#> adjust the group aesthetic?

Otro problema común cuando se utiliza la agrupación incorrecta es que verás un patrón dentado en dientes de sierra, como en la Figura 4-8:

ggplot(tg, aes(x = dose, y = length)) +
  geom_line()
A sawtooth pattern indicates improper grouping
Figura 4-8. Un patrón en diente de sierra indica una agrupación incorrecta

Esto ocurre porque hay varios puntos de datos en cada posición y, y ggplot piensa que están todos en un mismo grupo. Los puntos de datos de cada grupo se conectan con una sola línea, lo que da lugar al patrón de dientes de sierra. Si alguna variable discreta está asignada a estéticas comocolour o linetype, se utiliza automáticamente como variable de agrupación. Pero si quieres utilizar otras variables para agrupar (que no estén asignadas a una estética), deben utilizarse con group.

Nota

En caso de duda, si tu gráfico de líneas tiene un aspecto incorrecto, prueba a especificar explícitamente la variable de agrupación con group. Es habitual que se produzcan problemas con los gráficos de líneas porque ggplot no está seguro de cómo deben agruparse las variables.

Si tu gráfico tiene puntos junto con las líneas, también puedes asignar variables a propiedades de los puntos, como shape y fill (Figura 4-9):

ggplot(tg, aes(x = dose, y = length, shape = supp)) +
  geom_line() +
  geom_point(size = 4)  # Make the points a little larger

ggplot(tg, aes(x = dose, y = length, fill = supp)) +
  geom_line() +
  geom_point(size = 4, shape = 21)  # Also use a point with a color fill
Line graph with different shapes (left); With different colors (right)
Figura 4-9. Gráfico lineal con diferentes formas (izquierda); Con diferentes colores (derecha)

A veces, los puntos de se solaparán. En estos casos, puede que quieras esquivarlos, lo que significa que sus posiciones se ajustarán a izquierda y derecha(Figura 4-10). Al hacerlo, debes esquivar también las líneas, o de lo contrario sólo se moverán los puntos y quedarán desalineados. También debes especificar cuánto deben moverse al esquivarlas:

ggplot(tg, aes(x = dose, y = length, shape = supp)) +
  geom_line(position = position_dodge(0.2)) +           # Dodge lines by 0.2
  geom_point(position = position_dodge(0.2), size = 4)  # Dodge points by 0.2
Dodging to avoid overlapping points
Figura 4-10. Esquivar para evitar la superposición de puntos

4.4 Cambiar la apariencia de las líneas

Problema

En querrás cambiar el aspecto de las líneas de un gráfico lineal.

Solución

El tipo de línea (sólida, discontinua, punteada, etc.) se establece con linetype, el grosor (en mm) con size, y el color de la línea concolour (o color).

Estas propiedades pueden establecerse (como se muestra en la Figura 4-11) pasándoles valores en la llamada a geom_line():

ggplot(BOD, aes(x = Time, y = demand)) +
  geom_line(linetype = "dashed", size = 1, colour = "blue")
Line graph with custom linetype, size, and colour
Figura 4-11. Gráfico de líneas con tipo de línea, tamaño y color personalizados

Si hay más de una línea, el ajuste de las propiedades estéticas afectará a todas las líneas. Por otro lado, asignar variables a las propiedades, como vimos en la Receta 4.3, hará que cada línea tenga un aspecto diferente. Los colores por defecto de no son los más atractivos, por lo que puedes utilizar una paleta diferente, como se muestra en la Figura 4-12, utilizandoscale_colour_brewer() o scale_colour_manual():

library(gcookbook)  # Load gcookbook for the tg data set

ggplot(tg, aes(x = dose, y = length, colour = supp)) +
  geom_line() +
  scale_colour_brewer(palette = "Set1")
Using a palette from RColorBrewer
Figura 4-12. Utilizar una paleta de RColorBrewer

Debate

Para establecer un único color constante para todas las líneas, especifica colour fuera de aes(). Lo mismo funciona para el tamaño, el tipo de línea y la forma del punto(Figura 4-13). Puede que también tengas que especificar la variable de agrupación:

# If both lines have the same properties, you need to specify a variable to
# use for grouping
ggplot(tg, aes(x = dose, y = length, group = supp)) +
  geom_line(colour = "darkgreen", size = 1.5)

# Since supp is mapped to colour, it will automatically be used for grouping
ggplot(tg, aes(x = dose, y = length, colour = supp)) +
  geom_line(linetype = "dashed") +
  geom_point(shape = 22, size = 3, fill = "white")
Line graph with constant size and color (left); With `supp` mapped to `colour`, and with points added (right)
Figura 4-13. Gráfico de líneas con tamaño y color constantes (izquierda); Con supp mapeado a color, y con puntos añadidos (derecha)

Ver también

Para más información sobre el uso de los colores, consulta el Capítulo 12.

4.5 Cambiar la apariencia de los puntos

Problema

En quieres cambiar el aspecto de los puntos de un gráfico lineal.

Solución

En geom_point() , coloca size, shape, colour, y/o fillfuera de aes() (el resultado se muestra en la Figura 4-14):

ggplot(BOD, aes(x = Time, y = demand)) +
  geom_line() +
  geom_point(size = 4, shape = 22, colour = "darkred", fill = "pink")
Points with custom size, shape, color, and fill
Figura 4-14. Puntos con tamaño, forma, color y relleno personalizados

Debate

La forma por defecto de los puntos es un círculo sólido, el tamaño por defecto es 2 y el color por defecto es negro. El color de relleno sólo es relevante para algunas formas de puntos (numeradas del 21 al 25), que tienen contornos y colores de relleno separados (consulta la Receta 5.3 para ver una tabla de formas). El color de relleno suele ser NA, o vacío; puedes rellenarlo de blanco para obtener círculos de aspecto hueco, como se muestra en la Figura 4-15:

ggplot(BOD, aes(x = Time, y = demand)) +
  geom_line() +
  geom_point(size = 4, shape = 21, fill = "white")
Points with a white fill
Figura 4-15. Puntos con relleno blanco

Si los puntos y las líneas tienen colores diferentes, debes especificar los puntos después de las líneas, para que se dibujen encima. De lo contrario, las líneas se dibujarán encima de los puntos.

Para líneas múltiples, en la Receta 4.3 vimos cómo dibujar puntos de distinto color para cada grupo asignando variables a propiedades estéticas de los puntos, dentro de aes(). Los colores por defecto no son muy atractivos, así que quizá quieras usar una paleta diferente, usando scale_colour_brewer()o scale_colour_manual(). Para establecer una única forma o tamaño constante para todos los puntos, como en la Figura 4-16, especifica la forma o el tamaño fuera de aes():

library(gcookbook)  # Load gcookbook for the tg data set

# Save the position_dodge specification because we'll use it multiple times
pd <- position_dodge(0.2)

ggplot(tg, aes(x = dose, y = length, fill = supp)) +
  geom_line(position = pd) +
  geom_point(shape = 21, size = 3, position = pd) +
  scale_fill_manual(values = c("black","white"))
Line graph with manually specified fills of black and white, and a slight dodge
Figura 4-16. Gráfico de líneas con rellenos especificados manualmente de blanco y negro, y un ligero desenfoque

Ver también

Consulta Receta 5.3 para saber más sobre el uso de diferentes formas, y el Capítulo 12 para saber más sobre los colores.

4.6 Hacer una gráfica con un área sombreada

Problema

En quieres hacer un gráfico con una zona sombreada.

Solución

Utiliza geom_area() para obtener un área sombreada, como en la Figura 4-17:

# Convert the sunspot.year data set into a data frame for this example
sunspotyear <- data.frame(
    Year     = as.numeric(time(sunspot.year)),
    Sunspots = as.numeric(sunspot.year)
  )

ggplot(sunspotyear, aes(x = Year, y = Sunspots)) +
  geom_area()
Graph with a shaded area
Figura 4-17. Gráfico con una zona sombreada

Debate

Por defecto, el área se rellenará con un gris muy oscuro y no tendrá contorno. El color puede cambiarse ajustando fill. En el siguiente ejemplo, lo fijaremos en "blue", y también lo haremos transparente en un 80% fijando alpha en 0,2. Esto permite ver las líneas de la cuadrícula a través del área, como se muestra en la Figura 4-18. También añadiremos un contorno, configurando colour:

ggplot(sunspotyear, aes(x = Year, y = Sunspots)) +
  geom_area(colour = "black", fill = "blue", alpha = .2)
Graph with a semitransparent shaded area and an outline
Figura 4-18. Gráfico con un área sombreada semitransparente y un contorno

Tener un contorno alrededor de toda el área puede no ser deseable, porque pone una línea vertical al principio y al final del área sombreada, así como otra a lo largo de la parte inferior. Para evitar este problema, podemos dibujar el área sin contorno (sin especificar colour), y luego superponer ungeom_line(), como se muestra en la Figura 4-19:

ggplot(sunspotyear, aes(x = Year, y = Sunspots)) +
  geom_area(fill = "blue", alpha = .2) +
  geom_line()
Line graph with a line just on top, using `geom_line()`
Figura 4-19. Gráfico lineal con una línea justo encima, utilizando geom_line()

Ver también

Consulta el capítulo 12 para saber más sobre elegir colores.

4.7 Hacer un gráfico de áreas apiladas

Problema

En quieres hacer un gráfico de áreas apiladas.

Solución

Utiliza geom_area() y asigna un factor a fill (Figura 4-20):

library(gcookbook) # Load gcookbook for the uspopage data set

ggplot(uspopage, aes(x = Year, y = Thousands, fill = AgeGroup)) +
  geom_area()
Stacked area graph
Figura 4-20. Gráfico de áreas apiladas

Debate

El tipo de datos que se traza con un gráfico de áreas apiladas suele proporcionarse en formato ancho, pero ggplot requiere que los datos estén en formato largo. Para convertirlos, consulta la Receta 15.19.

En este ejemplo, hemos utilizado el conjunto de datos uspopage:

uspopage
#>     Year AgeGroup Thousands
#> 1   1900       <5      9181
#> 2   1900     5-14     16966
#> 3   1900    15-24     14951
#>  ...<818 more rows>...
#> 822 2002    45-54     40084
#> 823 2002    55-64     26602
#> 824 2002      >64     35602

Esta versión del gráfico(Figura 4-21) cambia la paleta a una gama de azules y añade líneas finas (size = .2) entre cada área. También hace que las áreas rellenas sean semitransparentes (alpha = .4), de modo que sea posible ver las líneas de la cuadrícula a través de ellas:

ggplot(uspopage, aes(x = Year, y = Thousands, fill = AgeGroup)) +
  geom_area(colour = "black", size = .2, alpha = .4) +
  scale_fill_brewer(palette = "Blues")
Reversed legend order, lines, and a different palette
Figura 4-21. Orden invertido de la leyenda, líneas y una paleta diferente

Como cada área rellenada se dibuja con un polígono, el contorno incluye los lados izquierdo y derecho. Esto puede distraer o inducir a error. Para eliminarlo(Figura 4-22), dibuja primero las áreas apiladas sin contorno (dejando colour como valor por defecto NA ), y luego añade un geom_line() encima:

ggplot(uspopage, aes(x = Year, y = Thousands, fill = AgeGroup,
                     order = dplyr::desc(AgeGroup))) +
  geom_area(colour = NA, alpha = .4) +
  scale_fill_brewer(palette = "Blues") +
  geom_line(position = "stack", size = .2)
No lines on the left and right of the graph
Figura 4-22. No hay líneas a izquierda y derecha del gráfico

Ver también

Consulta la Receta 15.19 para saber más sobre la conversión de datos de formato ancho a formato largo.

Consulta el Capítulo 12 para saber más sobre la elección de colores.

4.8 Hacer una gráfica proporcional de áreas apiladas

Problema

En quieres hacer un gráfico de áreas apiladas con la altura total escalada a un valor constante.

Solución

Utiliza geom_area(position = "fill"), como en la Figura 4-23, arriba:

ggplot(uspopage, aes(x = Year, y = Thousands, fill = AgeGroup)) +
  geom_area(position = "fill", colour = "black", size = .2, alpha = .4) +
  scale_fill_brewer(palette = "Blues")

Debate

Con position="fill", los valores y se escalarán para ir de 0 a 1. Para imprimir las etiquetas como porcentajes, utilizascale_y_continuous(labels = scales::percent), como en la Figura 4-23, abajo:

ggplot(uspopage, aes(x = Year, y = Thousands, fill = AgeGroup)) +
  geom_area(position = "fill", colour = "black", size = .2, alpha = .4) +
  scale_fill_brewer(palette = "Blues") +
  scale_y_continuous(labels = scales::percent)
A proportional stacked area graph
Figura 4-23. Un gráfico de área proporcional apilado (arriba); Con etiquetas de porcentaje en el eje y (abajo)

Ver también

La creación de un gráfico de barras apiladas se hace de forma similar. Consulta la Receta 3.8 para obtener información sobre cómo calcular los porcentajes por separado.

Para más información sobre el resumen de datos por grupos, consulta la Receta 15.17.

4.9 Añadir una región de confianza

Problema

En puedes añadir una región de confianza a un gráfico.

Solución

Utiliza geom_ribbon() y asigna valores a ymin y ymax.

En el conjunto de datos climate, Anomaly10y es una media acumulada de 10 años de la desviación (en Celsius) de la temperatura media de 1950-1980, yUnc10y es el intervalo de confianza del 95%. Ajustaremos ymax y ymin aAnomaly10y más o menos Unc10y (Figura 4-24):

library(gcookbook) # Load gcookbook for the climate data set
library(dplyr)

# Grab a subset of the climate data
climate_mod <- climate %>%
  filter(Source == "Berkeley") %>%
  select(Year, Anomaly10y, Unc10y)

climate_mod
#>     Year Anomaly10y Unc10y
#> 1   1800     -0.435  0.505
#> 2   1801     -0.453  0.493
#> 3   1802     -0.460  0.486
#>  ...<199 more rows>...
#> 203 2002      0.856  0.028
#> 204 2003      0.869  0.028
#> 205 2004      0.884  0.029

# Shaded region
ggplot(climate_mod, aes(x = Year, y = Anomaly10y)) +
geom_ribbon(aes(ymin = Anomaly10y - Unc10y,
                ymax = Anomaly10y + Unc10y),
                alpha = 0.2) +
geom_line()
A line graph with a shaded confidence region
Figura 4-24. Un gráfico lineal con una región de confianza sombreada

La región sombreada es en realidad de un gris muy oscuro, pero es transparente en su mayor parte. La transparencia se ajusta con alpha = 0.2, que la hace transparente en un 80%.

Debate

Observa que geom_ribbon() va antes que geom_line(), de modo que la línea se dibuja encima de la región sombreada. Si se utilizara el orden inverso, la región sombreada podría ocultar la línea. En este caso concreto eso no sería un problema, ya que la región sombreada es en su mayor parte transparente, pero sí lo sería si la región sombreada fuera opaca.

En lugar de una región sombreada, también puedes utilizar líneas de puntos para representar los límites superior e inferior(Figura 4-25):

# With a dotted line for upper and lower bounds
ggplot(climate_mod, aes(x = Year, y = Anomaly10y)) +
  geom_line(aes(y = Anomaly10y - Unc10y), colour = "grey50",
              linetype = "dotted") +
  geom_line(aes(y = Anomaly10y + Unc10y), colour = "grey50",
              linetype = "dotted") +
  geom_line()
A line graph with dotted lines representing a confidence region
Figura 4-25. Un gráfico lineal con líneas de puntos que representan una región de confianza

Las regiones sombreadas pueden representar cosas distintas de las regiones de confianza, como la diferencia entre dos valores, por ejemplo.

En los gráficos de área de la Receta 4.7, el rangoy del área sombreada va de 0 a y. Aquí, va de ymina ymax.

Get R Graphics Cookbook, 2ª Edición now with the O’Reilly learning platform.

O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.