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
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
()
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
()
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
)
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
Solución
Añade geom_point()
(Figura 4-4):
ggplot
(
BOD
,
aes
(
x
=
Time
,
y
=
demand
))
+
geom_line
()
+
geom_point
()
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
()
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
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
()
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
()
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
()
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
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
4.4 Cambiar la apariencia de las líneas
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"
)
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"
)
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"
)
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
Solución
En geom_point()
, coloca size
, shape
, colour
, y/o fill
fuera 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"
)
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"
)
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"
))
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
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
()
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
)
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
()
Ver también
Consulta el capítulo 12 para saber más sobre elegir colores.
4.7 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
()
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"
)
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
)
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
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
)
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
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
()
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
()
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 ymin
a 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.