Creación de grafico de dispersión (scatter plot) en Python

Python

Ejemplo de grafico de dispersión usando datos porosidad y permeabilidad de núcleos de un yacimiento petrolero

Rigoberto Chandomi https://www.linkedin.com/in/rigobertochandomi/
2024-02-23

En el mundo de la ciencia de datos, la visualización es una herramienta clave para entender las relaciones y tendencias en nuestros datos. Una de las formas más directas y efectivas de visualizar la relación entre dos variables es a través de un scatter plot o gráfico de dispersión. En esta ocasión te mostraré cómo generar un scatter plot utilizando la librería Matplotlib en Python, empleando un conjunto de datos de ejemplo que incluye mediciones como la porosidad y la permeabilidad de núcleos extraídos de pozos petroleros

Preparación del Entorno

Antes de comenzar, asegúrate de tener instalada la librería Matplotlib. Si no la tienes, puedes instalarla fácilmente utilizando pip, el sistema de gestión de paquetes de Python:

pip install matplotlib

También usaremos Pandas para manejar nuestro conjunto de datos, así que asegúrate de tenerlo disponible:

pip install pandas

Cargando los Datos

El primer paso es cargar nuestros datos. Para este ejemplo, utilizaremos un archivo CSV llamado Core_data.csv, que contiene mediciones de la profundidad medida (MD), porosidad (POROSITY) y permeabilidad (PERMEABILITY) para diferentes pozos. Aquí tienes un vistazo al contenido del archivo:

import pandas as pd

data = pd.read_csv('Core_data.csv')
print(data.head())
   WELL           MD  POROSITY  PERMEABILITY
0     1  4038.350098     0.201     1973.9240
1     1  4038.850098     0.203     1158.9270
2     1  4039.350098     0.207     1935.1169
3     1  4039.850098     0.206     1003.6810
4     1  4040.350098     0.190      901.4980

Este fragmento de código carga el archivo CSV en un DataFrame de Pandas y muestra las primeras filas, dándonos una idea de la estructura de los datos.

Creando el Scatter Plot

Ahora que tenemos los datos cargados, es tiempo de crear nuestro scatter plot. Vamos a trazar la porosidad contra la permeabilidad para ver si existe alguna relación visual entre estas dos variables:


import matplotlib.pyplot as plt

plt.scatter(data['POROSITY'], data['PERMEABILITY']);
plt.xlabel('Porosidad (%)');
plt.ylabel('Permeabilidad (mD)');
plt.title('Relación entre Porosidad y Permeabilidad en Datos de Núcleos');
plt.show();

Este código generará un gráfico de dispersión básico, con el título y nombre de los ejes personalidos. Observamos que debido al comportamiento logaritmo de la permeabilidad los datos se ven agrupados en valores bajos de esta propiedad. Para ello cambiaremos la escala del eje y por una escala logarítmica y limitaremos los ejes en un rango mínimo y máximo

plt.scatter(data['POROSITY'], data['PERMEABILITY']);
plt.xlabel('Porosidad (%)');
plt.ylabel('Permeabilidad (mD)');
plt.title('Relación entre Porosidad y Permeabilidad en Datos de Núcleos');
plt.yscale('log');
plt.ylim(0.0001,100000);
plt.xlim(0,0.3);
plt.show();


plt.scatter(data['POROSITY'], data['PERMEABILITY'], c='red', marker='x')
<matplotlib.collections.PathCollection object at 0x000000006339A160>
plt.xlabel('Porosidad (%)');
plt.ylabel('Permeabilidad (mD)');
plt.title('Relación entre Porosidad y Permeabilidad en Datos de Núcleos');
plt.yscale('log');
plt.ylim(0.0001,100000);
plt.xlim(0,0.3);
plt.show();


plt.scatter(data['POROSITY'], data['PERMEABILITY'], c=data['WELL'], marker='o')
<matplotlib.collections.PathCollection object at 0x000000006344CE80>
plt.xlabel('Porosidad (%)');
plt.ylabel('Permeabilidad (mD)');
plt.title('Relación entre Porosidad y Permeabilidad en Datos de Núcleos');
plt.yscale('log');
plt.ylim(0.0001,100000);
plt.xlim(0,0.3);
plt.show();

En la tabla encontraras los diferentes tipos de marcadores que podemos encontrar

\[ \begin{array}{ll} \hline \text { Valor de marcador } & \text { Descripción } \\ \hline \mathrm{s} & \text { Cuadrado } \\ \circ & \text { Circulo } \\ \mathrm{A} & \text { Triangulo hacia arriba } \\ \mathrm{v} & \text { Triangulo hacia abajo } \\ > & \text { Triangulo derecho } \\ < & \text { Triangulo izquierdo } \\ \mathrm{d} & \text { Diamente } \\ \mathrm{p} & \text { Pentagono } \\ \mathrm{h} & \text { Hexagono } \\ 8 & \text { Octagono } \\ + & \text { Más } \\ \mathrm{x} & \text { Cruz } \\ \hline \end{array} \]


plt.scatter(data['POROSITY'], data['PERMEABILITY'], c=data['WELL'], marker='o')
<matplotlib.collections.PathCollection object at 0x0000000063477710>
plt.xlabel('Porosidad (%)');
plt.ylabel('Permeabilidad (mD)');
plt.title('Relación entre Porosidad y Permeabilidad en Datos de Núcleos');
plt.yscale('log');
plt.ylim(0.0001,100000);
plt.xlim(0,0.3);
plt.grid(color="r", linestyle="dotted", linewidth=1);
plt.show();

Los códigos de color disponibles se enlistan en la siguiente tabla

\[ \begin{array}{|l|l|} \hline \text { código } & \text { color } \\ \hline \text { b } & \text { azul } \\ \hline \text { g } & \text { verde } \\ \hline \text { r } & \text { rojo } \\ \hline \text { c } & \text { cyan } \\ \hline \text { m } & \text { magenta } \\ \hline \text { y } & \text { amarillo } \\ \hline \text { k } & \text { negro } \\ \hline \text { w } & \text { blanco } \\ \hline \end{array} \]