UNIVERSIDAD CENTRAL DEL ECUADOR

FACULTAD DE CIENCIAS ECONÓMICAS

CARRERA DE INGENIERÍA ESTADÍSTICA

GRUPO Nº3

INTEGRANTES:

*La función barplot en R

data(mtcars)

attach(mtcars)

Tabla de frecuencias

mi_tabla <- table(cyl)

mi_tabla
## cyl
##  4  6  8 
## 11  7 14
par(mfrow = c(1, 2))

Gráfico de barras de frecuencia absoluta

barplot(mi_tabla, main = "Frequencia absoluta",
        
        col = rainbow(3))

Gráfico de barras de frecuencia relativa

barplot(prop.table(mi_tabla) * 100, main = "Frequencia relativa (%)",
        
        col = rainbow(3))

par(mfrow = c(1, 1))

Frecuencias absolutas y relativas*

plot(factor(mtcars$cyl), col = rainbow(3))

Gráfico de barras con la función plot

barp <- barplot(mi_tabla,                     # Guarda los valores de X que
                
main = "Frequencia absoluta", # representan el centro de
                
col = rainbow(3))             # cada barra          


lines(barp, c(5, 4, 12), type = "o", lwd = 3)

Añadir líneas para crear un climograma

barp <- barplot(mi_tabla, col = rainbow(3), ylim = c(0, 15))

text(barp, mi_tabla + 0.5, labels = mi_tabla)

-Gráfico de barras con números representando la frecuencia de cada clase. Por último, podría resultar interesante añadir un grid debajo de las barras del gráfico con la función grid.

barp <- barplot(mi_tabla, col = rainbow(3), ylim = c(0, 15))

grid(nx = NA, ny = NULL, lwd = 1, lty = 1, col = "gray")

barplot(mi_tabla, col = rainbow(3), ylim = c(0, 15), add = TRUE)

Título, etiquetas y colores del gráfico de barras

barplot(mi_tabla,                               # Datos
        
        main = "Gráfico de barras",             # Título
        
        xlab = "Número de cilindros",           # Etiqueta del eje X
        
        ylab = "Frecuencia",                    # Etiqueta del eje Y
        
        border = "black",                       # Color del borde de las barras
        
        col = c("darkgrey", "darkblue", "red")) # Color para cada barra

barplot(mi_tabla, names.arg = c("cuatro", "seis", "ocho"))

Espacio y ancho de las barras

par(mfrow = c(1, 2))

Ancho de las barras (por defecto: width = 1)

barplot(mi_tabla, main = "Cambiar el ancho de las barras",
          
          col = rainbow(3), width = c(0.4, 0.2, 1))

Espacio entre las barras

 barplot(mi_tabla, main = "Cambiar el espacio entre barras",
          
          col = rainbow(3), space = c(1, 1.1, 0.1))

 par(mfrow = c(1, 1))

Cambiar el ancho o el espacio entre las barras de un barchart en R

df <- data.frame(ColorCoche = c("rojo", "verde", "blanco", "azul"),
                   
                   num = c(3, 5, 9, 1))
 barplot(height = df$num, names = df$ColorCoche,
          
          col = c("red", "green", "white", "blue"))

Gráfico de barras de una variable continua

x <- c(2.1, 8.6, 3.9, 4.4, 4.0, 3.7, 7.6, 3.1, 5.0, 5.5, 20.2, 1.7,
         
         5.2, 33.7, 9.1, 1.6, 3.1, 5.6, 16.5, 15.8, 5.8, 6.8, 3.3, 40.6)
  barplot(table(cut(x, breaks = seq(0, 45, by = 5))))

Gráfico de barras horizontal en R

barplot(mi_tabla, main = "Gráfico de barras horizontal",
          
          ylab = "Número de cilindros", xlab = "Frecuencia",
          
          horiz = TRUE) # Gráfico de barras horizontal

Leyenda del gráfico de barras

barplot(mi_tabla, xlab = "Número de cilindros",
          
          col = rainbow(3),
          
          legend.text = rownames(mi_tabla)) # Leyenda

 barplot(mi_tabla, xlab = "Número de cilindros",
          
          col = rainbow(3),
          
          legend.text = rownames(mi_tabla),
          
          args.legend = list(x = "top"))

Cambiar posición a la leyenda del diagrama de barras en R

 barplot(mi_tabla, xlab = "Número de cilindros",
          
          col = rainbow(3))
  
  legend("top", legend = rownames(mi_tabla), fill = rainbow(3))

par(mar = c(5, 5, 4, 10))
  
  barplot(mi_tabla, xlab = "Número de cilindros",
          
          col = rainbow(3),
          
          legend.text = rownames(mi_tabla), # Valores de la leyenda
          
          args.legend = list(x = "topright", inset = c(-0.20, 0))) # Argumentos de la leyenda

Añadir leyenda a un gráfico de barras sin superponerse

 barplot(mi_tabla, xlab = "Número de cilindos",
          
          col = rainbow(3),
          
          legend.text = rownames(mi_tabla), xlim = c(0, 4.25))

Otra alternativa para mover la leyenda dev.off()

 plot.new()
  
  layout(rbind(1, 2), heights = c(10, 3))
  
  barplot(mi_tabla, xlab = "Número de cilindros",
          
          col = rainbow(3))
  
  
  
  par(mar = c(0, 0, 0, 0))
  
  plot.new()
  
  legend("top", rownames(mi_tabla), lty = 1,
         
         col = c("red", "green", "blue"), lwd = c(1, 2))

Gráfico de barras agrupadas en R

 am <- factor(am)

Cambiamos los niveles del factor

levels(am) <- c("Automatica", "Manual")

Tabla cilindros - tipo de transmisión

tabla_variables <- table(cyl, am)
barplot(tabla_variables,
          
          main = "Gráfico de barras agrupado",
          
          xlab = "Tipo de transmisión", ylab = "Frecuencia",
          
          col = c("darkgrey", "darkblue", "red"),
          
          legend.text = rownames(tabla_variables),
          
          beside = TRUE) # Barras agrupadas

Crear gráfico de barras por grupos en R

barplot(tabla_variables,
          
          main = "Espacio entre grupos",
          
          xlab = "Tipo de transmisión", ylab = "Frecuencia",
          
          col = c("darkgrey", "darkblue", "red"),
          
          legend.text = rownames(tabla_variables),
          
          beside = TRUE,
          
          space = c(0.4, 2.5)) # Espacio

Valores numéricos en grupos

 resumen_datos <- tapply(mtcars$hp, list(cilindros = mtcars$cyl,
                                            
                                            transmision = am),
                            
                            FUN = mean, na.rm = TRUE)
 par(mar = c(5, 5, 4, 10))
 barplot(resumen_datos, xlab = "Tipo de transmisión",
          
          main = "Media CV",
          
          col = rainbow(3),
          
          beside = TRUE,
          
          legend.text = rownames(resumen_datos),
          
          args.legend = list(title = "Cilindros", x = "topright",
                             
                             inset = c(-0.20, 0)))

Gráfico de barras en R con barras de error

 barplot.error <- function(x, y, ...) {
      
      mod <- lm(y ~ x)
      
      reps <- sqrt(lengthSí/length(levels(x)))
      
      sem <- sigma(mod)/reps
      
      means <- tapply(y, x, mean)
      
      upper <- max(means) + sem
      
      lev <- levels(x)
      
      barpl <- barplot(means, ...)
      
      invisible(sapply(1:length(barpl), function(i) arrows(barpl[i], means[i] + sem,
                                                           
                                                           barpl[i], means[i] - sem, angle = 90, code = 3, length = 0.08)))
      
 }

Gráfico de barras apiladas en R

mosaicplot(tabla_variables, main = "Mosaico")

Gráfico de mosaico en R

spineplot(tabla_variables)

Gráfico de espina en R

spineplot(t(tabla_variables))

Gráfico de barras en R con ggplot2

library(ggplot2)
## Warning: package 'ggplot2' was built under R version 4.3.2
## 
## Attaching package: 'ggplot2'
## The following object is masked from 'mtcars':
## 
##     mpg
    df <- as.data.frame(mi_tabla)
    
    
    
    ggplot(data = df, aes(x = cyl, y = Freq)) +
      
      geom_bar(stat = "identity")

Gráfico de barras horizontal en ggplot2

 ggplot(data = df, aes(x = cyl, y = Freq)) +
      
      geom_bar(stat = "identity") +
      
      coord_flip() # Barras horizontales

Histograma en R

distancia <- c(241.1, 284.4, 220.2, 272.4, 271.1, 268.3,
                     
                     291.6, 241.6, 286.1, 285.9, 259.6, 299.6,
                     
                     253.1, 239.6, 277.8, 263.8, 267.2, 272.6,
                     
                     283.4, 234.5, 260.4, 264.2, 295.1, 276.4,
                     
                     263.1, 251.4, 264.0, 269.2, 281.0, 283.2)
  hist(distancia, main = "Histograma de frecuencias", # Frecuencia
           
           ylab = "Frecuencia")

histograma de densidad.

 hist(distancia, prob = TRUE, main = "Histograma de densidad", # Densidad
           
           ylab = "Densidad")

      hist(distancia, prob = TRUE, ylab = "Densidad", main = "Grid")
      
      grid(nx = NA, ny = NULL, lty = 2, col = "gray", lwd = 1)
      
      hist(distancia, prob = TRUE, add = TRUE, col = "white") 

Cambiar el color del histograma

hist(distancia, main = "Cambiar color", ylab = "Frecuencia", col = "lightblue")

El argumento breaks

par(mfrow = c(1, 3))
      
      
      
      hist(distancia, breaks = 2, main = "Pocas clases", ylab = "Frecuencia")
      
      hist(distancia, breaks = 50, main = "Demasiadas clases", ylab = "Frecuencia")
      
      hist(distancia, main = "Método de Sturges", ylab = "Frecuencia")

      par(mfrow = c(1, 1))

Número de clases con el argumento breaks

 library(KernSmooth)
## Warning: package 'KernSmooth' was built under R version 4.3.2
## KernSmooth 2.23 loaded
## Copyright M. P. Wand 1997-2009
      ancho_barras <- dpih(distancia)
      
      
      
      nbarras <- seq(min(distancia) - ancho_barras,
                     
                     max(distancia) + ancho_barras, by = ancho_barras)
      
      
      
      hist(distancia, breaks = nbarras, main = "Plug-in", ylab = "Frecuencia")

Método plug in de Wand para seleccionar el número de clases Histograma en R con dos variables

 set.seed(1)
      
      
      
      x <- rnorm(1000)    # Primer grupo
      
      y <- rnorm(1000, 1) # Segundo grupo
      
      
      
      hist(x, main = "Dos variables", ylab = "Frecuencia")
      
      hist(y, add = TRUE, col = rgb(1, 0, 0, alpha = 0.5))

Histograma con curva normal

hist(distancia, prob = TRUE,
             
             main = "Histograma con curva normal", ylab = "Densidad")
      
      x <- seq(min(distancia), max(distancia), length = 40)
      
      f <- dnorm(x, mean = mean(distancia), sd = sd(distancia))
      lines(x, f, col = "red", lwd = 2)

Añadir curva de densidad a un histograma en R

 hist(distancia, freq = FALSE, main = "Curva densidad", ylab = "Densidad")
      
      lines(density(distancia), lwd = 2, col = 'red')

Histograma y boxplot en R

#  hist(distancia, probability = TRUE, ylab = "", main = "",
             
            #  col = rgb(1, 0, 0, alpha = 0.5), axes = FALSE)
        
        # axis(1) # Añade el eje horizontal
        
        # par(new = TRUE)
        
        # boxplot(distancia, horizontal = TRUE, axes = FALSE,
                
               #  lwd = 2, col = rgb(0, 0, 0, alpha = 0.2))
        
        # lines(x2, f, col = "red", lwd = 2) # Normal
        
        # legend("topright", c("Histograma", "Densidad", "Normal"), box.lty = 0,
               
              #  lty = 1, col = c("black", "blue", "red"), lwd = c(1, 2, 2))
        
       #  set.seed(1)

Histograma en R con ggplot2

 library(ggplot2)
      
      ggplot(data.frame(distancia), aes(x = distancia)) +
        
        geom_histogram(color = "gray", fill = "white")
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

Datos normales

  x <- rnorm(n = 5000, mean = 110, sd = 5)

Datos exponenciales

 y <- rexp(n = 3000, rate = 1)
      
      
      
      par(mfcol = c(1, 2))
      
      
      
     #  histDenNorm(x, prob = TRUE, main = "Histograma de X")
      
      # histDenNorm(y, prob = TRUE, main = "Histograma de Y")
      
      
      
      par(mfcol = c(1, 1))

Calculando el número de barras como la función hist()

 nbreaks <- pretty(range(distancia), n = nclass.Sturges(distancia),
                        
                        min.n = 1)
      
      ggplot(data.frame(distancia), aes(x = distancia)) +
        
        geom_histogram(breaks = nbreaks, color = "gray", fill = "white")

      ggplot(data.frame(distancia), aes(x = distancia)) +
        
        geom_histogram(aes(y = ..density..), breaks = nbreaks,
                       
                       color = "gray", fill = "white") +
        
        geom_density(fill = "black", alpha = 0.2)
## Warning: The dot-dot notation (`..density..`) was deprecated in ggplot2 3.4.0.
## ℹ Please use `after_stat(density)` instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.

Histograma en Plotly

  # install.packages("plotly")
      
    #   library(plotly)

Histograma de frecuencias

# fig <- plot_ly(x = distancia, type = "histogram")
      
      # fig

Histograma de densidad

# fig <- plot_ly(x = distancia, type = "histogram", histnorm = "probability")
      
    #   fig

Generamos datos

 x <- rnorm(500)
      
      par(mfrow = c(1, 2))

Creamos un histograma

hist(x, freq = FALSE, main = "Histograma y densidad",
           
           ylab = "Densidad")

Calculamos la densidad

    dx <- density(x)

Añadimos la línea de densidad

#   lines(dx, lwd = 2, col = "red")

Curva de densidad sin histograma

# plot(dx, lwd = 2, col = "red",
           
          #  main = "Densidad")

Añadimos los datos con riudo en el eje X

 # rug(jitter(x))

Histograma y densidad en R

  # library(EnvStats)
 # epdfPlot(x, epdf.col = "red")

Ejemplo de uso de la función epdfPlot del paquete EnvStats

par(mfrow = c(1, 2))

Ventana grande

plot(density(x, bw = 20), lwd = 2,
           
           col = "red", main = "Ventana demasiado grande")

Ventana pequeña

plot(density(x, bw = 0.05), lwd = 2,
           
           col = "red", main = "Ventana demasiado pequeña")

Alternativa equivalente con el paquete EnvStats

  # epdfPlot(x, epdf.col = "red", density.arg.list = list(bw = 0.05),main = "Ventana  
  # demasiado pequeña")

En el siguiente código se muestra cómo aplicar cada uno de los enfoques:

par(mfrow = c(1, 3))

Regla del pulgar

plot(density(x), main = "Regla del pulgar",
           
           cex.lab = 1.5, cex.main = 1.75, lwd = 2)

Validación cruzada insesgada

 plot(density(x, bw = bw.ucv(x)), col = 2, # Igual a: bw = "UCV"
           
           main = "Validación cruzada", cex.lab = 1.5,
           
           cex.main = 1.75, lwd = 2)

Plug-in*

 plot(density(x, bw = bw.SJ(x)), col = 4, # Igual a: bw = "SJ"
           
           main = "Método plug-in",
           
           cex.lab = 1.5, cex.main = 1.75, lwd = 2)

Multiples líneas de densidad en un gráfico

 par(mfrow = c(1, 1))
      
      
      
      plot(dx, lwd = 2, col = "red",
           
           main = "Multiples curvas", xlab = "")

Nuevos datos

  # set.seed(2)
      
      y <- rnorm(500) + 1
      
       # dy <- densitySí

Nueva curva

 # lines(dy, col = "blue", lwd = 2)
 #  plot(dx, lwd = 2, col = "red",
           
   #   main = "Multiples curvas con los límites de los ejes corregidos", xlab = "",
           
     #  xlim = c(min(dx$x, dy$x), c(max(dx$x, dy$x))),  
           
         # ylim = c(min(dx$y, dy$y), c(max(dx$y, dy$y))))  
      
               # lines(dy, col = "blue", lwd = 2)

Gráficos de comparación de densidades en R

 set.seed(1)
      
      grupos <- factor(sample(c(1, 2), 100, replace = TRUE))
      
      
      
      variable <- numeric(100)

Grupo 1: media 3

 variable[grupos == 1] <- rnorm(length(variable[grupos == 1]), 3)

Grupo 2: media 0

variable[grupos == 2] <- rnorm(length(variable[grupos == 2]))
 # library(sm)
      
   # sm.density.compare(variable, grupos)               
      
      #  legend("topleft", levels(grupos), col = 2:4, lty = 1:2)

Colorear el área bajo las curvas de densidad

par(mfrow = c(1, 2))

Sombrear el área bajo la curva

  # plot(dx, lwd = 2, main = "", xlab = "",
           
    #  col = "red", xlim = c(-4, 6), ylim = c(0, 0.5))
      
       # polygon(dx, col = "red")
      
       # polygon(dx$x, dx$y, col = "red") # Equivalente
      
      
      
       # set.seed(2)
      
       # y <- rnorm(500) + 2
      
       # dy <- densitySí
      
      
      
       # lines(dy, lwd = 2, col = "blue")
      
       # polygon(dy, col = "blue")

Sombrear el área bajo la curva con transparencia

 # plot(dx, lwd = 2, main = "", xlab = "",
           
           #  col = "red", xlim = c(-4, 6), ylim = c(0, 0.5))
      
       # polygon(dx, col = rgb(1, 0, 0, alpha = 0.5))
      
       # lines(dy, lwd = 2, col = "blue")
      
      # olygon(dy, col = rgb(0, 0, 1, alpha = 0.5))

Alternativa equivalente con el paquete EnvStats

 # library(EnvStats)
      
      
      
      #  epdfPlot(x, # Vector con datos
               
                # curve.fill = TRUE, # Colorear el área
               
                # curve.fill.col = rgb(1, 0, 0, alpha = 0.5), # Color del área
               
               #  epdf.col = "red") # Color de la curva
      
      
      
      #  epdfPlot(y, curve.fill = TRUE,
               
                # curve.fill.col = rgb(0, 0, 1, alpha = 0.5),
               
               #  epdf.col = "blue",
               
               #  add = TRUE) # Añadir la densidad sobre el plot anterior

También puedes sombrear solo un área específica debajo de la curva.

par(mfrow = c(1, 1))
      
      
      
      plot(dx, lwd = 2, main = "Densidad", col = "red")
      
      
      
      polygon(c(dx$x[dx$x >= 0], 0), c(dx$y[dx$x >= 0], 0),
              
              col = rgb(1, 0, 0, alpha = 0.5), border = "red", main = "")

Gráfico de densidad con ggplot2

 library(ggplot2)
      
      
      
      df <- data.frame(x = x)
      
      
      
      ggplot(df, aes(x = x)) +
        
        geom_density(color = "red", # Color de la curva
                     
                     fill = "red",  # Color del área sombreada
                     
                     alpha = 0.5)   # Transparencia del color

Si quieres agregar más curvas, puedes establecer los límites del eje X

 # df <- data.frame(x = x, y = y)
      
      #  df <- stack(df)
      # dx <- density(x)
      
      #  dy <- densitySí
      
      
      
      #  ggplot(df, aes(x = values, fill = ind)) +
        
       # geom_density(alpha = 0.5) + # Densidades con transparencia
        
        #  xlim(c(min(dx$x, dy$x), # Límites del eje X
               
                # c(max(dx$x, dy$x)))) +
        
         #scale_fill_discrete(name = "Título de la leyenda", # Cambiar el título de la leyenda
                            
                             #  labels = c("A", "B")) # + # Cambiar las etiquetas de la leyenda
      
      # theme(legend.position = "none") # Eliminar leyenda

Equivalente

 # ggplot(df, aes(x = values)) + geom_density(aes(group = ind, fill = ind), alpha = 0.5) +
        
        #  xlim(c(min(dx$x, dy$x), c(max(dx$x, dy$x)))) +
        
        #  scale_fill_discrete(name = "Título de la leyenda",
                            
                             # labels = c("A", "B"))

¿Cómo interpretar un diagrama de caja y bigotes en R?

 x <- c(8, 5, 14, -9, 19, 12, 3, 9, 7, 4,
             
             4, 6, 8, 12, -8, 2, 0, -1, 5, 3)
      
      boxplot(x, horizontal = TRUE)
      
      stripchart(x, method = "jitter", pch = 19, add = TRUE, col = "blue")

Intervalo de confianza para la mediana del boxplot

  boxplot(x, notch = TRUE)

Gráfico de cajas por grupo

boxplot(chickwts$weight ~ chickwts$feed)

      boxplot(weight ~ feed, data = chickwts) # Equivalente

Además, en este ejemplo, podrías agregar puntos a cada diagrama de caja de la siguiente manera:

  # stripchart(chickwts$weight ~ chickwts$feed, vertical = TRUE, method = "jitter",
                   
                   #  pch = 19, add = TRUE, col = 1:length(levels(chickwts$feed)))

Multiples boxplots

   head(trees)
##   Girth Height Volume
## 1   8.3     70   10.3
## 2   8.6     65   10.3
## 3   8.8     63   10.2
## 4  10.5     72   16.4
## 5  10.7     81   18.8
## 6  10.8     83   19.7

Observa la diferencia con respecto al conjunto de datos chickwts

 stacked_df <- stack(trees)
      
      head(stacked_df)
##   values   ind
## 1    8.3 Girth
## 2    8.6 Girth
## 3    8.8 Girth
## 4   10.5 Girth
## 5   10.7 Girth
## 6   10.8 Girth

Boxplot del conjunto de datos ‘trees’

boxplot(trees, col = rainbow(ncol(trees)))

Equivalente a:

boxplot(stacked_df$values ~ stacked_df$ind,
              
              col = rainbow(ncol(trees)))

Puedes apilar columnas de un data frame con la función stack.

 par(mfrow = c(1, ncol(trees)))
      
      invisible(lapply(1:ncol(trees), function(i) boxplot(trees[, i])))

Reordenar boxplot en R

 par(mfrow = c(1, 2))

De más bajo a más alto

medianas <- reorder(chickwts$feed, chickwts$weight, median)
medianas <- with(chickwts, reorder(feed, weight, median))
boxplot(chickwts$weight ~ medianas, las = 2, xlab = "", ylab = "")

De más alto a más bajo

medianas <- reorder(chickwts$feed, -chickwts$weight, median)
 boxplot(chickwts$weight ~ medianas, las = 2, xlab = "", ylab = "")

 par(mfrow = c(1, 1))

Personalizar un boxplot en R

 plot.new()

 set.seed(1)

Fondo gris claro

  # rect(par("usr")[1], par("usr")[3], par("usr")[2], par("usr")[4],col = "#ebebeb")

Añadimos un grid blanco

 # grid(nx = NULL, ny = NULL, col = "white", lty = 1,lwd = par("lwd"), equilogs = TRUE)

Boxplot

par(new = TRUE)
## Warning in par(new = TRUE): llamada par(new=TRUE) sin gráfico
      boxplot(rnorm(500), # Datos
              
              horizontal = FALSE, # Horizontal o vertical
              
              lwd = 2, # Lines width
              
              col = rgb(1, 0, 0, alpha = 0.4), # Color
              
              xlab = "Etiqueta eje X",  # Etiqueta eje X
              
              ylab = "Etiqueta eje Y",  # Etiqueta eje Y
              
              main = "Boxplot personalizado en R base", # Título
              
              notch = TRUE, # Añade intervalos de confianza para la mediana
              
              border = "black",  # Color del borde del boxplot
              
              outpch = 25,       # Símbolo para los outliers
              
              outbg = "green",   # Color de los datos atípicos
              
              whiskcol = "blue", # Color de los bigotes
              
              whisklty = 2,      # Tipo de línea para los bigotes
              
              lty = 1) # Tipo de línea (caja y mediana)

Agregamos una leyenda

 # legend("topright", legend = "Boxplot", # Posición y título
             
              # fill = rgb(1, 0, 0, alpha = 0.4),  # Color
             
              # inset = c(0.03, 0.05), # Cambiamos los márgenes
             
              # bg = "white") # Color de fondo de la leyenda

Añadir la media a un boxplot en R

par(mfrow = c(1, 2))

Boxplot Vertical

 boxplot(x)

Añadir línea con la media

   #  segments(x0 = 0.8, y0 = mean(x),x1 = 1.2, y1 = mean(x),col = "red", lwd = 2)

Añadir punto con la media

 # points(mean(x), col = 3, pch = 19)

Boxplot horizontal

 boxplot(x, horizontal = TRUE)

Añadir línea con la media

 # segments(x0 = mean(x), y0 = 0.8,x1 = mean(x), y1 = 1.2,col = "red", lwd = 2)

Añadir punto con la media

 # points(mean(x), 1, col = 3, pch = 19)
 #  par(mfrow = c(1, 1))
      
      # --------------------------------------------------
        #  par(mfrow = c(1, 2))
   # mi_df <- trees

Boxplot vertical por grupo

 # boxplot(mi_df, col = rgb(0, 1, 1, alpha = 0.25))

Añadir líneas con las medias

 # invisible(lapply(1:ncol(mi_df),
                       
                       #  function(i) segments(x0 = i - 0.4,
                                            
                                             # y0 = mean(mi_df[, i]),
                                            
                                            # x1 = i + 0.4,
                                            
                                             #  y1 = mean(mi_df[, i]),
                                            
                                            #  col = "red", lwd = 2)))

Añadir puntos con la medias

 #  medias <- apply(mi_df, 2, mean)
     # medias <- colMeans(mi_df) # Equivalente (más eficiente)
       # points(medias, col = "red", pch = 19)

Boxplot horizontal por grupo

 # boxplot(mi_df, col = rgb(0, 1, 1, alpha = 0.25),horizontal = TRUE)

Añadir líneas con la medias

 #  invisible(lapply(1:ncol(mi_df), function(i) segments(x0 = mean(mi_df[, i]),
                                            
                                             # y0 = i - 0.4,
                                            
                                             # x1 = mean(mi_df[, i]),
                                            
                                             # y1 = i + 0.4,
                                            
                                             # col = "red", lwd = 2)))

Añadir puntos con la medias

  # medias <- apply(mi_df, 2, mean)
      
      #  medias <- colMeans(mi_df) # Equivalente (más eficiente)
      
      
      
       # points(medias, 1:ncol(mi_df), col = "red", pch = 19)
      
      
      
       # par(mfrow = c(1, 1))

Boxplot e histograma en R

 par(mfrow = c(1, 1))

Datos multimodales

 n <- 20000
      
      ii <- rbinom(n, 1, 0.5)
      
      dat <- rnorm(n, mean = 110, sd = 11) * ii +
        
        rnorm(n, mean = 70, sd = 5) * (1 - ii)

Histograma

      hist(dat, probability = TRUE, ylab = "", col = "grey",
           
           axes = FALSE, main = "")

Eje

      # axis(1)

Densidad

 #  lines(density(dat), col = "red", lwd = 2)

Boxplot

  par(new = TRUE)
## Warning in par(new = TRUE): llamada par(new=TRUE) sin gráfico
      boxplot(dat, horizontal = TRUE, axes = FALSE,
              
              lwd = 2, col = rgb(0, 1, 1, alpha = 0.15))

Boxplot en ggplot2 a partir de un vector

 library(ggplot2)

Transformar x en un data frame

 x <- data.frame(x)

Boxplot a partir de un vector

 ggplot(data = x, aes(x = "", y = x)) +
        
        stat_boxplot(geom = "errorbar",      # Bigotes
                     
                     width = 0.2) +
        
        geom_boxplot(fill = "#4271AE",       # Color de la caja
                     
                     outlier.colour = "red", # Color de los valores atípicos
                     
                     alpha = 0.9) +          # Transparencia del color de la caja
        
        ggtitle("Boxplot a partir de un vector") + # Título del plot
        
        xlab("") +   # Etiqueta del eje x
        
        coord_flip() # Boxplot horizontal

Boxplot por grupo

ggplot(data = chickwts, aes(x = feed, y = weight)) +
        
        stat_boxplot(geom = "errorbar", # Bigotes
                     
                     width = 0.2) +
        
        geom_boxplot(fill = "#4271AE", colour = "#1F3552", # Colores
                     
                     alpha = 0.9, outlier.colour = "red") +
        
        scale_y_continuous(name = "Peso") +  # Etiqueta de la variable continua
        
        scale_x_discrete(name = "Alimentación") +        # Etiqueta de los grupos
        
        ggtitle("Boxplot por grupos en ggplot2") +       # Título del plot
        
        theme(axis.line = element_line(colour = "black", # Personalización del tema
                                       
                                       size = 0.25))
## Warning: The `size` argument of `element_line()` is deprecated as of ggplot2 3.4.0.
## ℹ Please use the `linewidth` argument instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.

Boxplot a partir de un data frame

ggplot(data = stack(trees), aes(x = ind, y = values)) +
        
        stat_boxplot(geom = "errorbar", # Bigotes
                     
                     width = 0.2) +
        
        geom_boxplot(fill = "#4271AE", colour = "#1F3552", # Colores
                     
                     alpha = 0.9, outlier.colour = "red") +
        
        scale_y_continuous(name = "Peso") +  # Etiqueta de la variable continua
        
        scale_x_discrete(name = "Alimentación") +        # Etiqueta de los grupos
        
        ggtitle("Boxplot a partir de un data frame") +   # Título del plot
        
        theme(axis.line = element_line(colour = "black", # Personalización del tema
                                       
                                       size = 0.25))