Histograma con R y ggplot2

R Ingenería de yacimientos Petrofísica

Histograma usando datos de núcleos: porosidad y permeabilidad

Rigoberto Chandomi https://www.linkedin.com/in/rigobertochandomi/
2023-11-20

Un histograma se utiliza para representar distribuciones cuantitativas de datos mediante un diagrama de barras sin espacios entre las columnas. En este gráfico, cada intervalo de la distribución de frecuencias se basa en el rango de valores que contiene.

En este ejemplo se utilizan datos de núcleos de pozos, porosidad y permeabilidad del yacimiento Volve. Los histogramas pueden crearse utilizando la función hist() de R y otros paquetes como ggplot2.

Primero, los datos se cargan desde un archivo CSV

library(ggplot2)
library(plotly)

core_data <- read.csv("RT_md.csv")

Usando la función hist(), podemos generar un histograma básico y configurar algunas opciones como el color, el título, la etiqueta, el tipo de eje, el número de intervalos, etc. Podemos añadir un título y etiqueta de eje x de la siguiente manera.

hist(core_data$POROSITY, col = "blue",
     xlab = "Porosity", main = "Histograma", breaks = 30)

Para mostrar densidades de probabilidad en lugar de frecuencias podemos cambiar los argumentos “freq” a FALSE, además, podemos añadir una línea vertical para indicar cualquier otro dato como la media de porosidad utilizando la función abline(). En este ejemplo el gráfico tiene más opciones visuales como el tipo de fuente y el color del borde de la barra.

hist(core_data$POROSITY, col = "blue", freq = FALSE,
     xlab = "Porosity", ylab = "Probability densities", 
     main = "Histogram", breaks = 30, font.lab = 8, font.main = 8,
     border = "orange")

abline(v = mean(core_data$POROSITY, na.rm = TRUE), 
       col = "red", lwd = 3)

Otra opción es usar el paquete ggplo2. Según las capas de ggplot2, primero tenemos que definir Data como argumento en la función ggplot, y después, en la misma función, la estética, usando la función aes(), las escalas en las que mapeamos nuestros datos, podemos definir eje x, eje y, color, relleno, tamaño, forma, alfa, tipo de línea y ancho de línea.

Después se define la capa de geometría según los elementos visuales utilizados para nuestros datos, en este caso se utiliza la función geom_histogram(), la línea vertical se define con la función geom_vline(). Por último, la capa de coordenadas se puede configurar, como las etiquetas de los ejes. ggplot2 tiene otras capas como Facets, estadísticas y temas, para configurar gráficos más complejos.

library(ggplot2)

ggplot(data = core_data, aes(x = POROSITY)) +
    geom_histogram(fill = "blue", bins = 30) +
    geom_vline(aes(xintercept= mean(POROSITY, na.rm = TRUE)),
               color="black", linetype="dashed", size=2) +
    xlab("Porosity") +
    ylab("Frequency") 

Usando ggplot2 podemos mapear los datos usando otras variables en el dataframe, en este ejemplo la variable RT (Rock Type) es el tipo de roca en cada observación, calculado usando la ecuación winland R35. En el caso del histograma, esta variable tiene que ser categórica o factor.

ggplot(data = core_data, aes(x = POROSITY, fill = RT)) +
    geom_histogram(bins = 30) +
    geom_vline(aes(xintercept= mean(POROSITY, na.rm = TRUE)),
               color="black", linetype="dashed", size=2) +
    xlab("Porosity") +
    ylab("Frequency") 

Otro atributo en el histograma es la posición, podemos establecer las barras en 3 formas: “stack”, “dodge” y “fill”, la primera es la predeterminada. la segunda separa las columnas una al lado de la otra y la última, rellena el eje y para mostrar la proporción del total en cada intervalo.

“dodge”

ggplot(data = core_data, aes(x = POROSITY, fill = RT)) +
    geom_histogram(bins = 30, position = "dodge") +
    geom_vline(aes(xintercept= mean(POROSITY, na.rm = TRUE)),
               color="black", linetype="dashed", size=2) +
    xlab("Porosity") +
    ylab("Frequency") 

“fill”

ggplot(data = core_data, aes(x = POROSITY, fill = RT)) +
    geom_histogram(bins = 30, position = "fill") +
    geom_vline(aes(xintercept= mean(POROSITY, na.rm = TRUE)),
               color="black", linetype="dashed", size=2) +
    xlab("Porosity") +
    ylab("Frequency") 

También podemos utilizar la capa Facets para generar múltiples gráficos pequeños utilizando una variable.

ggplot(data = core_data, aes(x = POROSITY, fill = RT)) +
    geom_histogram(bins = 30) +
    geom_vline(aes(xintercept= mean(POROSITY, na.rm = TRUE)),
               color="black", linetype="dashed", size=2) +
    facet_grid(.~ WELL) +
    xlab("Porosity") +
    ylab("Frequency")