UNIVERSIDAD CENTRAL DEL ECUADOR

FACULTAD DE CIENCIAS ECONOMICAS

CARRERA DE ESTADISTICA

PROGRAMACION

INTEGRANTES

COLABORADOR

GRAFICOS GGPLOT 2

REALIZAR LOS EJERCICIOS DE LA SIGUIENTE LECTURA:
La función barplot en R
Para crear un gráfico de barras en R, puedes usar la función de R base barplot. En este ejemplo, vamos a crear un diagrama de barras a partir de un data frame. Concretamente vamos a usar el conocido conjunto de datos mtcars.
En primer lugar, carga los datos y crea una tabla para la columna cyl con la función de table.
# Cargamos los datos

data(mtcars)
attach(mtcars)
# Tabla de frecuencias

mi_tabla <- table(cyl)

mi_tabla
## cyl
##  4  6  8 
## 11  7 14
# 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

Ten en cuenta que también puedes crear un diagrama de barras a partir de un factor con la función plot.
plot(factor(mtcars$cyl), col = rainbow(3))

Gráfico de barras con la función plot

Además, por una parte, podríamos agregar curvas sobre el gráfico de barras para representar otra variable, como sucede con la temperatura en el caso de los climogramas.
En este caso vamos a dibujar una línea sobre el gráfico que hemos hecho con nuestra tabla.
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

Asignar un gráfico de barras a una variable almacenará los valores del eje correspondientes al centro de cada barra.
Por otra parte, también podríamos mostrar los números correspondientes a la altura de las barras con la función text de la siguiente manera:
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)

Rejilla (grid) en un gráfico de barras en R

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

Al igual que otros gráficos, puedes especificar una amplia variedad de parámetros gráficos, como etiquetas de eje, un título o personalizar los ejes. En el bloque de código anterior personalizamos los colores del diagrama de barras con el parámetro col. Puedes establecer los colores que prefieras con un vector o usar la función rainbow con el número de barras como parámetro como lo hicimos nosotros o usar otras paletas de colores. También puedes cambiar el color del borde de las barras con el argumento border.
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

Gráfico de barras personalizado en R

Cambiar las etiquetas de cada grupo

La etiqueta de cada grupo se puede cambiar con el argumento names.arg. En nuestro ejemplo, los grupos están etiquetados con números, pero podemos 
cambiarlos escribiendo algo como lo siguiente:
barplot(mi_tabla, names.arg = c("cuatro", "seis", "ocho"))

Cambiar las etiquetas de los grupos de un un barplot en R

Espacio y ancho de las barras

También se puede modificar el espacio entre barras o el ancho de las barras con los argumentos width y space. Para el espacio entre grupos consulta la sección correspondiente de este tutorial.
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

El vector space representa el espacio de la barra respecto a la anterior, por lo que el primer elemento no se trendrá en cuenta.
Gráfico de barras a partir de una lista o un data frame
Además, puedes crear un diagrama de barras directamente con las variables de un data frame o incluso una matriz, pero ten en cuenta que la variable debe ser el recuento de algún evento o característica.
En el siguiente ejemplo, contamos el número de vehículos por color y los dibujamos con un gráfico de barras. Usaremos cada color de los coches para colorear las barras correspondientes.
df <- data.frame(ColorCoche = c("rojo", "verde", "blanco", "azul"),

                 num = c(3, 5, 9, 1))

# df <- as.list(df) # Equivalente

 

barplot(height = df$num, names = df$ColorCoche,

        col = c("red", "green", "white", "blue"))

Barchart a partir de una lista o data frame

Gráfico de barras de una variable continua

En caso de que estés trabajando con una variable continua, deberás usar la función cut para clasificar los datos. De lo contrario, en caso de ausencia de empates, tendrás tantas barras como la longitud del vector y las alturas de las barras serán iguales a 1.
En el siguiente ejemplo, dividiremos nuestros datos de 0 a 45 en pasos de 5 con el argumento breaks.
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 barras en R a partir de una variable continua

Gráfico de barras horizontal en R

Por defecto, los gráficos de barras en R se dibujan verticalmente. Sin embargo, es común representar gráficos de barras horizontales. Puedes rotar 90º el gráfico y crear un gráfico de barras horizontales estableciendo el argumento horiz como TRUE.
barplot(mi_tabla, main = "Gráfico de barras horizontal",

        ylab = "Número de cilindros", xlab = "Frecuencia",

        horiz = TRUE) # Gráfico de barras horizontal

Gráfico de barras horizontal en R con la función barplot

Leyenda del gráfico de barras

Se puede agregar una leyenda a un diagrama de barras en R con el argumento legend.text, donde puedes especificar los nombres que quieres agregar a la leyenda. Ten en cuenta que en RStudio la gráfica resultante puede ser ligeramente diferente, ya que por ejemplo el fondo de la leyenda será blanco en lugar de transparente.
barplot(mi_tabla, xlab = "Número de cilindros",

        col = rainbow(3),

        legend.text = rownames(mi_tabla)) # Leyenda

Añadir leyenda a un gráfico de barras en R con el argumento legend.text

Nótese que, al usar el argumento legend.text, la leyenda puede superponerse al diagrama de barras .
El método más fácil para resolver este problema en este ejemplo es mover la leyenda a la izquierda. Esto se puede lograr con el argumento args.legend, donde puedes establecer parámetros gráficos dentro de una lista. Puedes establecer la posición en top, bottom, topleft, topright, bottomleft y bottomright.
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

De manera equivalente, se puede lograr el diagrama anterior con la función legend de la siguiente manera, con los argumentos legend y fill.
barplot(mi_tabla, xlab = "Número de cilindros",

        col = rainbow(3))

legend("top", legend = rownames(mi_tabla), fill = rainbow(3))

Sin embargo, este enfoque solo funciona bien si la leyenda no se superpone a las barras en esas posiciones. Un mejor enfoque es mover la leyenda a la derecha, fuera del gráfico de barras. Puedes hacer esto configurando el argumento inset dentro de una lista pasada como parámetro al argumento args.legend de la siguiente manera
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

También podrías cambiar los límites de los ejes con los argumentos xlim e ylim para gráficos horizontales y verticales, respectivamente, pero ten en cuenta que en este caso el valor que pases dependerá del número y del ancho de las barras. Recuerda que si asignas un barplot a una variable puedes conocer los puntos del eje X que representan el centro de cada barra.
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 es ponerla debajo del gráfico de barras con las funciones layout, par y plot.new. Este enfoque es más avanzado que los otros y es posible que debas borrar los parámetros gráficos antes de la ejecución del código para obtener la gráfica correcta, ya que éstos se cambiarán.
# dev.off()

# opar <- par(no.readonly = TRUE)

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))

# dev.off()

# on.exit(par(opar))

Agreagar leyenda debajo de un gráfico de barras en R

Gráfico de barras agrupadas en R

Una gráfica de barras agrupadas es una gráfica de barras en R con dos o más variables. El gráfico mostrará las barras para cada una de las múltiples variables.
# Convertimos la variable 'am' en factor

am <- factor(am)

 

# Cambiamos los niveles del factor

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

 

# Tabla cilindros - tipo de transmisión

tabla_variables <- table(cyl, am)

# tabla_variables <- xtabs(~cyl + am , data = mtcars) # Equivalente

 

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

Nótese que si hubiéramos especificado table(am, cyl) en lugar de table(cyl, am), el eje X representaría el número de cilindros, por lo que habría tres grupos con dos barras cada uno.
Espacio entre grupos
Como revisamos anteriormente, se puede cambiar el espacio entre barras. En el caso de varios grupos, puedes establecer un vector de dos elementos donde el primer elemento es el espacio entre barras de cada grupo (0.4) y el segundo el espacio entre grupos (2.5).
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

CAMBIAR EL ESPACIO ENTRE GRUPOS DE UN BARPLOT

Valores numéricos en grupos

Los gráficos de barras también se pueden usar para resumir una variable en 
grupos dados por uno o varios factores.

Supón que quieres mostrar la cantidad de cilindros y el tipo de transmisión en 
función de la potencia media de los automóviles. Puedes utilizar la función 
tapply para crear la tabla correspondiente:
head(mtcars)
##                    mpg cyl disp  hp drat    wt  qsec vs am gear carb
## Mazda RX4         21.0   6  160 110 3.90 2.620 16.46  0  1    4    4
## Mazda RX4 Wag     21.0   6  160 110 3.90 2.875 17.02  0  1    4    4
## Datsun 710        22.8   4  108  93 3.85 2.320 18.61  1  1    4    1
## Hornet 4 Drive    21.4   6  258 110 3.08 3.215 19.44  1  0    3    1
## Hornet Sportabout 18.7   8  360 175 3.15 3.440 17.02  0  0    3    2
## Valiant           18.1   6  225 105 2.76 3.460 20.22  1  0    3    1
resumen_datos <- tapply(mtcars$hp, list(cilindros = mtcars$cyl,
                                          transmision = mtcars$am),
                        FUN = mean, na.rm = TRUE)

resumen_datos
##          transmision
## cilindros         0        1
##         4  84.66667  81.8750
##         6 115.25000 131.6667
##         8 194.16667 299.5000
Ahora puedes crear el diagrama de barras correspondiente en R
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)))

RESUMEN NUMERICO POR GRUPO

Gráfico de barras en R con barras de error

Por defecto, no puedes crear un diagrama de barras con barras de error. 
Sin embargo, la siguiente función te permitirá crear un diagrama de barras 
totalmente personalizable con barras de error estándar:
Argumentos:
  x: un único factor
  y: un vector numérico
   ...: argumentos adicionales para ser pasados a la función barplot
barplot.error <- function(x, y, ...) {
  mod <- lm(y ~ x)
  reps <- sqrt(length(y)/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)))
}

# Llamamos a la función
barplot.error(factor(mtcars$cyl), mtcars$hp, col = rainbow(3), ylim = c(0, 250))

AÑADIR BARRAS DE ERROR

Aunque puedes agregar barras de error a un diagrama de barras en R, 
cabe destacar que un diagrama de caja por grupo podría ser un mejor enfoque 
para resumir los datos en este escenario.

Gráfico de barras apiladas en R

Un gráfico de barras apiladas es como un diagrama de barras agrupado, 
pero la frecuencia de las variables está apilada. Este tipo de diagrama de 
barras se creará de forma predeterminada al pasar como argumento una tabla con 
dos o más variables, ya que el argumento beside por defecto es FALSE.
barplot(tabla_variables,
        
        main = "Gráfico de barras apilado",
        
        xlab = "Tipo de transmisión", ylab = "Frecuencia",
        
        col = c("darkgrey", "darkblue", "red"),
        
        legend.text = rownames(tabla_variables),
        
        beside = FALSE) # Barras apiladas (opción por defecto)

Barras apiladas en R

Relacionado con los gráficos de barras apiladas, 
existen implementaciones similares, como el diagrama de espinas o spineplot 
y el gráfico de mosaico o mosaicplot. Este tipo de gráficos se pueden crear 
con las funciones spineplot y mosaicplot del paquete graphics.

El diagrama de tipo mosaico permite visualizar datos de dos o más variables 
cuantitativas, donde el área de cada rectángulo representa la proporción de esa 
variable en cada grupo.
#install.packages("graphics")

library(graphics)

mosaicplot(tabla_variables, main = "Mosaico")

GRAFICO DE MOSAICOS EN R

El diagrama de espina es un caso especial de un diagrama de mosaico y es una 
generalización del diagrama de barras apilado. En este caso, a diferencia de 
los gráficos de barras apiladas, cada barra suma uno.
spineplot(tabla_variables)

GRAFICO DE ESPINA EN R

Ten cuenta que, por defecto, los ejes se intercambian con respecto al diagrama 
de barras apiladas que creamos en la sección anterior. Puedes crear el gráfico 
equivalente transponiendo la tabla de frecuencias con la función t.
spineplot(t(tabla_variables))

Gráfico de espinas vertical

Gráfico de barras en R con ggplot2

El paquete ggplot2 es una biblioteca gráfica de R muy conocida. 
Puedes crear un diagrama de barras con esta biblioteca convirtiendo 
los datos en data frame y usando las funciones ggplot y geom_bar. 
En el argumento aes debes pasar los nombres de las variables del data frame, 
en x la variable categórica y en y la numérica.
#install.packages("ggplot2")

library(ggplot2)
## 
## 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")

CREAR DAIGRAMA DE BARRAS EN R CON GGPLOT2

Gráfico de barras horizontal en ggplot2

En caso de que quieras rotar el diagrama de barras anterior, puedes usar la función coord_flip de la siguiente manera:
ggplot(data = df, aes(x = cyl, y = Freq)) +
  
  geom_bar(stat = "identity") +
  
  coord_flip() # Barras horizontales

HISTOGRAMA EN R

¿Cómo hacer un histograma en R? La función hist

Para explicar los pasos para crear un histograma en R, vamos a utilizar los siguientes datos, que representan las distancia (en yardas) que recorre una pelota de golf después de ser golpeada.
  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)
  
  #Puedes dibujar un histograma en R con la función hist. Por defecto, la función creará un histograma de frecuencias.
  
  hist(distancia, main = "Histograma de frecuencias", # Frecuencia
       
       ylab = "Frecuencia")

HISTOGRAMA DE FRECUENCIAS EN R

Sin embargo, si estableces el argumento prob como TRUE, obtendrás un histograma de densidad.
hist(distancia, prob = TRUE, main = "Histograma de densidad", # Densidad
       
       ylab = "Densidad")

HISTOGRAMA DE DENSIDAD EN R

Además, puedes añadir un grid al histograma con la función grid de la siguiente manera.
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")

AÑADIR GRID A UN HISTOGRAMA

Ten en cuenta que hay que dibujar dos veces el histograma para que el grid salga por debajo de las barras en lugar de por encima.
  
Desde R 4.0.0 los histogramas son grises por defecto, no blancos.

Cambiar el color del histograma

Ahora que ya sabes crear un histograma en R, también puedes personalizarlo. Si quieres cambiar el color de las barras puede establecer el parámetro col al color que prefieras. Al igual que sucede con cualquier otro gráfico en R, puedes personalizar muchas características del gráfico, como el título, los ejes, el tamaño de fuente, la escala de los ejes, …
 hist(distancia, main = "Cambiar color", ylab = "Frecuencia", col = "lightblue")

CAMBIAR EL COLOR EN LA FUNCION HIST

El argumento breaks
Los histogramas son muy útiles para representar la distribución subyacente de los datos si el número de barras o clases se selecciona correctamente. Sin embargo, la selección del número de barras (o el ancho de las barras) puede ser complicada:
    
1.Pocas clases agruparán demasiado las observaciones.
  
2.Con demasiadas clases habrá pocas observaciones en cada una de ellas aumentando la variabilidad del gráfico obtenido.
  
Hay varias reglas para determinar el número de barras. En R, el método de Sturges se usa por defecto. Si quieres cambiar el número de barras, pasa al argumento breaks el número de clases que quieras.
 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))

NUMERO DE CLASES CON EL ARGUMENTO BREAKS

También puedes usar el método plug-in (Wand, 1995) implementando en la librería KernSmooth para seleccionar el ancho de las barras del histograma:
   # Método plug-in
    
  #install.packages("KernSmooth")
    
  library(KernSmooth)
## 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

Establecer el argumento add como TRUE permite añadir un histograma sobre otro gráfico. 
Como ejemplo, puedes crear un histograma en R por grupo con el código del siguiente bloque:
    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 EN R CON DOS VARIABLES

La función rgb permite establecer colores en canal RGB. El argumento alpha determina la transparencia. 
De hecho, cuando se combinan gráficos es una buena idea añadir colores con 
transparencia para no ocultar las representaciones entre si.

HISTOGRAMA CON CURVA NORMAL

Para dibujar una curva normal sobre un histograma, 
puede usar las funciones dnorm y lines de la siguiente manera:
    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)

HISTOGRAMA CON CURVA NORMAL EN R

Para agregar una curva de densidad sobre un histograma, puedes usar la función lines para trazar la curva y la función density para calcular una estimación no paramétrica (tipo núcleo) de la distribución.
  hist(distancia, freq = FALSE, main = "Curva densidad", ylab = "Densidad")
  
  lines(density(distancia), lwd = 2, col = 'red')

CURVA DE LA DENSIDAD EN UN HISTOGRAMA EN R

La selecci?n de ventana para ajustar las densidades no param?tricas es un ?rea de intensa investigaci?n. Adem?s, ten en cuenta que por efecto, la funci?n density usa un n?cleo gaussiano. Para obtener 
m?s informaci?n, ejecuta ?density.
Vamos a unir los c?digos anteriores dentro de una funci?n para crear autom?ticamente un histograma con curvas normales y de densidad.
histDenNorm <- function (x, ...) {
  
  hist(x, ...) # Histograma
  
  lines(density(x), col = "blue", lwd = 2) # Densidad
  
  x2 <- seq(min(x), max(x), length = 40)
  
  f <- dnorm(x2, mean(x), sd(x))
  
  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)

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

y <- rexp(n = 3000, rate = 1)

histDenNorm(x, prob = TRUE, main = "Histograma de X")

histDenNorm(y, prob = TRUE, main = "Histograma de Y")

par(mfcol = c(1, 1))

HISTOGRAMA CON CURVA NORMAL Y DE DENSIDAD NO PARAMETRICA EN R

Histograma y boxplot en R se puede agregar un diagrama de caja sobre un histograma escribiendo par(new = TRUE) entre los c?digos de los dos gr?ficos.
hist.default(x, probability = TRUE, ylab = "5", main = "2",
     
     col = rgb(1, 0, 0, alpha = 0.5), axes = FALSE)

axis(1) # A?ade el eje horizontal

par(new = TRUE)

boxplot(x, horizontal = TRUE, axes = FALSE,
        
        lwd = 2, col = rgb(0, 0, 0, alpha = 0.2))

# HISTOGRAMA CON BOXPLOT EN R ~~~ Tambi?n puedes agregar la curva normal o de densidad a la gr?fica anterior.Histograma en R con ggplot2 Para crear un histograma con el paquete ggplot2, debes usar las funciones ggplot + geom_histogram y pasar los datos como data frame. En el argumento aes debes especificar el nombre de la variable del data frame. ~~~

library(ggplot2)

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

HISTOGRAMA EN GGPLOT2

Este gr?fico devolver? un mensaje advirti?ndote de 
que el histograma se calcul? utilizando 30 clases. 
Esto se debe a que, de manera predeterminada, ggplot no utiliza el m?todo de Sturges.
Ahora vamos a calcular el n?mero de barras con el m?todo Sturges como lo hace la funci?n hist y establecerlo con elargumento breaks. Ten en cuenta que tambi?n puedes establecer el argumento binwidth si lo prefieres.
nbreaks <- pretty(range(x), n = nclass.Sturges(x),
                  
                  min.n = 1)

ggplot(data.frame(x), aes(x = x)) +
  
  geom_histogram(breaks = nbreaks, color = "gray", fill = "white")

HISTOGRAMA EN GGPLOT2 CON EL METODO STURGES

En ggplot2 tambi?n puedes agregar la curva de densidad con la funci?n geom_density. Adem?s, si quieres rellenar el ?rea debajo de la curva, puedes indicar en el argumento fill el color
que prefieras y en el argumento alpha el grado de transparencia del color. Ten en cuenta que necesitas establecer un nuevo aes dentro del geom_histogram de la siguiente manera:
ggplot(data.frame(x), aes(x =x)) +
  
geom_histogram(aes(y = ..density..), breaks = nbreaks,
                 
                 color = "gray", fill = "white") +
  
geom_density(fill = "black", alpha = 0.2)

HISTOGRAMA CON DENSIDAD EN GGPLOT2

Histograma en Plotly Una alternativa para crear histogramas es usar el paquete plotly (una adaptaci?n de la librer?a de JavaScript para R), 
que crea gr?ficos en formato interactivo. Para nuestro ejemplo prodr?amos ejecutar lo siguiente:
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
# Histograma de frecuencias

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

fig
# Histograma de densidad

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

fig
#Datos de ejemplo

set.seed(1234)

# 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")
rug(jitter(x))

HISTOGRAMA Y DENSIDAD EN R

El resultado es la densidad de probabilidad empírica suavizada. Una alternativa para crear una función de densidad en R es la función epdfPlot del paquete EnvStats. Con esta función puedes pasar el vector númerico directamente como parámetro
library(EnvStats)
## 
## Attaching package: 'EnvStats'
## The following objects are masked from 'package:stats':
## 
##     predict, predict.lm
## The following object is masked from 'package:base':
## 
##     print.default
epdfPlot(x, epdf.col = "red")

EJEMPLO DE USO DE LA FUNCION epdfPlot DEL PAQUETE EnvStats

Cuando dibujas una función de densidad de probabilidad en R, dibujas una estimación de densidad tipo núcleo. El gráfico de densidad tipo núcleo es un enfoque no paramétrico que necesita seleccionar una ventana (bandwidth). Puedes establecer la ventana con el argumento bw de la función density.
En general, una ventana grande suavizará la curva de densidad, y una pequeña provocará un sobreajuste de la estimación de densidad tipo núcleo En el siguiente bloque de código encontrarás un ejemplo que describe este problema.
par(mfrow = c(1, 2))

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

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

COMPARACION DE SELECCION DE VENTANA PARA LA ESTIMACION DE FUNCIONES DE DENSIDAD

De manera equivalente, puedes pasar argumentos de la función density a epdfPlot dentro de una lista como parámetro del argumento density.arg.list. En este caso, estamos pasando el argumento bw de la función de densidad.
epdfPlot(x, epdf.col = "red", density.arg.list = list(bw = 0.05),
         
         main = "Ventana demasiado peque?a")

 par(mfrow = c(1, 3))
 
 plot(density(x), main = "Regla del pulgar",
     
     cex.lab = 1.5, cex.main = 1.75, lwd = 2)
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)

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)

METODOS DE ESTIMACION DE LA VENTANA EN RAFICOS DE DENSIDAD

La selección del parámetro ventana dependerá de los datos con los que trabajes o de los objetivos de tu estudio. Elije el método de selección con precaución.
También puedes cambiar la función núcleo con el argumento kernel, que por defecto será gaussiano. Aunque no entraremos en más detalles, los núcleos disponibles son "gaussiano", "epanechnikov", "rectangular", "triangular", "biweight", "cosine" y "optcosine". La selección dependerá de los datos con los que estés trabajando.
par(mfrow = c(1, 1))

plot(dx, lwd = 2, col = "red",
     
     main = "Multiples curvas", xlab = "")

set.seed(2)

y <- rnorm(500) + 1

dy <- density(x)

lines(dy, col = "blue", lwd = 2)

MULTIPLES CURVAS DE DENSISDAD EN R

Sin embargo, puede que te hayas dado cuenta de que la curva azul está cortada en el lado derecho. Para arreglar esto puedes establecer los argumentos xlim e ylim entre el mínimo y el máximo para cada eje de todas las densidades que vayas a dibujar.
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))),  # M?nimo y m?ximo limites eje X
     
     ylim = c(min(dx$y, dy$y), c(max(dx$y, dy$y)))) 

MULTIPLES CURVAS DE DENSIDAD EVITANDO SOLAPAMIENTO

Al trazar varias líneas es una buena práctica establecer los límites de los ejes con los argumentos xlim y ylim de la función plot , porque los límites se establecerán de forma predeterminada en los límites de la primera curva que dibujes .
Hay varias formas de comparar densidades. Un enfoque es utilizar la función densityPlot del paquete car. Esta función crea estimaciones de densidad no paramétricas condicionadas por un factor si se especifica. Escribe ?densityPlot para obtener información adicional sobre la función y el método.
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]))

#install.packages("car")

library(car)
## Loading required package: carData
## 
## Attaching package: 'car'
## The following object is masked from 'package:EnvStats':
## 
##     qqPlot
densityPlot(variable, grupos)

COMPARACION DE DENSIDADES EN R CON LA FUNCION densityplot

Otra alternativa es utilizar la función sm.density.compare del paquete sm, que compara las densidades en un contraste de permutaciones.
library(sm)
## Package 'sm', version 2.2-5.7: type help(sm) for summary information
sm.density.compare(variable, grupos)               

legend("topleft", levels(grupos), col = 2:4, lty = 1:2)

FUNCION SMCOMPARE EN R PARA COMPARAR RAFICOS DE DENSIDAD

Ten en cuenta que los gráficos de densidad son diferentes debido a que los métodos para calcular las densidades son diferentes. Consulta la bibliografía de cada método, disponible en la documentación de cada función, para obtener detalles adicionales.
Con R base puedes usar la función polygon para sombrear el área bajo las curvas de densidad. Si usas la función rgb en el argumento col en lugar de un color básico, puedes establecer la transparencia del área del diagrama de densidad con el argumento alpha, que va desde 0, que es transparencia total hasta 1, que dibuja el color opaco.
par(mfrow = c(1, 2))

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 <- density(y)

lines(dy, lwd = 2, col = "blue")

polygon(dy, col = "blue")

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")

polygon(dy, col = rgb(0, 0, 1, alpha = 0.5))

CAMBIAR LA TRANSPARENCIA DEL AREA DE LA DENSIDAD CON LA FUNCION RB

Si estás utilizando el paquete EnvStats, puedes configurar los colores con el argumento curve.fill.col de la función epdfPlot.
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)

COLOREAR CIERTA AREA BAJO UNA CURVA EN R

Puedes crear una gráficas de densidad con el paquete de R ggplot2 con las funciones ggplot y geom_density de la siguiente manera:
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)

GRAFICO DE DENSIDAD EN R CON LA LIBRERIA GGPLOT2

Si quieres agregar más curvas, puedes establecer los límites del eje X con la función xlim y agregar una leyenda con scale_fill_discrete de la siguiente manera:
df <- data.frame(x = x, y = y)

df <- stack(df)

dx <- density(x)

dy <- density(y)

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"))

Múltiples diagramas de densidad en ggplot2

La caja de un boxplot comienza en el primer cuartil (25%) y termina en el 
tercero (75%).
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")

Gráfico de cajas por grupo

~~ Si tu conjunto de datos tiene una variable categórica que contiene grupos, #puedes crear un diagrama de caja especificando una fórmula. ~~~

head(chickwts)
##   weight      feed
## 1    179 horsebean
## 2    160 horsebean
## 3    136 horsebean
## 4    227 horsebean
## 5    217 horsebean
## 6    168 horsebean
boxplot(chickwts$weight ~ chickwts$feed)

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

Multiples boxplots

~~ Puedes crear directamente un diagrama de caja desde un data frame. Para ilustrarlo vamos a utilizar el conjunto de datos trees ~~~

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
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)))

par(mfrow = c(1, ncol(trees)))

invisible(lapply(1:ncol(trees), function(i) boxplot(trees[, i])))

Reordenar boxplot en R

~~ Por defecto, los diagramas de caja se dibujarán con el orden de los factores en los datos. ~~~

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)) # Equivalente

boxplot(chickwts$weight ~ medianas, las = 2, xlab = "", ylab = "")

# De más alto a más bajo

medianas <- reorder(chickwts$feed, -chickwts$weight, median)

# medianas <- with(chickwts, reorder(feed, -weight, median)) # Equivalente

boxplot(chickwts$weight ~ medianas, las = 2, xlab = "", ylab = "")

par(mfrow = c(1, 1))

Personalizar un boxplot en R

~~ Ten en cuenta que hay incluso más argumentos que los del siguiente ejemplo parapersonalizar el diagrama de caja, como boxlty, boxlwd, medlty o staplelwd. ~~~

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)

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

Por defecto, cuando creas un diagrama de caja, se muestra la mediana. Sin 
embargo, es posible que también quieras mostrar la media u otra característica de los datos.
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)

# abline(h = mean(x), col = 2, lwd = 2) # Línea completa

# Añadir punto con la media

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

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)))

Devolver valores de un boxplot

Si asignas el diagrama de caja a una variable, puedes devolver una lista con 
diferentes componentes.
res <- boxplot(trees)

res
## $stats
##       [,1] [,2] [,3]
## [1,]  8.30   63 10.2
## [2,] 11.05   72 19.4
## [3,] 12.90   76 24.2
## [4,] 15.25   80 37.3
## [5,] 20.60   87 58.3
## 
## $n
## [1] 31 31 31
## 
## $conf
##          [,1]     [,2]    [,3]
## [1,] 11.70814 73.72979 19.1204
## [2,] 14.09186 78.27021 29.2796
## 
## $out
## [1] 77
## 
## $group
## [1] 3
## 
## $names
## [1] "Girth"  "Height" "Volume"
bxp(res)

Boxplot e histograma en R

Una limitación de los gráficos de caja y bigotes es que no están diseñados paradetectar multimodalidad.
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)

#boxplot(dat, horizontal = TRUE, axes = FALSE,lwd = 2, col = rgb(0, 1, 1, alpha = 0.15)

Boxplot en ggplot2 a partir de un vector

~~ El tipo de dato de entrada para usar la función ggplot tiene que ser un data frame, por lo que tendrás que convertir tu vector en clase data.frame. ~~

# install.packages("ggplot2")
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 en ggplot2 por grupo

~~ Si quieres crear un diagrama de caja con ggplot2 por grupo, deberás especificar las variables en el argumento aes de la siguiente manera ~~

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))

Boxplot en ggplot2 desde un data frame

~~ Finalmente, para crear un boxplot con ggplot2 directamente desde un conjunto de datos como el de trees deberás apilar primero los datos con la función stack. ~~

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))