rm(list = ls())
En este trabajo resumiremos los tres archivos .r proporcionados en classroom, me encontré con algunas dificultades iniciales las cuales se deben a que no tenia las librerías necesarias para generar el RMD en formato -PDF por lo cual iniciaremos con una seccion de las librerías necesarias para que nos compile el -PDF de forma correcta dicha sección la llamaremos “librerías”. Damos inicio al trabajo presentado
En esta sección cargaremos las libreras para poder usar LáTex en salida pdf, al inicio de la elaboración de esta tarea instale los paquetes donde se encuentran las librerías dicho proceso lo hice directamente en el menú Tools / Install Packages.. / y Busque los paquetes tinytex, FSA, etc. Intente de formas diferentes la generacion del archivo -pdf solo instale los paquetes pero no estoy cargando librerias.
Este script contiene los conceptos básicos del manejo de datos y variables en Rstudio nos muestra diferentes tipos de variables vamos a comenzar con la primer sección
Datos tipo caracter: En general los datos tipo caracter son cadenas de texto las cadenas de texto van entre “comillas”
"Hola"
-> [1] "Hola"
Datos tipo numéricos En general los datos tipos numéricos representan eso precisamente números los cuales pueden ser: enteros, fraccionarios, imaginarios, \[\dots\], etc.
# Números irracionales
pi
-> [1] 3.141593
# Números fraccionarios
4.2
-> [1] 4.2
# Números enteros
3
-> [1] 3
# Números Complejos
3 + 4.5i
-> [1] 3+4.5i
En el caso de los números complejos el Rstudio cuenta con unas funciones que ayudan a escribir numeros complejos
# Esta funcion genera un numero complejo, especificando su parte real e imaginaria
complex(real = 3, imaginary = 4.5)
-> [1] 3+4.5i
complex(argument = 2, modulus = 3)
-> [1] -1.248441+2.727892i
complex(argument = pi, modulus = 3)
-> [1] -3+0i
# Esta función nos arroja la parte real de una operación de 2 números complejos
Re(complex(argument = 2, modulus = 3) * complex(argument = -2, modulus = 2))
-> [1] 6
# Esta función nos arroja la parte imaginaria de una operación de 2 números complejos
Im(complex(argument = 2, modulus = 3) * complex(argument = -2, modulus = 2))
-> [1] 0
A continuación vamos a relacionar objetos con variables
# En este codigo estamos asignando una cadena de caracteres
# a la variable x1 como es cade de caracteres debe ir entre "comillas"
x1 <- "Hola"
# En este código estamos asignando un valor numérico (real o decimal)
# a la variable x2
x2 <- pi
x3 = 3L
# assign es una forma diferente de asignar objetos a una variable
# assign, tiene la siguiente sintaxis:
# (nombre de la variable, valor que se asignara,[tambien podemos definir la posicion (opcional)])
# En este caso vamos lo que hace esta funcion es asignar a la variable x4
# el numero complejo 3+4.5i
assign("x5", 3 + 4.5i)
# En este código asignamos el valor lógico a la variable
x4 <- TRUE
# Para imprimir todas nuestras variables, simplemente escribimos su nombre y enseguida se nos mostrara en consola
x1; x2; x3; x4; x5
-> [1] "Hola"
-> [1] 3.141593
-> [1] 3
-> [1] TRUE
-> [1] 3+4.5i
Para borrar objetos de memoria en Rstudio, utilizamos la funcion rm(x):, elimina el objeto x, y la funcion rm(list=ls()) elimina todos los objetos en memoria.
# En este codigo estamos eliminando las variables x1,x2, ..., x5
rm(x1, x2, x3, x4, x5)
En Rstudio tenemos varios tipos objetos; vectores, matrices, dataframes, listas, etc. A continuación se mostraran ejemplos básicos de algunos tipor de objetos.
# Valores: Son valores fijos que se asignan a variables, para usar las variables cada vez que se requiera en lugar de estar anotando el valor varias veces, támbien nos sirve para identificar mejor los valores fijos dentro de nuestro programas.
# en este código a y1 se le esta asignando el valor pi
y1 <- pi
# Vectores: Es una colección de uno o más datos del mismo tipo
# numérico, carácter, lógicos, etc.
# Creamos un vector usando la función c() (combinar)
y2 <- c(1, 2, 3)
y3 <- c("a", "b", "c")
y4 <- c(TRUE, FALSE, NA)
# Matrices: Las matrices pueden ser descritas como vectores multidimensionales, al igual
# que un vector únicamente pueden contener datos de un sólo tipo
# Creamos matrices en R con la función matrix(). acepta dos argumentos
# nrow = número de filas y ncol = número de columnas
y5 <- matrix(c(7, 8, 9, 0), nrow = 2, ncol = 2)
# Cuadros de datos: Son estructuras de datos de dos dimensiones
# pueden contener datos de diferentes tipos.
# Es la estructura más usada para realizar análisis de datos.
# Creamos un dataframe con la funcion data.frame() un dataframe esta compuesto
# por vectores
# podemos asignar un nombre a cada vector, que se convertirá en el nombre de la columna.
# se recomienda que los nombres sean claros y descriptivo.
y6 <- data.frame(v1 = y2, v2 = y3,
v3 = c("A", "B", "C"),v4 = y4)
# Listas: estructuras de datos unidimensionales, sólo tiene largo
# a diferencia de los vectores cada elemento puede ser de diferente tipo.
# Creamos una lista con la función list()
# nos pedirá los elementos que deseamos incluir en nuestra lista.
y7 <- list(
y1, y2, y3, y4, y5, y6, y9 = list(aa = c(1, 2), bb = "Hola")
)
## Imprimir valores
y1; y2; y3; y4; y5; y6; y7
-> [1] 3.141593
-> [1] 1 2 3
-> [1] "a" "b" "c"
-> [1] TRUE FALSE NA
-> [,1] [,2]
-> [1,] 7 9
-> [2,] 8 0
-> [[1]]
-> [1] 3.141593
->
-> [[2]]
-> [1] 1 2 3
->
-> [[3]]
-> [1] "a" "b" "c"
->
-> [[4]]
-> [1] TRUE FALSE NA
->
-> [[5]]
-> [,1] [,2]
-> [1,] 7 9
-> [2,] 8 0
->
-> [[6]]
-> v1 v2 v3 v4
-> 1 1 a A TRUE
-> 2 2 b B FALSE
-> 3 3 c C NA
->
-> $y9
-> $y9$aa
-> [1] 1 2
->
-> $y9$bb
-> [1] "Hola"
## Borrar valores
rm(y1, y2, y3, y4, y5, y6, y7)
Hay diferentes maneras de acceder a datos dentro de estructuras(vectores, matrices, dataframe, …, etc), algunas de las maneras son: Especificar los indices de los elementos a extraer Especificar el nombre de los elementos *Especificar la posición del dato a extraer.
# Se crea un vector, una matriz, un dataframe y una lista
# Estructuras
y2 <- c(a = 1, b = 2, c = 3)
y5 <- matrix(c(7, 8, 9, 0), nrow = 2, ncol = 2)
y6 <- data.frame(v1 = y2, v2 = -y2)
y7 <- list(a = y2, b = y5, c = y6)
# Se hace la busqueda del dato por índice, es decir su posicion dentro de la estructura
## Por índice
y2[2]
-> b
-> 2
y5[2, 2]
-> [1] 0
y6[3, 1]
-> [1] 3
y7[[3]]
# Se hace la busqueda del dato por su nombre dentro de la estructura
## Por nombre
y2["b"]
-> b
-> 2
y6$v1[3]
-> [1] 3
y7$c
## Borrar valores
rm(y2, y5, y6, y7)
Como ya se dijo anteriormente los vectores se crean con la funcion c()
# Se define un vector con los valores 1, 2, 3
## c()
c(1, 2, 3)
-> [1] 1 2 3
# A los numeros del vector se les asigna letras a, b, c.
## Vector con nombres
c(a = 1, b = 2, c = 3)
-> a b c
-> 1 2 3
## Crea una secuencia de números definidos en 1:3 la salida de este codigo sera
## 1,2, 3
## Usando dos puntos para incrementos unitarios
1:3
-> [1] 1 2 3
10:1
-> [1] 10 9 8 7 6 5 4 3 2 1
## El comando seq: permite generar secuencias de números usando varios argumentos
## los primeros son from, to y by
## Para cambiar la magnitud del crecimiento/decremento usamos el argumento by
## Este código es parecido al 1:3, pero esta definiendo que cada vez incrementara en 0.5
## Secuencia definiendo incremento
seq(1, 3, by = 0.5)
-> [1] 1.0 1.5 2.0 2.5 3.0
## Secuencia definiendo tamaño total
seq(1, 3, length.out = 9)
-> [1] 1.00 1.25 1.50 1.75 2.00 2.25 2.50 2.75 3.00
## Repitiendo valores
rep(0:2, each = 2)
-> [1] 0 0 1 1 2 2
## Repitiendo valores especificando número de veces
rep(0:2, times = 1:3)
-> [1] 0 1 1 2 2 2
## Funcion coseno
## Evaluar en un solo elemento
cos(pi/4)
-> [1] 0.7071068
## Tambien se pueden aplicar funciones a vectores
## Evaluar en un vector
cos(c(pi / 4, pi / 2))
-> [1] 7.071068e-01 6.123032e-17
## Tambien se pueden aplicar funciones a matrices
## Se crea una matriz de 2x2 que contiene los valores
## 1, 2, 3, 4. y a esos números se le aplicara el coseno de cada
## valor dentro de la matriz
cos(matrix(1:4, ncol = 2, nrow = 2))
-> [,1] [,2]
-> [1,] 0.5403023 -0.9899925
-> [2,] -0.4161468 -0.6536436
En la consola de R puedes escribir la función help() o el operador «?» para acceder a páginas con documentación sobre las funciones de R, conjuntos de datos, y listas de términos semejantes a tu búsqueda que se encuentran en los paquetes de R.
También es posible buscar directamente en el panel de ayuda de RStudio
?cos
help("exp")
??tibble
Las gráficas de ggplot son construidas paso a paso, agregando nuevos elementos cada vez. Para graficar con ggplot, vamos a usar una línea de comando templado que es útil para diferentes tipos de gráficos
Usamos la función ggplot() y el argumento data para indicar a partir de qué datos se debe crear la gráfica. Luego, la función aes() (aesthetic) para seleccionar las variables a graficar y como presentarlas, e.g. ejes x e y o características como tamaño, forma, color, etc
ggplot2 ofrece “geoms” para indicar la representación gráfica de los datos (puntos, líneas, barras), algunos de ellos son:
geom_point() para gráficos de dispersión.
geom_boxplot() para gráficos de caja (boxplots).
geom_line() para líneas de tendencia, series de tiempo, etc.
Usa + para agregar un geom a línea de comando de ggplot.
## Datos
head(cars)
## Carga paquete
library(ggplot2)
## Datos y gráfico base
ggplot(data = cars) +
## Especificar x y y
aes(speed, dist) +
## Sistema de coordenadas (cartesiano con proporción fija)
coord_fixed(ratio = 1 / 12) +
## Geometría
geom_point()
## Una variable --------------------------------------------------------------
## Datos: mtcars
## Extraidos de la revista Motor Trend de 1974
View(mtcars)
g_base <- ggplot(mtcars, aes(wt))
g_base
## Área
g_base + geom_area(stat = "bin")
-> `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## Densidad
g_base + geom_density(kernel = "gaussian")
## Gráfico de puntos
g_base + geom_dotplot()
-> Bin width defaults to 1/30 of the range of the data. Pick better value with
-> `binwidth`.
## Frecuencia con polinomio
g_base + geom_freqpoly()
-> `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## Histograma
g_base + geom_histogram(binwidth = 0.5)
## Gráfico cuantil-cuantil
ggplot(mtcars, aes(sample = mpg)) + geom_qq()
## Algunas mejoras
g_base +
geom_histogram(binwidth = 0.5, fill = "lightblue") +
labs(x = "Peso (1000 lbs)", y = "Conteos") +
theme_bw()
rm(g_base)
## Dos Variables: Continua - Discreta --------------------------------------
f <- ggplot(
data = transform(mtcars, cyl = as.factor(cyl)),
aes(cyl, mpg))
f ## Base
f + geom_col() ## Barras
f + geom_boxplot() ## Boxplot
f + geom_dotplot(binaxis = "y", stackdir = "center") ## Puntos
-> Bin width defaults to 1/30 of the range of the data. Pick better value with
-> `binwidth`.
f + geom_violin(scale = "area") ## Violín
## Unas mejoras
f +
geom_boxplot(fill = "hotpink", color = "gray90") +
labs(x = "Cilindros", y = "MPG") +
coord_flip() +
theme_dark()
rm(f)
## Dos Variables: Continua - Continua --------------------------------------
e <- ggplot(
data = transform(mtcars,
car = row.names(mtcars)),
aes(hp, mpg))
e ## Base
e + geom_point() # Puntos
e + geom_label(aes(label = car), nudge_x = 1, nudge_y = 1) # Etiquetas
e + geom_rug(sides = "bl") ## ??
e + geom_smooth(method = lm) ## Modelo
-> `geom_smooth()` using formula = 'y ~ x'
e + geom_text(aes(label = car))
rm(e)
## Dos Variables: Discreta - Discreta --------------------------------------
g <- ggplot(
data = transform(mtcars, cyl = as.factor(cyl), am = as.factor(am)),
aes(cyl, am))
g + geom_count() ## Conteos
g + geom_jitter(height = 0.15, width = 0.15) ## Agregando ruido
rm(g)
url = "https://posit.co/wp-content/uploads/2022/10/base-r.pdf"
View(url)
La función de densidad de la distribución normal con parámetros \(\mu\) y \(\sigma^2\) está dada por:
\[f(x)\;= \; \frac{1}{\sqrt{2 \pi \sigma^2}} \, e^{-\frac{(x-\mu)^2} {2 \sigma^2}}\] En R la función “dnorm(x, mean, sd)” nos ayuda a utilizar la densidad de la distribución normal. Aquí:
x es un vector de números.
“mean” es un valor del parámetro μ. Por defecto, su valor es 0.
“sd” es un valor de σ. Por defecto, su valor es 1.
e# Declaracion de Variables
n <- 101
mu <- 0
sg <- 3
# Generacion de la muestra
e <- rnorm(n, mu, sg)
# muestra lo generado
e
-> [1] -2.002692609 3.237496976 5.958647417 1.103764617 -0.326630397
-> [6] -2.968404657 4.018829082 -6.579380490 5.130067744 2.774891048
-> [11] -2.151757758 0.064495633 2.105804164 3.492513281 3.668609612
-> [16] -0.209617714 3.625209141 -0.218274582 2.316733520 -2.176453467
-> [21] 3.029303519 -1.555195030 3.038205724 -0.223720165 4.926103116
-> [26] 0.682395138 2.332461745 -0.735748258 0.232972571 0.007605791
-> [31] -2.560627172 0.330147090 -3.238297918 -3.788129809 3.702371087
-> [36] -1.629556883 2.878750583 -1.238555539 -2.030966963 -1.082319895
-> [41] -0.181839523 0.816054765 -1.375116919 -1.919361354 1.622088150
-> [46] -2.150995520 3.264639928 2.086641079 -0.638148895 4.002299520
-> [51] 5.583822497 -1.426312905 -6.148494960 -3.125935081 -0.710240892
-> [56] 2.615256992 -1.609763752 -1.928723943 4.775171218 0.693655434
-> [61] -0.853199274 -3.789512764 -0.957493260 2.333677373 0.280252888
-> [66] 1.439285722 0.959042517 -0.398281957 1.443887417 0.038223947
-> [71] -0.426815311 -3.760719759 2.070524524 -2.314308330 0.138576828
-> [76] 1.647602672 -1.811944448 -5.008042737 -2.908841140 -0.891440654
-> [81] -3.635550918 2.232288407 -2.464164196 -5.881263974 0.352804412
-> [86] -0.528569599 2.695563648 0.213247986 -0.135581094 -3.796753071
-> [91] -2.358876154 -2.381712491 -1.838708990 -5.526927411 0.343155488
-> [96] -3.270004814 0.673134207 -0.464286955 -2.212729875 -0.282237978
-> [101] 1.071412231
# Histograma de la muestra generada
hist(e, col ="blue", main =" Valores de una normal", freq = FALSE)
curve(dnorm(x,mu,sg),add=TRUE, min(e),max(e),col="red",lwd=3, type="o")
# Declaracion de variable y sucesion
x <- seq(1,50, by = 0.5)
x
-> [1] 1.0 1.5 2.0 2.5 3.0 3.5 4.0 4.5 5.0 5.5 6.0 6.5 7.0 7.5 8.0
-> [16] 8.5 9.0 9.5 10.0 10.5 11.0 11.5 12.0 12.5 13.0 13.5 14.0 14.5 15.0 15.5
-> [31] 16.0 16.5 17.0 17.5 18.0 18.5 19.0 19.5 20.0 20.5 21.0 21.5 22.0 22.5 23.0
-> [46] 23.5 24.0 24.5 25.0 25.5 26.0 26.5 27.0 27.5 28.0 28.5 29.0 29.5 30.0 30.5
-> [61] 31.0 31.5 32.0 32.5 33.0 33.5 34.0 34.5 35.0 35.5 36.0 36.5 37.0 37.5 38.0
-> [76] 38.5 39.0 39.5 40.0 40.5 41.0 41.5 42.0 42.5 43.0 43.5 44.0 44.5 45.0 45.5
-> [91] 46.0 46.5 47.0 47.5 48.0 48.5 49.0 49.5 50.0
# Asignacion de valores
a <- -10
b <- 0.3
y el vector a + b * y# asignar el valor del vector y
y <- a+b
# mostar el valor del vector a+b
y
-> [1] -9.7
y ~ x con la función
lm() y asígnalo a una variable llamada “modelo”.Descripción del problema: Los autores desean ajustar un modelo de regresión lineal simple para explicar la Resistencia de una soldadura en función de la Edad de la soldadura.
# Cargando los Datos
# tomaremos los datos de la url:
file <- "https://raw.githubusercontent.com/fhernanb/datos/master/propelente"
# Leer los datos en formato tabla y asignarlos a la variable datos
datos <- read.table(file=file, header=TRUE)
head(datos) # shows the first 6 rows
## Modelo:
modelo <- lm(Resistencia ~ Edad, data=datos)
modelo
->
-> Call:
-> lm(formula = Resistencia ~ Edad, data = datos)
->
-> Coefficients:
-> (Intercept) Edad
-> 2627.82 -37.15
y ~ x usando la función plotplot(modelo, main = "Modelo y~x", col="red")
coef(modelo)
-> (Intercept) Edad
-> 2627.82236 -37.15359
Este script se describe el uso de diferentes librerias vamos a comenzar con la primer sección
Aprenderemos lo básico de algunos paquetes como tidyverse que provee de un tipo de dataframe diferente al que conocemos segun es mas moderno y tiene mejoras sobre el dataframe clasico.
El paquete lubridate nos ayuda a jugar con la estructura de las fechas y horas, además de realizar operaciones aritméticas para resolver problemas de tiempo, ajustes de hora para cambios de vuelos, etc…
janitor es una biblioteca que ayuda a limpiar nombres de columnas que vienen formateados de forma subóptima (para ser generosos) para el análisis de datos.
library(tidyverse)
-> ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
-> ✔ dplyr 1.1.3 ✔ readr 2.1.4
-> ✔ forcats 1.0.0 ✔ stringr 1.5.0
-> ✔ lubridate 1.9.3 ✔ tibble 3.2.1
-> ✔ purrr 1.0.2 ✔ tidyr 1.3.0
-> ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
-> ✖ dplyr::filter() masks stats::filter()
-> ✖ dplyr::lag() masks stats::lag()
-> ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
library(lubridate)
library(janitor)
->
-> Attaching package: 'janitor'
->
-> The following objects are masked from 'package:stats':
->
-> chisq.test, fisher.test
## Se esta creando un dataframe
## Define un cuadro de datos de la forma estándar
ugly_df <- data.frame(
a = 1:1000,
b = sample(x = c("a", "b"), size = 1000, replace = TRUE)
)
## Imprime los primeros elementos
ugly_df
## la función head() permite previsualizar los primeros 6 datos de la tabla ya que el dataframe creado contiene 1000 filas
head(ugly_df)
## Los tibbles son data frames, pero modifican algunas
## características antiguas para hacernos la vida más fácil.
## Convierte el cuadro de datos estándar a una tibble
beautified_df <- as_tibble(ugly_df)
beautified_df
## Puedes crear un nuevo tibble a partir de vectores individuales con tibble().
## ...O usa tibble desde el principio en lugar de data.frame()
pretty_df <- tibble(
a = 1:1000,
b = sample(x = c("a", "b"), size = 1000, replace = TRUE)
)
pretty_df
## tribble: crea un cuadro de datos pequeño de manera fácil de leer.
tribble(
~pokemon, ~is_caught, ~is_shiny,
"Charmander", "yes", "no",
"Bulbasaur", "no", NA_character_,
"Squirtle", "yes", "yes"
)
## Removeremos los objetos para continuar con la siguiente seccion
rm(ugly_df, pretty_df, beautified_df)
Es fundamental aprender a leer datos para ser analizados en Rstudio (importar datos) a continuacion se muestran algunos metodos para cargar datos a Rstudio
# Este codigo esta cargando un archivo .csv desde una pagina de internet
# Se asignara a la variable url
url <-"https://raw.githubusercontent.com/fivethirtyeight/data/master/alcohol-consumption/drinks.csv"
## Se define una nueva base de datos nombrada alcohol... se leera el archivo contenido en el url
## asignado
## Leer con función base
alcohol_default_tbl <- read.csv(url)
head(alcohol_default_tbl)
## Esta funcion lee el mismo archivo pero ahora ponemos las cloumnas y se espefica que tipo de datos reciben
## Misma función, especificando los tipos de columnas
## No recibimos comentarios en esta ocasión
alcohol_readr2_tbl <- read_csv(
file = url,
col_types = cols(
country = col_character(),
beer_servings = col_double(),
spirit_servings = col_double(),
wine_servings = col_character(),
total_litres_of_pure_alcohol = col_double()
))
## Limpia entorno
rm(alcohol_default_tbl, alcohol_readr_tbl, alcohol_readr2_tbl, url)
-> Warning in rm(alcohol_default_tbl, alcohol_readr_tbl, alcohol_readr2_tbl, :
-> objeto 'alcohol_readr_tbl' no encontrado
El operador pipeline %>% es útil para concatenar múltiples dplyr operaciones. Las pipas se usan para expresar una sequencia de instrucciones. El lado izquierdo pasa como primer parámetro al lado derecho.
## Ejemplos muy simples
log(9.1)
-> [1] 2.208274
9.1 %>% log()
-> [1] 2.208274
max(pi, 3)
-> [1] 3.141593
pi %>% max(3)
-> [1] 3.141593
## Un poco más elaborado:
## La expresión
seq(-pi, pi, by = 0.1) |> sin() |> plot(type= "l")
## es equivalente a
seq(-pi, pi, by = 0.1) %>% sin() %>% plot(type= "l")
## O
plot(sin(seq(-pi, pi, by = 0.1)), type = "l")
## O
x <- seq(-pi, pi, by = 0.1)
y <- sin(x)
plot(y, type = "l")
rm(x, y)
El paquete dplyr contiene una colección de funciones para realizar operaciones de manipulación de datos comunes como: filtrar por fila, seleccionar columnas específicas, reordenar filas, añadir nuevas filas y agregar datos.
## Invitados de Jon Stewart en TDS
url <- "https://raw.githubusercontent.com/fivethirtyeight/data/master/daily-show-guests/daily_show_guests.csv"
## Fuente: https://github.com/fivethirtyeight/data
## Lee datos directamente de página
guests_raw_tbl <- read_csv(url)
-> Rows: 2693 Columns: 5
-> ── Column specification ────────────────────────────────────────────────────────
-> Delimiter: ","
-> chr (4): GoogleKnowlege_Occupation, Show, Group, Raw_Guest_List
-> dbl (1): YEAR
->
-> ℹ Use `spec()` to retrieve the full column specification for this data.
-> ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
guests_raw_tbl
## Limpia nombres de columnas
guests_tbl <- clean_names(guests_raw_tbl)
guests_tbl
## Mutate
guests_tbl %>% mutate(year_plus_one = year + 1) ## Cambia una columna
guests_tbl %>% mutate(year = year + 1) ## O sobreescríbela
## Select
guests_tbl %>% select(show, raw_guest_list) ## Selecciona dos
guests_tbl %>% select(ends_with("list")) ## Opción más sofisticada
guests_tbl %>% select(matches("o")) ## Usando expresiones regulares
guests_tbl[, c(1, 2)] ## O índices (trata de evitarlo)
## Filter
guests_tbl %>% filter(group == "Musician")
guests_tbl %>%
filter(raw_guest_list == "Bernie Sanders" |
raw_guest_list == "Sen. Hillary Clinton")
## Summarize
guests_tbl %>% summarize(counts = length(group)) ## Cuenta invitados
guests_tbl %>% summarize(counts = n()) ## Usa n() de dplyr
guests_tbl %>%
group_by(group) %>%
summarize(counts = n()) ## Combina with group_by()
guests_tbl %>%
group_by(group, year) %>%
summarize(counts = n()) ## Agrega otro agrupamiento
-> `summarise()` has grouped output by 'group'. You can override using the
-> `.groups` argument.
## Arrange
guests_tbl %>% arrange(group, raw_guest_list)
## Limpia entorno
rm(url, guests_raw_tbl, guests_tbl)
El paquete tidyr contiene herramientas para crear tablas de datos tidy , donde cada columna es una variable, cada fila una observación y cada celda contiene un único valor.
## Ejemplo de juguete
crashes_tbl <-
tribble(
~site, ~before, ~after, ~aadt, ~rurub, ~file,
"A", 30, 20, 13500, "Urban", "nov_08",
"B", 10, 11, 15000, "Urban", "oct_08",
"C", 9, 2, 5500, "Rural", "jan_09"
)
crashes_tbl
## Pivot longer
long_crashes_tbl <-
crashes_tbl %>%
pivot_longer(cols = c(before, after),
names_to = "occasion",
values_to = "crashes")
long_crashes_tbl
# Pivot wider
long_crashes_tbl %>%
pivot_wider(names_from = occasion, values_from = crashes)
## Separate
long_crashes_tbl %>%
separate(col = file, into = c("month", "year"), sep = "_")
rm(long_crashes_tbl, crashes_tbl)
El paquete stringr proporciona un conjunto de herramientas internamente consistentes para trabajar con cadenas de caracteres, por ej. secuencias de caracteres delimitados por comillas.
baby_shark_song <-
"
Baby Shark, doo-doo, doo-doo
Baby Shark, doo-doo, doo-doo
Baby Shark, doo-doo, doo-doo
Baby Shark
Mommy Shark, doo-doo, doo-doo
Mommy Shark, doo-doo, doo-doo
Mommy Shark, doo-doo, doo-doo
Mommy Shark
Daddy Shark, doo-doo, doo-doo
Daddy Shark, doo-doo, doo-doo
Daddy Shark, doo-doo, doo-doo
Daddy Shark
Grandma Shark, doo-doo, doo-doo
Grandma Shark, doo-doo, doo-doo
Grandma Shark, doo-doo, doo-doo
Grandma Shark
Grandpa Shark, doo-doo, doo-doo
Grandpa Shark, doo-doo, doo-doo
Grandpa Shark, doo-doo, doo-doo
Grandpa Shark
Let's go hunt, doo-doo, doo-doo
Let's go hunt, doo-doo, doo-doo
Let's go hunt, doo-doo, doo-doo
Let's go hunt
Run away, doo-doo, doo-doo
Run away, doo-doo, doo-doo
Run away, doo-doo, doo-doo
Run away (ah!)
Safe at last, doo-doo, doo-doo
Safe at last, doo-doo, doo-doo
Safe at last, doo-doo, doo-doo
Safe at last (phew)
It's the end, doo-doo, doo-doo
It's the end, doo-doo, doo-doo
It's the end, doo-doo, doo-doo
It's the end"
## Print
baby_shark_song
-> [1] "\nBaby Shark, doo-doo, doo-doo\nBaby Shark, doo-doo, doo-doo\nBaby Shark, doo-doo, doo-doo\nBaby Shark\nMommy Shark, doo-doo, doo-doo\nMommy Shark, doo-doo, doo-doo\nMommy Shark, doo-doo, doo-doo\nMommy Shark\nDaddy Shark, doo-doo, doo-doo\nDaddy Shark, doo-doo, doo-doo\nDaddy Shark, doo-doo, doo-doo\nDaddy Shark\nGrandma Shark, doo-doo, doo-doo\nGrandma Shark, doo-doo, doo-doo\nGrandma Shark, doo-doo, doo-doo\nGrandma Shark\nGrandpa Shark, doo-doo, doo-doo\nGrandpa Shark, doo-doo, doo-doo\nGrandpa Shark, doo-doo, doo-doo\nGrandpa Shark\nLet's go hunt, doo-doo, doo-doo\nLet's go hunt, doo-doo, doo-doo\nLet's go hunt, doo-doo, doo-doo\nLet's go hunt\nRun away, doo-doo, doo-doo\nRun away, doo-doo, doo-doo\nRun away, doo-doo, doo-doo\nRun away (ah!)\nSafe at last, doo-doo, doo-doo\nSafe at last, doo-doo, doo-doo\nSafe at last, doo-doo, doo-doo\nSafe at last (phew)\nIt's the end, doo-doo, doo-doo\nIt's the end, doo-doo, doo-doo\nIt's the end, doo-doo, doo-doo\nIt's the end"
cat(baby_shark_song) ## Usamos cat para respetar líneas nuevas
->
-> Baby Shark, doo-doo, doo-doo
-> Baby Shark, doo-doo, doo-doo
-> Baby Shark, doo-doo, doo-doo
-> Baby Shark
-> Mommy Shark, doo-doo, doo-doo
-> Mommy Shark, doo-doo, doo-doo
-> Mommy Shark, doo-doo, doo-doo
-> Mommy Shark
-> Daddy Shark, doo-doo, doo-doo
-> Daddy Shark, doo-doo, doo-doo
-> Daddy Shark, doo-doo, doo-doo
-> Daddy Shark
-> Grandma Shark, doo-doo, doo-doo
-> Grandma Shark, doo-doo, doo-doo
-> Grandma Shark, doo-doo, doo-doo
-> Grandma Shark
-> Grandpa Shark, doo-doo, doo-doo
-> Grandpa Shark, doo-doo, doo-doo
-> Grandpa Shark, doo-doo, doo-doo
-> Grandpa Shark
-> Let's go hunt, doo-doo, doo-doo
-> Let's go hunt, doo-doo, doo-doo
-> Let's go hunt, doo-doo, doo-doo
-> Let's go hunt
-> Run away, doo-doo, doo-doo
-> Run away, doo-doo, doo-doo
-> Run away, doo-doo, doo-doo
-> Run away (ah!)
-> Safe at last, doo-doo, doo-doo
-> Safe at last, doo-doo, doo-doo
-> Safe at last, doo-doo, doo-doo
-> Safe at last (phew)
-> It's the end, doo-doo, doo-doo
-> It's the end, doo-doo, doo-doo
-> It's the end, doo-doo, doo-doo
-> It's the end
## str_replace
baby_shark_song |> ## Only the first
str_replace("Shark", "Pirahna") |>
cat()
->
-> Baby Pirahna, doo-doo, doo-doo
-> Baby Shark, doo-doo, doo-doo
-> Baby Shark, doo-doo, doo-doo
-> Baby Shark
-> Mommy Shark, doo-doo, doo-doo
-> Mommy Shark, doo-doo, doo-doo
-> Mommy Shark, doo-doo, doo-doo
-> Mommy Shark
-> Daddy Shark, doo-doo, doo-doo
-> Daddy Shark, doo-doo, doo-doo
-> Daddy Shark, doo-doo, doo-doo
-> Daddy Shark
-> Grandma Shark, doo-doo, doo-doo
-> Grandma Shark, doo-doo, doo-doo
-> Grandma Shark, doo-doo, doo-doo
-> Grandma Shark
-> Grandpa Shark, doo-doo, doo-doo
-> Grandpa Shark, doo-doo, doo-doo
-> Grandpa Shark, doo-doo, doo-doo
-> Grandpa Shark
-> Let's go hunt, doo-doo, doo-doo
-> Let's go hunt, doo-doo, doo-doo
-> Let's go hunt, doo-doo, doo-doo
-> Let's go hunt
-> Run away, doo-doo, doo-doo
-> Run away, doo-doo, doo-doo
-> Run away, doo-doo, doo-doo
-> Run away (ah!)
-> Safe at last, doo-doo, doo-doo
-> Safe at last, doo-doo, doo-doo
-> Safe at last, doo-doo, doo-doo
-> Safe at last (phew)
-> It's the end, doo-doo, doo-doo
-> It's the end, doo-doo, doo-doo
-> It's the end, doo-doo, doo-doo
-> It's the end
baby_shark_song %>% ## Only the first
str_replace_all("Shark", "Piranha") %>%
cat()
->
-> Baby Piranha, doo-doo, doo-doo
-> Baby Piranha, doo-doo, doo-doo
-> Baby Piranha, doo-doo, doo-doo
-> Baby Piranha
-> Mommy Piranha, doo-doo, doo-doo
-> Mommy Piranha, doo-doo, doo-doo
-> Mommy Piranha, doo-doo, doo-doo
-> Mommy Piranha
-> Daddy Piranha, doo-doo, doo-doo
-> Daddy Piranha, doo-doo, doo-doo
-> Daddy Piranha, doo-doo, doo-doo
-> Daddy Piranha
-> Grandma Piranha, doo-doo, doo-doo
-> Grandma Piranha, doo-doo, doo-doo
-> Grandma Piranha, doo-doo, doo-doo
-> Grandma Piranha
-> Grandpa Piranha, doo-doo, doo-doo
-> Grandpa Piranha, doo-doo, doo-doo
-> Grandpa Piranha, doo-doo, doo-doo
-> Grandpa Piranha
-> Let's go hunt, doo-doo, doo-doo
-> Let's go hunt, doo-doo, doo-doo
-> Let's go hunt, doo-doo, doo-doo
-> Let's go hunt
-> Run away, doo-doo, doo-doo
-> Run away, doo-doo, doo-doo
-> Run away, doo-doo, doo-doo
-> Run away (ah!)
-> Safe at last, doo-doo, doo-doo
-> Safe at last, doo-doo, doo-doo
-> Safe at last, doo-doo, doo-doo
-> Safe at last (phew)
-> It's the end, doo-doo, doo-doo
-> It's the end, doo-doo, doo-doo
-> It's the end, doo-doo, doo-doo
-> It's the end
baby_shark_song %>% ## Using regular expressions to include capital letters
str_replace_all("(, |\\)|\\()", " - ") %>%
cat()
->
-> Baby Shark - doo-doo - doo-doo
-> Baby Shark - doo-doo - doo-doo
-> Baby Shark - doo-doo - doo-doo
-> Baby Shark
-> Mommy Shark - doo-doo - doo-doo
-> Mommy Shark - doo-doo - doo-doo
-> Mommy Shark - doo-doo - doo-doo
-> Mommy Shark
-> Daddy Shark - doo-doo - doo-doo
-> Daddy Shark - doo-doo - doo-doo
-> Daddy Shark - doo-doo - doo-doo
-> Daddy Shark
-> Grandma Shark - doo-doo - doo-doo
-> Grandma Shark - doo-doo - doo-doo
-> Grandma Shark - doo-doo - doo-doo
-> Grandma Shark
-> Grandpa Shark - doo-doo - doo-doo
-> Grandpa Shark - doo-doo - doo-doo
-> Grandpa Shark - doo-doo - doo-doo
-> Grandpa Shark
-> Let's go hunt - doo-doo - doo-doo
-> Let's go hunt - doo-doo - doo-doo
-> Let's go hunt - doo-doo - doo-doo
-> Let's go hunt
-> Run away - doo-doo - doo-doo
-> Run away - doo-doo - doo-doo
-> Run away - doo-doo - doo-doo
-> Run away - ah! -
-> Safe at last - doo-doo - doo-doo
-> Safe at last - doo-doo - doo-doo
-> Safe at last - doo-doo - doo-doo
-> Safe at last - phew -
-> It's the end - doo-doo - doo-doo
-> It's the end - doo-doo - doo-doo
-> It's the end - doo-doo - doo-doo
-> It's the end
## str_detect
baby_shark_song %>% ## Using regular expressions to detect several words. It's false
str_detect("(Octopus|Whale)")
-> [1] FALSE
baby_shark_song %>% ## Must be true
str_detect("Shark")
-> [1] TRUE
## str_length
baby_shark_song %>% str_length()
-> [1] 947
## Limpia entorno
rm(baby_shark_song)
# forcats -----------------------------------------------------------------
tod <- rep(c("day", "night", "dawn", "dusk"), c(100, 30, 3, 2))
## Barplot
tod %>% qplot(geom = "bar")
-> Warning: `qplot()` was deprecated in ggplot2 3.4.0.
-> This warning is displayed once every 8 hours.
-> Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
-> generated.
## Cambia a factor (gráfico no cambia)
tod %>%
factor() %>%
qplot(geom = "bar")
## Fija "day" como el primer nivel
tod %>%
factor() %>%
fct_relevel("day") %>%
qplot(geom = "bar")
## Set order of all of them
tod %>%
factor() %>%
fct_relevel(c("day", "night", "dawn")) %>%
qplot(geom = "bar")
## Invert order
tod %>%
factor() %>%
fct_relevel(c("day", "night", "dawn")) %>%
fct_rev() %>%
qplot(geom = "bar")
## Lump values
tod %>%
factor() %>%
fct_lump(n = 2) %>%
qplot(geom = "bar")
## Collapse
tod %>%
factor() %>%
fct_collapse(nightish = c("night", "dawn", "dusk")) %>%
qplot(geom = "bar")
rm(tod)
Lubridate es un paquete de R, que a partir de una serie de herramientas facilitan el análisis y manipulación de fechas. De esta manera es más sencillo trabajar con los datos del tiempo.
## Caracteres a fechas
ymd("2022-09-28")
-> [1] "2022-09-28"
mdy("09/28/2022")
-> [1] "2022-09-28"
## Auxiliares
today()
-> [1] "2023-10-07"
now()
-> [1] "2023-10-07 12:11:49 CST"
## Extraer elementos of fechas
today() %>% month()
-> [1] 10
today() %>% month(label = TRUE)
-> [1] oct
-> 12 Levels: ene < feb < mar < abr < may < jun < jul < ago < sep < ... < dic
today() %>% year()
-> [1] 2023
now() %>% minute()
-> [1] 11
## Operaciones
today() - years(1)
-> [1] "2022-10-07"
today() - days(30)
-> [1] "2023-09-07"
purrr es un paquete que permite realizar bucles de una manera no convencional, diferente, quizás más fácil de entender, al tratarlos como funciones naturales.
## De la documentación de purrr:
mtcars %>% head()
mtcars %>%
split(.$cyl) %>% # from base R
map(~ lm(mpg ~ wt, data = .)) %>%
map(summary) %>%
map_dbl("r.squared")
-> 4 6 8
-> 0.5086326 0.4645102 0.4229655
Este script se describe el uso de diferentes librerias vamos a comenzar con la primer sección
# primero instalar los paquetes reiniciar el Rstudio y luego compilar de nuevo el pdf
# de otra manera el pdf no se compila y se bloquea el R
library(ggalt)
-> Registered S3 methods overwritten by 'ggalt':
-> method from
-> grid.draw.absoluteGrob ggplot2
-> grobHeight.absoluteGrob ggplot2
-> grobWidth.absoluteGrob ggplot2
-> grobX.absoluteGrob ggplot2
-> grobY.absoluteGrob ggplot2
library(tidyverse)
library(janitor)
library(datos)
library(ggplot2)
library(gapminder)
## Extensiones
library(ggmosaic)
library(GGally)
-> Registered S3 method overwritten by 'GGally':
-> method from
-> +.gg ggplot2
->
-> Attaching package: 'GGally'
-> The following object is masked from 'package:ggmosaic':
->
-> happy
library(patchwork)
library(plotly)
->
-> Attaching package: 'plotly'
-> The following object is masked from 'package:ggplot2':
->
-> last_plot
-> The following object is masked from 'package:stats':
->
-> filter
-> The following object is masked from 'package:graphics':
->
-> layout
library(esquisse)
library(gganimate)
library(gghighlight)
library(ggrepel)
library(ggpubr)
library(ggimage)
->
-> Attaching package: 'ggimage'
-> The following object is masked from 'package:ggpubr':
->
-> theme_transparent
library(ggthemes)
library(ggforce)
ggmosaic fue diseñado para crear visualizaciones de datos categóricos y es capaz de producir gráficos de barras, gráficos de barras apiladas, gráficos de mosaico y gráficos de dos pisos.
datos_credito_tbl <- datos_credito |> clean_names() |> as_tibble()
datos_credito_tbl
## Ejemplo simple
datos_credito_tbl |>
ggplot() +
geom_mosaic(aes(x = product(estado_civil), fill = estado))
-> Warning: `unite_()` was deprecated in tidyr 1.2.0.
-> ℹ Please use `unite()` instead.
-> ℹ The deprecated feature was likely used in the ggmosaic package.
-> Please report the issue at <https://github.com/haleyjeppson/ggmosaic>.
-> This warning is displayed once every 8 hours.
-> Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
-> generated.
## Misma idea, grafica mejorada
datos_credito_tbl |>
mutate(
estado_civil =
estado_civil |>
fct_relevel("casado", "viudo", "soltero", "divorciado") |>
fct_collapse(`sep/div` = c("separado", "divorciado"))
) |>
drop_na(estado_civil) |>
ggplot() +
geom_mosaic(aes(x = product(estado_civil), fill = estado)) +
scale_fill_brewer(palette="Set1") +
theme_bw() +
theme(legend.position = "none") +
coord_flip()
## Agregar tan solo una variable adicional puede sobrecomplicar la gráfica
datos_credito_tbl |>
mutate(
estado_civil =
estado_civil |>
fct_relevel("casado", "viudo", "soltero", "divorciado") |>
fct_collapse(`sep/div` = c("separado", "divorciado"))
) |>
drop_na(estado_civil) |>
ggplot() +
geom_mosaic(aes(x = product(estado_civil, trabajo), fill = estado)) +
coord_flip()
rm(datos_credito_tbl)
El paquete GGally contiene la función ggpairs que es el equivalente en ggplot2 a la función pairs de R base. Puedes pasar un data frame que contenga tanto variables continuas como categóricas.
mtcars |>
mutate(trans = if_else(am == 0, "Automática", "Manual"),
cyl = as.factor(cyl)) |>
ggpairs(columns = c("mpg", "wt", "trans"))
-> `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
-> `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## Agregando variable de para color
mtcars |>
mutate(trans = if_else(am == 0, "Automática", "Manual"),
cyl = as.factor(cyl)) |>
ggpairs(columns = c("mpg", "wt", "cyl"), mapping = aes(color = trans))
-> `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
-> `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## 3.3 La función patchwork Patchwork es una librería de R que sirve
para crear un gráfico complejo compuesto por varios gráficos simples en
distintas posiciones y de distintos tamaños, del mismo modo que a veces
las colchas se tejen a partir de retales.
## Simulamos datos
x <- seq(-pi + 1e-3, pi - 1e-3, length.out = 200)
seN <- base::cos(x)
coseno <- cos(x)
tangente <- tan(x)
## Generamos tres gráficas
g1 <- ggplot(data = NULL, aes(x, seN)) + geom_line() + theme_bw()
g2 <- ggplot(data = NULL, aes(x, coseno)) + geom_line() + theme_bw()
g3 <- ggplot(data = NULL, aes(x, tangente)) + geom_line() + theme_bw()
## De la manera que sabemos:
tibble(x, seN, coseno, tangente) |>
pivot_longer(-x, names_to = "Funcion", values_to = "Valor") |>
ggplot(aes(x, Valor)) +
geom_line() +
facet_wrap(~Funcion, scales = "free_y") +
theme_bw()
## ¿Y si las gráficas son de differente índole? ¡Usamos patchwork!
g1 + g2 + g3
g3 + (g1 / g2)
## ¿Y si tenemos una lista de gráficas?
g_list <- list(g1, g2, g3)
wrap_plots(g_list)
## ¿Y si tenemos una gráfica base y una de ggplot2"?
g1 + wrap_elements(~plot(seN ~ x, type = "l") )
rm(g_list, g1, g2, g3, coseno, seN, tangente, x)
El paquete plotly permite la construcción de gráficas de alta calidad y permite incorporar la interactividad en los gráficos, mostrando botones para hacer zoom en una parte de la gráfica, redefinir los ejes X e Y, mostrar la información que contiene cada dato, mostrar datos filtrando por uno o varios factores… Además, son gráficos de tipo “responsive”: se adaptan a las dimensiones de la ventana en que aparecen.
## Not a ggplot2
# volcano is a numeric matrix that ships with R
fig <- plot_ly(z = ~volcano)
fig <- fig %>% add_surface()
fig
rm(fig)
## Un ggplot
p1 <-
mtcars |>
mutate(
cyl = as.factor(cyl),
`Transmisión` = c("Automática", "Estándar")[am + 1],
am = as.factor(am)) |>
ggplot(aes(hp, mpg, color = cyl)) +
geom_point() +
facet_wrap(~ `Transmisión`, labeller = label_both) +
labs(x = "HP", y = "MPG", color = "Cilindros:") +
theme_light() +
theme(legend.position = "bottom")
ggplotly(p1)
rm(p1)
Esta biblioteca permite crear visualizaciones interactivas de manera sencilla con un editor visual, lo que facilita una primera exploración de los datos desde dentro de RStudio sin tener que programar una sola línea de código.
Básicamente, lo que hace esquisse es proporcionar una interfaz gráfica para especificar todos los parámetros necesarios en una llamada de la función ggplot() mediante una aplicación escrita en Shiny.
Esta herramienta os puede ser muy útil para explorar los conjuntos de datos que usaréis en los ejercicios prácticos de asignaturas como Minería de datos o Visualización de datos, dentro del grado de Ciencia de Datos Aplicada de la UOC.
## practicar el uso de esta libreria
## Cargar datos al entorno
data(mtcars)
rm(mtcars)
GGANIMATE es una extensión del paquete ggplot2 para crear ggplots animados utilizando el softaware R. Proporciona una gama de nuevas funciones que se pueden agregar al objeto de trazado para personalizar cómo debe cambiar con el tiempo.
ggplot(gapminder, aes(gdpPercap, lifeExp, size = pop, colour = country)) +
geom_point(alpha = 0.7, show.legend = FALSE) +
scale_colour_manual(values = country_colors) +
scale_size(range = c(2, 12)) +
scale_x_log10() +
facet_wrap(~continent) +
# Here comes the gganimate specific bits
labs(title = 'Year: {frame_time}', x = 'GDP per capita', y = 'life expectancy') +
transition_time(year) +
ease_aes('linear')
## 3.7 La función gghighlight
ggplot(gapminder, aes(gdpPercap, lifeExp, size = pop, colour = country)) +
geom_point(alpha = 0.7, show.legend = FALSE) +
scale_colour_manual(values = country_colors) +
scale_size(range = c(2, 12)) +
scale_x_log10() +
facet_wrap(~continent) +
gghighlight(year == 2002)
-> Warning: Tried to calculate with group_by(), but the calculation failed.
-> Falling back to ungrouped filter operation...
-> label_key: country
-> Too many data points, skip labeling
ggplot(gapminder, aes(gdpPercap, lifeExp, size = pop, colour = country)) +
geom_point(alpha = 0.7, show.legend = FALSE) +
scale_colour_manual(values = country_colors) +
scale_size(range = c(2, 12)) +
scale_x_log10() +
facet_wrap(~continent) +
gghighlight(year == 2007)
-> Warning: Tried to calculate with group_by(), but the calculation failed.
-> Falling back to ungrouped filter operation...
-> label_key: country
-> Too many data points, skip labeling
El paquete ggrepel proporciona las funciones geom_text_repel y geom_label_repel , que hacen que las etiquetas se repelen tanto como sea posible. Puedes personalizar los colores, las fuentes otros argumentos de la misma manera que con geom_text o geom_label .
e <- ggplot(
data = transform(mtcars,
car = row.names(mtcars)),
aes(hp, mpg))
e ## Base
e + geom_point() # Puntos
## El que sabemos hacer
e +
geom_label(aes(label = car), nudge_x = 1, nudge_y = 1, size = 3) +
geom_point()
## Cong ggrepel
e +
geom_label_repel(aes(label = car), nudge_x = 1, nudge_y = 1, size = 3) +
geom_point()
## Un poco mejorado
e +
geom_label_repel(aes(label = car), nudge_x = 1, nudge_y = 1, size = 3,
box.padding = 0.5,
segment.curvature = -0.2) +
geom_point() +
theme_bw()
-> Warning: ggrepel: 6 unlabeled data points (too many overlaps). Consider
-> increasing max.overlaps
## Con texto
e +
geom_text_repel(aes(label = car), nudge_x = 1, nudge_y = 1, size = 3) +
geom_point()
rm(e)
Logra enmarcar las características de la variable en el gráfico. Para ejemplificar esta funcion se hará uso de la data airports del paquete nycflights13. Se hará un gráfico mostrando los timezones según longitud y latitud como ejes.
## Ejemplo obtenido de la documentación
ggplot(midwest, aes(state, area)) + geom_point()
# Boxplot and Violin plots convey information on the distribution but not the
# number of samples, while Jitter does the opposite.
ggplot(midwest, aes(state, area)) +
geom_violin()
ggplot(midwest, aes(state, area)) +
geom_jitter()
# Sina does both!
ggplot(midwest, aes(state, area)) +
geom_violin() +
geom_sina()
p <- ggplot(midwest, aes(state, popdensity)) +
scale_y_log10()
p + geom_sina()
# Colour the points based on the data set's columns
p + geom_sina(aes(colour = inmetro))
# Or any other way
cols <- midwest$popdensity > 10000
p + geom_sina(colour = cols + 1L)
# Sina plots with continuous x:
ggplot(midwest, aes(cut_width(area, 0.02), popdensity)) +
geom_sina() +
scale_y_log10()