R para Ciencia de Datos de Salud
Diferentes tipos de plots
Lo que no puedo crear, no lo entiendo.
Richard Feynman
Hay algunos paquetes de trazado diferentes en R, pero el más elegante y versátil es ggplot2 [El nombre del paquete es ggplot2, pero la función se llama ggplot().] gg significa gramática de gráficos , lo que significa que podemos hacer una gráfica describiéndola un componente a la vez. En otras palabras, construimos una trama añadiéndole capas.
Esto no tiene que ser muchas capas, la más simple ggplot()consta de solo dos componentes:
- las variables a graficar;
- un objeto geométrico (p. ej., punto, línea, barra, caja, etc.). ggplot()llama a los objetos geométricos geoms .
La Figura 4.1 muestra algunos pasos de ejemplo para construir un diagrama de dispersión, incluido el cambio de apariencia (“tema”) y facetas, una forma eficiente de crear diagramas separados para subgrupos.
4.1 Obtener los datos
Estamos usando el conjunto de datos de gapminder ( https://www.gapminder.org/data ) que Bryan ( 2017 ) colocó en un paquete R para que podamos cargarlo con library(gapminder).
library(tidyverse)
library(gapminder)
glimpse(gapminder)Rows: 1,704
Columns: 6
$ country <fct> "Afghanistan", "Afghanistan", "Afghanistan", "Afghanistan", …
$ continent <fct> Asia, Asia, Asia, Asia, Asia, Asia, Asia, Asia, Asia, Asia, …
$ year <int> 1952, 1957, 1962, 1967, 1972, 1977, 1982, 1987, 1992, 1997, …
$ lifeExp <dbl> 28.801, 30.332, 31.997, 34.020, 36.088, 38.438, 39.854, 40.8…
$ pop <int> 8425333, 9240934, 10267083, 11537966, 13079460, 14880372, 12…
$ gdpPercap <dbl> 779.4453, 820.8530, 853.1007, 836.1971, 739.9811, 786.1134, …
El conjunto de datos incluye 1704 observaciones (filas) de 6 variables (columnas: país, continente, año, lifeExp, pop, gdpPercap). country, continent, y yearpodrían considerarse como variables de agrupación, mientras que lifeExp (esperanza de vida), pop (población) y gdpPercap (Producto interno bruto per cápita) son valores.
Los años en este conjunto de datos abarcan desde 1952 hasta 2007 con intervalos de 5 años (un total de 12 años diferentes). Incluye 142 países de los 5 continentes (Asia, Europa, África, América, Oceanía).
Puede verificar que todos los números citados anteriormente son correctos con estas líneas:
library(tidyverse)
library(gapminder)
gapminder$year %>% unique()
gapminder$country %>% n_distinct()
gapminder$continent %>% unique()Vamos a crear un nuevo tibble más corto llamado gapdata2007 que solo incluya datos del año 2007.
gapdata2007 <- gapminder %>%
filter(year == 2007)
gapdata2007# A tibble: 142 × 6
country continent year lifeExp pop gdpPercap
<fct> <fct> <int> <dbl> <int> <dbl>
1 Afghanistan Asia 2007 43.8 31889923 975.
2 Albania Europe 2007 76.4 3600523 5937.
3 Algeria Africa 2007 72.3 33333216 6223.
4 Angola Africa 2007 42.7 12420476 4797.
5 Argentina Americas 2007 75.3 40301927 12779.
6 Australia Oceania 2007 81.2 20434176 34435.
7 Austria Europe 2007 79.8 8199783 36126.
8 Bahrain Asia 2007 75.6 708573 29796.
9 Bangladesh Asia 2007 64.1 150448339 1391.
10 Belgium Europe 2007 79.4 10392226 33693.
# … with 132 more rows
# ℹ Use `print(n = ...)` to see more rows
El nuevo tibble - gapdata2007- ahora aparece en la pestaña Entorno, mientras que gapminder no. La ejecución library(gapminder) hace que esté disponible para su uso (por lo que la línea divertida a continuación no es necesaria para que funcione ninguno de los códigos de este capítulo), pero para que aparezca en la pestaña Entorno normal, deberá ejecutar esta línea de aspecto divertido:
# Carga el conjunto de datos Gapminder desde el entorno del paquete
# en su entorno global (Global Environment)
gapdata <- gapminderReferencias
Bryan, Jennifer. 2017. Gapminder: datos de Gapminder . https://CRAN.R-project.org/package=gapminder
4.2 Explicación de la anatomía de ggplot
Ahora explicaremos los seis pasos que se muestran en la Figura 4.1 . Tenga en cuenta que solo necesita los dos primeros para hacer un gráfico, el resto son solo para mostrarle más funciones y personalizaciones opcionales.
(1) Comience definiendo las variables, por ejemplo ggplot(aes(x = var1, y = var2)):
gapdata2007 %>%
ggplot(aes(x = gdpPercap, y = lifeExp))Esto crea el primer gráfico en la Figura 4.1 .
Aunque el código anterior es equivalente a:
ggplot(gapdata2007, aes(x = gdpPercap, y = lifeExp))Tendemos a poner los datos primero y luego usamos la tubería ( %>%) para enviarlos a la ggplot() función. Esto se vuelve útil cuando agregamos más funciones de disputa de datos entre los datos y el archivo ggplot(). Por ejemplo, nuestras tuberías de trazado a menudo se ven así:
data %>%
filter(...) %>%
mutate(...) %>%
ggplot(aes(...)) +
...Las líneas que vienen antes de la ggplot() función están canalizadas, mientras que a partir de ggplot() ahora tienes que usar +. Esto se debe a que ahora estamos agregando diferentes capas y personalizaciones a la misma trama.
aes() significa aes thetics - cosas que podemos ver. Las variables siempre están dentro de la aes() función, que a su vez está dentro de un ggplot(). Tómese un momento para apreciar los paréntesis de cierre doble )): el primero pertenece a aes(), el segundo a ggplot().
(2) Elija y agregue un objeto geométrico
Pidamos ggplot() dibujar un punto para cada observación agregando geom_point():
gapdata2007 %>%
ggplot(aes(x = gdpPercap, y = lifeExp)) +
geom_point()Ahora hemos creado la segunda gráfica en la Figura 4.1 , una gráfica de dispersión.
Si copiamos el código anterior y cambiamos solo una cosa, la x variable de gdpPercap a continent (que es una variable categórica), obtenemos lo que se llama un gráfico de franjas. Esto significa que ahora estamos graficando una variable continua (lifeExp) contra una categórica (continent). Pero lo que hay que tener en cuenta es que el resto del código permanece exactamente igual, todo lo que hicimos fue cambiar el archivo x =.
gapdata2007 %>%
ggplot(aes(x = continent, y = lifeExp)) +
geom_point()(3) especificando más variables dentro aes()
Volviendo al diagrama de dispersión ( lifeExp vs gdpPercap), usemos continent para dar color a los puntos. Podemos hacer esto agregando colour = continent dentro de aes():
gapdata2007 %>%
ggplot(aes(x = gdpPercap, y = lifeExp, colour = continent)) +
geom_point()Esto crea el tercer gráfico en la Figura 4.1 . Utiliza el esquema de color predeterminado e incluirá automáticamente una leyenda. Todavía con solo dos líneas de código ( ggplot(…)+ geom_point()).
(4) especificar la estética exterior ‘aes()’
Es muy importante comprender la diferencia entre incluir ggplot argumentos dentro o fuera de la aes() función.
Las principales estéticas (cosas que podemos ver) son: x , y, color , relleno , forma , tamaño, y cualquiera de estas puede aparecer dentro o fuera de la ‘aes()’ función. Presione F1 en, por ejemplo, geom_point() para ver la lista completa de estéticas que se pueden usar con esta geom (esto abre la pestaña Ayuda). Si es difícil invocar F1 en su teclado, escriba y ejecute ?geom_point.
Las variables (por lo tanto, las columnas de su conjunto de datos) deben definirse dentro de aes(). Mientras que para aplicar una modificación en todo, podemos establecer una estética en un valor constante fuera de aes().
Por ejemplo, la figura 4.3 muestra una selección de formas de puntos integradas en R. La forma predeterminada utilizada por geom_point() es el número 16.
FIGURA 4.3: Una selección de formas para trazar. Las formas 0, 1 y 2 son huecas, mientras que para las formas 21, 22 y 23 podemos definir tanto un color como un relleno (para las formas, el color es el borde alrededor del relleno).
Para hacer que todos los puntos de nuestra figura sean huecos, establezcamos su forma en 1. Hacemos esto agregando shape = 1 dentro de geom_point():
gapdata2007 %>%
ggplot(aes(x = gdpPercap, y = lifeExp, colour = continent)) +
geom_point(shape = 1)Esto crea el cuarto gráfico en la Figura 4.1 .
(5) De una parcela a múltiples con una sola línea extra
La creación de facetas es una forma de crear eficientemente el mismo gráfico para subgrupos dentro del conjunto de datos. Por ejemplo, podemos separar cada continente en su propia faceta agregando facet_wrap(~continent) a nuestra gráfica:
gapdata2007 %>%
ggplot(aes(x = gdpPercap, y = lifeExp, colour = continent)) +
geom_point(shape = 1) +
facet_wrap(~continent)Esto crea el quinto gráfico en la Figura 4.1 . Tenga en cuenta que tenemos que usar la tilde (~) en facet_wrap(). Hay una función similar llamada facet_grid() que creará una cuadrícula de gráficos basada en dos variables de agrupación, por ejemplo, facet_grid(var1~var2). Además, las facetas se complacen en separar rápidamente los datos en función de una condición (algo que normalmente usaría en un filtro).
gapdata2007 %>%
ggplot(aes(x = gdpPercap, y = lifeExp, colour = continent)) +
geom_point(shape = 1) +
facet_wrap(~pop > 50000000)facet_wrap().FIGURA 4.4: Uso de una condición de filtrado (p. ej., población > 50 millones) directamente dentro de un archivo facet_wrap().
En este gráfico, la faceta FALSE incluye países con una población inferior a 50 millones de personas y la faceta TRUEincluye países con una población superior a 50 millones de personas.
La tilde (~) en R denota dependencia. Los modelos estadísticos lo utilizan principalmente para definir variables dependientes y explicativas y lo verá mucho en la segunda parte de este libro.
(6) Fondo gris a blanco - cambiando el tema
En general, podemos personalizar cada cosa en un ggplot. Tipo de fuente, color, tamaño o grosor o cualquier línea o número, fondo, lo que sea. Pero una forma muy rápida de cambiar la apariencia de un ggplot es aplicar un tema diferente. El tema de la firma ggplot tiene un fondo gris claro y líneas de cuadrícula blancas (Figura 4.5 ).
theme_bw(), (3) theme_dark(), (4) theme_classic().Como paso final, estamos agregando theme_bw() (“fondo blanco”) para darle a la trama un aspecto diferente. También hemos dividido el pibPercap por 1000 (lo que hace que las unidades sean “miles de dólares per cápita”). Tenga en cuenta que puede aplicar cálculos directamente en las variables ggplot (cómo lo hemos hecho x=gdpPercap/1000aquí).
gapdata2007 %>%
ggplot(aes(x = gdpPercap/1000, y = lifeExp, colour = continent)) +
geom_point(shape = 1) +
facet_wrap(~continent) +
theme_bw()Esto crea el último gráfico en la Figura 4.1 .
Así es como ggplot() funciona: puede construir una trama agregando o modificando cosas una por una.
4.3 Establezca su tema - gris vs blanco
Si siempre agrega el mismo tema a su trama (es decir, nos gusta mucho el + theme_bw()), puede usar theme_set() para que el tema elegido se aplique a cada trama que dibuje:
theme_set(theme_bw())De hecho, normalmente tenemos estas dos líneas en la parte superior de cada script:
library(tidyverse)
theme_set(theme_bw())Además, podemos personalizar todo lo que aparece en un ggplot()eje, desde las fuentes hasta las líneas de cuadrícula exactas, y mucho más. De eso se trata el Capítulo 5 : Ajuste fino de las parcelas, pero aquí nos centramos en la funcionalidad básica y cómo funcionan los diferentes geomas. Pero a partir de ahora, + theme_bw()se aplica automáticamente en todo lo que hacemos.
4.4 Gráficos de dispersión/gráficos de burbujas
La anatomía de ggplot (Sección 4.2 ) cubrió tanto los diagramas de dispersión como los de franjas (ambos creados con geom_point()). Otra cosa interesante de esta geom es que agregar una estética de tamaño lo convierte en un gráfico de burbujas. Por ejemplo, dimensionemos los puntos por población.
Como era de esperar de una “gramática de la trama gráfica”, esto es tan simple como agregar size = popcomo una estética:
gapdata2007 %>%
ggplot(aes(x = gdpPercap/1000, y = lifeExp, size = pop)) +
geom_point()Con el aumento del tamaño de las burbujas, se produce algo de sobregraficación, así que hagamos los puntos huecos ( shape = 1) y ligeramente transparentes ( alpha = 0.5): Los diagramas de burbujas resultantes se muestran en la Figura 4.6
gapdata2007 %>%
ggplot(aes(x = gdpPercap/1000, y = lifeExp, size = pop)) +
geom_point(shape = 1, alpha = 0.5)FIGURA 4.6: Convierta el diagrama de dispersión de la Figura 4.1 : (2) en un diagrama de burbujas (1) agregando size = popdentro de aes(), (2) haga que los puntos sean huecos y transparentes.
Alpha es una estética para hacer que los geoms sean transparentes, sus valores pueden variar de 0 (invisible) a 1 (sólido).
4.5 Plot de líneas/gráficos de series de tiempo
Tracemos la esperanza de vida en el Reino Unido a lo largo del tiempo (Figura 4.7 ):
gapdata %>%
filter(country == "United Kingdom") %>%
ggplot(aes(x = year, y = lifeExp)) +
geom_line()geom_line()- Esperanza de vida en el Reino Unido a lo largo del tiempo.FIGURA 4.7: geom_line()- Esperanza de vida en el Reino Unido a lo largo del tiempo.
Como resumen, los pasos en el código anterior son:
- Enviar
gapdataa unfilter(); - dentro del
filter(), nuestra condición escountry == "United Kingdom"; - Inicializamos
ggplot()y definimos nuestras principales variables:aes(x = year, y = lifeExp); - estamos usando un nuevo geom -
geom_line().
Esto es idéntico a cómo usamos geom_point(). De hecho, simplemente cambiando linea pointen el código anterior funciona, y en lugar de una línea continua, obtendrá un punto cada 5 años como en el conjunto de datos.
Pero, ¿qué pasa si queremos dibujar múltiples líneas, por ejemplo, para cada país en el conjunto de datos? Enviemos todo el conjunto de datos a ggplot()y geom_line():
gapdata %>%
ggplot(aes(x = year, y = lifeExp)) +
geom_line()La razón por la que ve este extraño zigzag en la Figura 4.8 (1) es que, usando el código anterior, ggplot()no sabe qué puntos conectar con cuáles. Sí, sabes que quieres una línea para cada país, pero no le has dicho eso. Entonces, para dibujar varias líneas, debemos agregar una groupestética, en este caso group = country
gapdata %>%
ggplot(aes(x = year, y = lifeExp, group = country)) +
geom_line()FIGURA 4.8: El ‘diagrama en zig-zag’ es un error común: Usar geom_line()(1) sin groupespecificar, (2) después de agregar group = country.
Este código funciona como se esperaba (Figura 4.8 (2)) - sí, hay mucho overplot, pero eso es solo porque hemos incluido 142 líneas en un solo gráfico
4.5.1 Ejercicio
Siga las instrucciones paso a paso para transformar la Figura 4.8 (2) en 4.9 .
FIGURA 4.9: Ejercicio de diagrama lineal.
- Líneas de color por continentes: añadir
colour = continentdentroaes(); - Continentes en facetas separadas:
+ facet_wrap(~continent); - Use un esquema de color más agradable:
+ scale_colour_brewer(palette = "Paired").
4.6 Plot o Gráficos de barras
Hay dos geoms para hacer diagramas de barras, geom_col()y geom_bar()los ejemplos a continuación ilustrarán cuándo usar cuál. En resumen: si sus datos ya están resumidos o incluyen valores para y(altura de las barras), use geom_col(). Sin embargo, si desea ggplot()contar el número de filas en su conjunto de datos, use geom_bar(). Por ejemplo, con datos a nivel de paciente (cada fila es un paciente) probablemente querrá usar geom_bar(), con datos que ya están algo agregados, usará geom_col(). No hay nada de malo en probar uno, y si no funciona, probar el otro.
4.6.1 Datos resumidos
geom_col()requiere dos variablesaes(x = , y = )xes categórico,yes continuo (numérico)
Tracemos la esperanza de vida en 2007 en estos tres países:
gapdata2007 %>%
filter(country %in% c("United Kingdom", "France", "Germany")) %>%
ggplot(aes(x = country, y = lifeExp)) +
geom_col() Esto nos da la figura 4.10 :1. También hemos creado otro descarado usando el mismo código pero cambiando la escala del eje y para que sea más dramático (Figura 4.10 :2).
geom_col(): (1) Usando el ejemplo de código, (2) la misma gráfica pero con + coord_cartesian(ylim=c(79, 81)) para manipular la escala en algo mucho más dramático.4.6.2 Datos contables
geom_bar()requiere una sola variableaes(x = )esto
xdebería ser una variable categóricageom_bar()luego cuenta el número de observaciones (filas) para esta variable y las representa como barras.
Nuestro gapdata2007tibble tiene una fila para cada país (vea el final de la Sección 4.1 para recordarlo). Por lo tanto, si usamos la count()función en la continentvariable, estamos contando el número de países en cada continente (en este conjunto de datos 12 ):
gapdata2007 %>%
count(continent)# A tibble: 5 × 2
continent n
<fct> <int>
1 Africa 52
2 Americas 25
3 Asia 33
4 Europe 30
5 Oceania 2
Así que geom_bar()básicamente ejecuta la count()función y la traza (vea cómo las barras en la Figura 4.11 tienen la misma altura que los valores de count(continent)).
geom_bar() Cuenta el número de observaciones para cada grupo. (1) gapdata2007 %>% ggplot(aes(x = continent)) + geom_bar(), (2) Lo mismo + un poco de magia para revelar los datos subyacentes.El primer gráfico de barras de la figura 4.11 se produce con solo esto:
gapdata2007 %>%
ggplot(aes(x = continent)) +
geom_bar()Mientras que en el segundo, hemos pedido geom_bar()revelar los componentes (países) de una manera colorida:
gapdata2007 %>%
ggplot(aes(x = continent, colour = country)) +
geom_bar(fill = NA) +
theme(legend.position = "none")Hemos agregado theme(legend.position = "none")para eliminar la leyenda: incluye los 142 países y no es muy informativo en este caso. Solo incluimos los colores para divertirnos un poco.
También estamos eliminando el relleno configurándolo en NA ( fill = NA). Tenga en cuenta cómo definimos colour = countrydentro de aes()(ya que es una variable), pero colocamos el relleno dentro geom_bar()como una constante. Esto se explicó con más detalle en los pasos (3) y (4) en la Sección de anatomía de ggplot ( 4.2 ).
4.6.3 colour frente a fill
La figura 4.11 también revela la diferencia entre un color y un relleno. El color es el borde alrededor de una geom, mientras que el relleno está dentro. Ambos se pueden configurar en función de una variable en su conjunto de datos (esto significa colour =o fill =debe estar dentro de la aes()función), o se pueden configurar en un color fijo.
R tiene un conocimiento asombroso del color. Además de saber qué es “blanco”, “amarillo”, “rojo”, “verde”, etc. (lo que significa que simplemente podemos hacerlo) geom_bar(fill = "green"), también sabe qué es “aguamarina”, “almendra blanca”, “coral”, “rosa oscuro” , “lavanda”, “azul cielo profundo” (entre muchos otros; busque en Internet “colores R” para obtener una lista completa).
También podemos usar códigos de color hexadecimales, por ejemplo, geom_bar(fill = "#FF0099")es un rosa muy bonito. Todos los colores del mundo se pueden representar con un código hexadecimal, y la mayoría de los programas de trazado o creación de imágenes conocen universalmente los códigos. Por lo tanto, puede encontrar códigos de color hexadecimales en muchos lugares de Internet o en https://www.color-hex.com , solo por nombrar uno.
4.6.4 Proporciones
Ya sea usando geom_bar()o geom_col(), podemos usar relleno para mostrar proporciones dentro de las barras. Además, a veces es útil establecer el valor de x en una constante, para graficar todo junto en lugar de separarlo por una variable. Así que estamos usando aes(x = "Global", fill = continent). Tenga en cuenta que “Global” podría ser cualquier palabra, dado que se cita, ggplot()no se buscará en el conjunto de datos (Figura 4.12 ):
gapdata2007 %>%
ggplot(aes(x = "Global", fill = continent)) +
geom_bar()fill = continent aesthetic.Hay más ejemplos de gráficas de barras en el Capítulo 8
4.6.5 Ejercicio
Cree la Figura 4.13 de la esperanza de vida en los países europeos (año 2007).
Sugerencias:
Si
geom_bar()no funciona pruebageom_col()o viceversa.coord_flip()para hacer las barras horizontales (voltea los ejesxyy).x = countryobtiene las barras de países trazadas en orden alfabético, usex = fct_reorder(country, lifeExp)todavía dentro deaes()para ordenar las barras por suslifeExpvalores. O pruebe una de las otras variables (pop,gdpPercap) como segundo argumento defct_reorder().al usar
fill = NA, también debe incluir un color; estamos usandocolour = "deepskyblue"dentro delgeom_col().
- El número de países en este conjunto de datos es 142, mientras que las Naciones Unidas tienen 193 estados miembros. ↩︎
4.7 Histogramas
Un histograma muestra la distribución de valores dentro de una variable continua. En el siguiente ejemplo, tomamos la esperanza de vida ( aes(x = lifeExp)) y le decimos al histograma que cuente las observaciones en “grupos” de 10 años ( geom_histogram(binwidth = 10), Figura 4.14 ):
gapdata2007 %>%
ggplot(aes(x = lifeExp)) +
geom_histogram(binwidth = 10)geom_histogram() - La distribución de las expectativas de vida en diferentes países del mundo en el año 2007.Podemos ver que la mayoría de los países del mundo tienen una esperanza de vida de ~70-80 años (en 2007) y que la distribución de la esperanza de vida a nivel mundial no tiene una distribución normal. Configurar el ancho de la bandeja es opcional, usar simplemente geom_histogram()también funciona bien; de forma predeterminada, dividirá sus datos en 30 bandejas.
Hay más ejemplos de histogramas en el Capítulo 6 . Hay otras dos geomas que son útiles para trazar distribuciones: geom_density()y geom_freqpoly().
4.8 Diagramas de caja (Boxplot)
Los diagramas de caja son nuestro método de referencia para visualizar rápidamente las estadísticas de resumen de una variable de resultado continua (como la esperanza de vida en el conjunto de datos de gapminder, figura 4.15 ).
Los diagramas de caja incluyen:
la mediana (línea central en el cuadro)
rango intercuartílico (IQR, partes superior e inferior de los recuadros; aquí es donde se encuentra el 50 % de sus datos)
bigotes (las líneas negras que se extienden hasta los valores más bajo y más alto que todavía están dentro de 1.5*IQR)
valores atípicos (cualquier observación con los bigotes)
gapdata2007 %>%
ggplot(aes(x = continent, y = lifeExp)) +
geom_boxplot()geom_boxplot() - Boxplots de las expectativas de vida dentro de cada continente en el año 2007.4.9 Múltiples geomas, múltiplesaes()
¡Una de las mejores cosas ggplot()es que podemos trazar múltiples geoms uno encima del otro!
Agreguemos puntos de datos individuales encima de los Boxplot o diagramas de caja:
gapdata2007 %>%
ggplot(aes(x = continent, y = lifeExp)) +
geom_boxplot() +
geom_point()geom_boxplot() + geom_point(), (2) geom_boxplot() + geom_jitter(), (3) colour aesthetic dentro ggplot(aes()), (4) colour aesthetic dentro geom_jitter(aes()).Lo único que hemos cambiado en (2) es reemplazar geom_point()con geom_jitter(): esto distribuye los puntos para reducir el trazado excesivo.
Pero lo que es realmente emocionante es la diferencia entre (3) y (4) en la figura 4.16 . ¡Detectarlo!
# (3)
gapdata2007 %>%
ggplot(aes(x = continent, y = lifeExp, colour = continent)) +
geom_boxplot() +
geom_jitter()
# (4)
gapdata2007 %>%
ggplot(aes(x = continent, y = lifeExp)) +
geom_boxplot() +
geom_jitter(aes(colour = continent))Esto es nuevo: aes()dentro de un geom, ¡no solo en la parte superior! En el código para (4) puede ver aes()en dos lugares: en la parte superior y dentro del archivo geom_jitter(). Y colour = continentsólo se incluyó en el segundo aes(). Esto significa que los puntos con fluctuaciones adquieren un color, pero los diagramas de caja se dibujarán sin (solo negro). Esto es exactamente* lo que vemos en 4.16 .
*Alerta de nerd: la variación agregada por geom_jitter()es aleatoria, lo que significa que cuando recreas las mismas parcelas, los puntos aparecerán en ubicaciones ligeramente diferentes a las nuestras. Para hacer idénticos, agregue position = position_jitter(seed = 1)adentro geom_jitter().
4.9.1 Ejemplo resuelto: tres geomas juntas
Combinemos tres geomas incluyendo etiquetas de texto en la parte superior del diagrama de caja + puntos desde arriba.
Estamos creando un nuevo tibble llamado label_datafiltrado para los países con máxima esperanza de vida en cada continente ( group_by(continent)):
label_data <- gapdata2007 %>%
group_by(continent) %>%
filter(lifeExp == max(lifeExp)) %>%
select(country, continent, lifeExp)
# Dado que filtramos LifeExp == max (lifeExp)
# Estos son los países máximos de esperanza de vida en cada continente:
label_data# A tibble: 5 × 3
# Groups: continent [5]
country continent lifeExp
<fct> <fct> <dbl>
1 Australia Oceania 81.2
2 Canada Americas 80.7
3 Iceland Europe 81.8
4 Japan Asia 82.6
5 Reunion Africa 76.4
Las dos primeras geomas son del ejemplo anterior ( geom_boxplot()y geom_jitter()). Tenga en cuenta que ggplot()los traza en el orden en que están en el código, por lo que los diagramas de caja en la parte inferior, los puntos con fluctuaciones en la parte superior. Luego estamos agregando geom_label()con su propia opción de datos ( data = label_data), así como una nueva estética ( aes(label = country), Figura 4.17 ):
gapdata2007 %>%
ggplot(aes(x = continent, y = lifeExp)) +
# Primer geom - boxplot
geom_boxplot() +
# Segundo geom - jitter with its own aes(colour = )
geom_jitter(aes(colour = continent)) +
# Tercero geom - label, with its own dataset (label_data) and aes(label = )
geom_label(data = label_data, aes(label = country))geom_boxplot(), geom_jitter(), and geom_label().Algunos experimentos sugeridos para probar con el código de trama de 3 geometrías anterior:
elimine
data = label_data,degeom_label()y obtendrá las 142 etiquetas (por lo que trazará una etiqueta para todo elgapdata2007conjunto de datos);cambiar de
geom_label()ageom_text(): funciona de manera similar pero no tiene el borde ni el fondo detrás del nombre del país;cambie
label = countryalabel = lifeExp, esto traza el valor máximo, en lugar del nombre del país.
4.10 Todos los otros tipos de Plots
En este capítulo hemos introducido algunos de los geomas más comunes, así como explicado cómo ggplot()funciona. De hecho, ggplot tiene 56 geoms diferentes para que los uses; consulte su documentación para obtener una lista completa: https://ggplot2.tidyverse.org .
Con la capacidad de combinar múltiples geomas en la misma parcela, las posibilidades son realmente infinitas. Además, la biblioteca gráfica de plotly ( https://plot.ly/ggplot2/ ) puede hacer que algunos de sus ggplots sean interactivos, lo que significa que puede usar el mouse para pasar el mouse sobre el punto o hacer zoom y crear subconjuntos de forma interactiva.
Las dos cosas más importantes que hay que entender ggplot()son:
Las variables (columnas en su conjunto de datos) deben estar dentro
aes();aes()puede estar tanto en la parte superior -data %>% ggplot(aes())- como dentro de una geom (p. ej.,geom_point(aes())). Esta distinción es útil cuando se combinan varias geomas. Todos sus geoms “conocerán” lasaes()variables de nivel superior, pero incluiraes()variables dentro de un geom específico significa que solo se aplica a ese.
4.11 Soluciones
Solución al Ejercicio 4.5.1 :
library(tidyverse)
library(gapminder)
gapminder %>%
ggplot(aes(x = year,
y = lifeExp,
group = country,
colour = continent)) +
geom_line() +
facet_wrap(~continent) +
theme_bw() +
scale_colour_brewer(palette = "Paired")Solución al Ejercicio 4.6.5 :
library(tidyverse)
library(gapminder)
gapminder %>%
filter(year == 2007) %>%
filter(continent == "Europe") %>%
ggplot(aes(x = fct_reorder(country, lifeExp), y = lifeExp)) +
geom_col(colour = "deepskyblue", fill = NA) +
coord_flip() +
theme_classic()4.12 Extra: Ejemplos avanzados
ggplot()Hay dos ejemplos de cómo se pueden usar unas pocas líneas de código y las geomas básicas presentadas en este capítulo para hacer cosas muy diferentes. ¡Deja volar tu imaginación cuando lo uses ggplot()!
La Figura 4.18 muestra cómo ha aumentado la esperanza de vida en los países europeos trazando un cuadrado ( geom_point(shape = 15)) para cada observación (año) en el conjunto de datos.
gapdata %>%
filter(continent == "Europe") %>%
ggplot(aes(y = fct_reorder(country, lifeExp, .fun=max),
x = lifeExp,
colour = year)) +
geom_point(shape = 15, size = 2) +
scale_colour_distiller(palette = "Greens", direction = 1) +
theme_bw()fct_reorder() Para ordenar a los países del eje Y por esperanza de vida (en lugar de alfabéticamente, que es el valor predeterminado).En la Figura 4.19 , usamos group_by(continent)seguido de mutate(country_number = seq_along(country))para crear una nueva columna con los números 1, 2, 3, etc., para los países dentro de los continentes. Entonces estamos usando estos como ycoordenadas para las etiquetas de texto ( geom_text(aes(y = country_number...).
gapdata2007 %>%
group_by(continent) %>%
mutate(country_number = seq_along(country)) %>%
ggplot(aes(x = continent)) +
geom_bar(aes(colour = continent), fill = NA, show.legend = FALSE) +
geom_text(aes(y = country_number, label = country), vjust = 1)+
geom_label(aes(label = continent), y = -1) +
theme_void()