Mapa de Permeabilidad con Python

Interpolación por el método de distancia inversa y visualización con Matplotlib y Plotly

Yacimientos
Python
Visualización

Generación de un mapa de permeabilidad en Python mediante interpolación por distancia inversa, con visualizaciones estática e interactiva.

Author
Published

August 2, 2026

Para comprender y predecir el comportamiento de un yacimiento es necesario describir, con el mayor detalle posible, la distribución espacial de sus propiedades. La permeabilidad, la porosidad, el espesor y la presión se conocen normalmente en ubicaciones puntuales, como los pozos, pero para construir mapas necesitamos estimar sus valores entre esos puntos.

En este ejemplo generaremos un mapa de permeabilidad en Python mediante el método de distancia inversa. Primero reproduciremos el procedimiento utilizado en el video y después construiremos una versión interactiva con Plotly.

Video

Datos del ejemplo

El archivo Datos_Perm.csv contiene el nombre de cada pozo, sus coordenadas \(X\) y \(Y\), la producción acumulada y la permeabilidad \(K\).

Ver código
import pandas as pd
import numpy as np

data = pd.read_csv("Datos_Perm.csv")
data
Table 1
       Pozo          X           Y        Np         K
0    Pozo-1  692042.39  2267047.55  31.96746  480.8160
1    Pozo-2  691497.04  2267630.40  49.06818  442.2600
2    Pozo-3  692219.04  2266683.42   1.73502   70.3080
3    Pozo-4  693481.66  2266411.86   1.07730   34.0200
4    Pozo-5  691666.24  2266181.57  18.96048  283.5000
5    Pozo-6  691032.73  2268343.57  30.06234   74.8440
6    Pozo-7  692838.12  2266843.61  24.97068   10.6596
7    Pozo-8  694362.28  2265777.41  17.59968  128.1420
8    Pozo-9  693319.03  2266151.60  71.66880  597.6180
9   Pozo-10  693424.39  2265924.55   0.45360   55.5660
10  Pozo-11  694367.37  2266175.22  11.16990   56.7000
11  Pozo-12  691149.94  2267707.20  14.31108   10.3194
12  Pozo-13  692737.28  2266546.17  10.87506   28.3500

Para construir el mapa utilizaremos las columnas:

  • X: coordenada en dirección este-oeste.
  • Y: coordenada en dirección norte-sur.
  • K: permeabilidad medida en cada pozo, en mD.

Método de distancia inversa

El método supone que los puntos cercanos al lugar que queremos estimar tienen mayor influencia que los puntos alejados. El peso asignado a cada dato se calcula como:

\[ w_i = \frac{1/d_i^p}{\displaystyle\sum_{j=1}^{n} 1/d_j^p} \]

El valor interpolado es:

\[ K(x,y) = \sum_{i=1}^{n} w_i K_i \]

En este ejemplo usamos \(p=1\), igual que en el procedimiento mostrado en el video. Un valor mayor de \(p\) aumenta la influencia de los pozos más cercanos.

Creación de la cuadrícula

Primero generamos vectores de coordenadas dentro del área cubierta por los pozos. Se agrega un margen de 500 ft alrededor de los datos y se utiliza un espaciamiento de 100 ft.

Ver código
CORDX = np.arange(
    data["X"].min() - 500,
    data["X"].max() + 500,
    100
)

CORDY = np.arange(
    data["Y"].min() - 500,
    data["Y"].max() + 500,
    100
)

MATZ = np.zeros((len(CORDY), len(CORDX)))

print(f"Número de nodos en X: {len(CORDX)}")
Número de nodos en X: 44
Ver código
print(f"Número de nodos en Y: {len(CORDY)}")
Número de nodos en Y: 36
Ver código
print(f"Dimensiones de la matriz: {MATZ.shape}")
Dimensiones de la matriz: (36, 44)

Interpolación de la permeabilidad

Para cada nodo de la cuadrícula calculamos la distancia a todos los pozos. Después normalizamos los pesos y obtenemos la permeabilidad interpolada.

Cuando un nodo coincide exactamente con un pozo, se asigna directamente la permeabilidad medida para evitar una división entre cero.

Ver código
x_pozos = data["X"].to_numpy()
y_pozos = data["Y"].to_numpy()
k_pozos = data["K"].to_numpy()

for i, y_grid in enumerate(CORDY):
    for j, x_grid in enumerate(CORDX):

        distancia = np.sqrt(
            (x_grid - x_pozos) ** 2 +
            (y_grid - y_pozos) ** 2
        )

        coincide = distancia == 0

        if coincide.any():
            MATZ[i, j] = k_pozos[coincide][0]
        else:
            pesos = 1 / distancia
            pesos = pesos / pesos.sum()
            MATZ[i, j] = np.sum(k_pozos * pesos)

Mapa estático con Matplotlib

La matriz MATZ contiene la permeabilidad estimada en cada nodo. Con contourf() podemos representarla como un mapa de contornos y superponer las ubicaciones de los pozos.

Ver código
import matplotlib.pyplot as plt

fig, ax = plt.subplots(figsize=(10, 8))

mapa = ax.contourf(
    CORDX,
    CORDY,
    MATZ,
    levels=np.arange(0, 621, 20),
    cmap="viridis"
)

contornos = ax.contour(
    CORDX,
    CORDY,
    MATZ,
    levels=np.arange(0, 621, 40),
    colors="black",
    linewidths=0.5,
    alpha=0.55
)

ax.clabel(contornos, inline=True, fontsize=8, fmt="%.0f")

ax.scatter(
    data["X"],
    data["Y"],
    marker="^",
    s=55,
    edgecolor="white",
    linewidth=0.8,
    label="Pozos"
)

for _, pozo in data.iterrows():
    ax.annotate(
        pozo["Pozo"],
        (pozo["X"], pozo["Y"]),
        xytext=(4, 5),
        textcoords="offset points",
        fontsize=8
    )
Text(4, 5, 'Pozo-1')
Text(4, 5, 'Pozo-2')
Text(4, 5, 'Pozo-3')
Text(4, 5, 'Pozo-4')
Text(4, 5, 'Pozo-5')
Text(4, 5, 'Pozo-6')
Text(4, 5, 'Pozo-7')
Text(4, 5, 'Pozo-8')
Text(4, 5, 'Pozo-9')
Text(4, 5, 'Pozo-10')
Text(4, 5, 'Pozo-11')
Text(4, 5, 'Pozo-12')
Text(4, 5, 'Pozo-13')
Ver código
barra = fig.colorbar(mapa, ax=ax)
barra.set_label("Permeabilidad, K (mD)")

ax.set_title("Mapa de Permeabilidad — Distancia Inversa", fontweight="bold")
Text(0.5, 1.0, 'Mapa de Permeabilidad — Distancia Inversa')
Ver código
ax.set_xlabel("Coordenada X")
Text(0.5, 0, 'Coordenada X')
Ver código
ax.set_ylabel("Coordenada Y")
Text(0, 0.5, 'Coordenada Y')
Ver código
ax.set_aspect("equal", adjustable="box")
ax.legend()
<matplotlib.legend.Legend object at 0x000001AA4703D6A0>
Ver código
plt.tight_layout()
plt.show()
Figure 1: Mapa de permeabilidad interpolado mediante distancia inversa. Los triángulos representan la ubicación de los pozos.
Ver código
fig.show()
<string>:2: UserWarning: FigureCanvasAgg is non-interactive, and thus cannot be shown

El mapa permite identificar las regiones de mayor y menor permeabilidad. Como ocurre con otros métodos determinísticos, la forma de los contornos depende de la ubicación de los pozos, del espaciamiento de la cuadrícula y del exponente utilizado en los pesos.

Mapa interactivo con Plotly

Plotly permite explorar el mapa de forma interactiva. Al desplazar el cursor podemos consultar las coordenadas y la permeabilidad estimada; también es posible ampliar zonas específicas del área.

Ver código
import plotly.graph_objects as go
import plotly.io as pio
pio.renderers.default = "iframe"

fig = go.Figure()

fig.add_trace(
    go.Contour(
        x=CORDX,
        y=CORDY,
        z=MATZ,
        colorscale="Viridis",
        contours=dict(
            start=0,
            end=620,
            size=20,
            showlabels=True,
            labelfont=dict(size=10)
        ),
        colorbar=dict(title="K (mD)"),
        hovertemplate=(
            "X: %{x:,.0f}<br>"
            "Y: %{y:,.0f}<br>"
            "K: %{z:.1f} mD"
            "<extra></extra>"
        ),
        line_smoothing=0.8,
        name="Permeabilidad"
    )
)
Figure({
    'data': [{'colorbar': {'title': {'text': 'K (mD)'}},
              'colorscale': [[0.0, '#440154'], [0.1111111111111111, '#482878'],
                             [0.2222222222222222, '#3e4989'], [0.3333333333333333,
                             '#31688e'], [0.4444444444444444, '#26828e'],
                             [0.5555555555555556, '#1f9e89'], [0.6666666666666666,
                             '#35b779'], [0.7777777777777778, '#6ece58'],
                             [0.8888888888888888, '#b5de2b'], [1.0, '#fde725']],
              'contours': {'end': 620, 'labelfont': {'size': 10}, 'showlabels': True, 'size': 20, 'start': 0},
              'hovertemplate': 'X: %{x:,.0f}<br>Y: %{y:,.0f}<br>K: %{z:.1f} mD<extra></extra>',
              'line': {'smoothing': 0.8},
              'name': 'Permeabilidad',
              'type': 'contour',
              'x': {'bdata': ('XI/CdckSJUFcj8J1kRMlQVyPwnVZFC' ... 'XRMiVBXI/CdZkzJUFcj8J1YTQlQQ=='),
                    'dtype': 'f8'},
              'y': {'bdata': ('SOF6tF5IQUFI4Xq0kEhBQUjherTCSE' ... 'F6tNBOQUFI4Xq0Ak9BQUjherQ0T0FB'),
                    'dtype': 'f8'},
              'z': {'bdata': ('yke2DqaPZ0By1dijcZ1nQKYrFO3vqm' ... 'euPhQ/ZUDudiwqKThlQHin6vb7MWVA'),
                    'dtype': 'f8',
                    'shape': '36, 44'}}],
    'layout': {'template': '...'}
})
Ver código
fig.add_trace(
    go.Scatter(
        x=data["X"],
        y=data["Y"],
        mode="markers+text",
        text=data["Pozo"],
        textposition="top center",
        marker=dict(
            size=9,
            color="black",
            symbol="triangle-up",
            line=dict(color="white", width=1)
        ),
        customdata=np.column_stack((data["Pozo"], data["K"])),
        hovertemplate=(
            "%{customdata[0]}<br>"
            "X: %{x:,.0f}<br>"
            "Y: %{y:,.0f}<br>"
            "K medida: %{customdata[1]:.1f} mD"
            "<extra></extra>"
        ),
        name="Pozos"
    )
)
Figure({
    'data': [{'colorbar': {'title': {'text': 'K (mD)'}},
              'colorscale': [[0.0, '#440154'], [0.1111111111111111, '#482878'],
                             [0.2222222222222222, '#3e4989'], [0.3333333333333333,
                             '#31688e'], [0.4444444444444444, '#26828e'],
                             [0.5555555555555556, '#1f9e89'], [0.6666666666666666,
                             '#35b779'], [0.7777777777777778, '#6ece58'],
                             [0.8888888888888888, '#b5de2b'], [1.0, '#fde725']],
              'contours': {'end': 620, 'labelfont': {'size': 10}, 'showlabels': True, 'size': 20, 'start': 0},
              'hovertemplate': 'X: %{x:,.0f}<br>Y: %{y:,.0f}<br>K: %{z:.1f} mD<extra></extra>',
              'line': {'smoothing': 0.8},
              'name': 'Permeabilidad',
              'type': 'contour',
              'x': {'bdata': ('XI/CdckSJUFcj8J1kRMlQVyPwnVZFC' ... 'XRMiVBXI/CdZkzJUFcj8J1YTQlQQ=='),
                    'dtype': 'f8'},
              'y': {'bdata': ('SOF6tF5IQUFI4Xq0kEhBQUjherTCSE' ... 'F6tNBOQUFI4Xq0Ak9BQUjherQ0T0FB'),
                    'dtype': 'f8'},
              'z': {'bdata': ('yke2DqaPZ0By1dijcZ1nQKYrFO3vqm' ... 'euPhQ/ZUDudiwqKThlQHin6vb7MWVA'),
                    'dtype': 'f8',
                    'shape': '36, 44'}},
             {'customdata': array([['Pozo-1', 480.816],
                                   ['Pozo-2', 442.26],
                                   ['Pozo-3', 70.308],
                                   ['Pozo-4', 34.02],
                                   ['Pozo-5', 283.5],
                                   ['Pozo-6', 74.844],
                                   ['Pozo-7', 10.6596],
                                   ['Pozo-8', 128.142],
                                   ['Pozo-9', 597.618],
                                   ['Pozo-10', 55.566],
                                   ['Pozo-11', 56.7],
                                   ['Pozo-12', 10.3194],
                                   ['Pozo-13', 28.35]], dtype=object),
              'hovertemplate': ('%{customdata[0]}<br>X: %{x:,.0' ... 'data[1]:.1f} mD<extra></extra>'),
              'marker': {'color': 'black', 'line': {'color': 'white', 'width': 1}, 'size': 9, 'symbol': 'triangle-up'},
              'mode': 'markers+text',
              'name': 'Pozos',
              'text': array(['Pozo-1', 'Pozo-2', 'Pozo-3', 'Pozo-4', 'Pozo-5', 'Pozo-6', 'Pozo-7',
                             'Pozo-8', 'Pozo-9', 'Pozo-10', 'Pozo-11', 'Pozo-12', 'Pozo-13'],
                            dtype=object),
              'textposition': 'top center',
              'type': 'scatter',
              'x': {'bdata': ('exSux5QeJUFI4XoUUholQUjhehT2Hy' ... 'C9vjAlQRSuR+GbFyVB9ihcjwIkJUE='),
                    'dtype': 'f8'},
              'y': {'bdata': ('ZmZmxtNLQUEzMzMz90xBQVyPwrUdS0' ... 'icH0pBQZqZmZkdTUFBXI/CFdlKQUE='),
                    'dtype': 'f8'}}],
    'layout': {'template': '...'}
})
Ver código
fig.update_layout(
    title="Mapa Interactivo de Permeabilidad — Distancia Inversa",
    xaxis_title="Coordenada X",
    yaxis_title="Coordenada Y",
    width=950,
    height=720,
    margin=dict(l=60, r=30, t=70, b=60),
    legend=dict(orientation="h", y=1.04, x=0)
)
Figure({
    'data': [{'colorbar': {'title': {'text': 'K (mD)'}},
              'colorscale': [[0.0, '#440154'], [0.1111111111111111, '#482878'],
                             [0.2222222222222222, '#3e4989'], [0.3333333333333333,
                             '#31688e'], [0.4444444444444444, '#26828e'],
                             [0.5555555555555556, '#1f9e89'], [0.6666666666666666,
                             '#35b779'], [0.7777777777777778, '#6ece58'],
                             [0.8888888888888888, '#b5de2b'], [1.0, '#fde725']],
              'contours': {'end': 620, 'labelfont': {'size': 10}, 'showlabels': True, 'size': 20, 'start': 0},
              'hovertemplate': 'X: %{x:,.0f}<br>Y: %{y:,.0f}<br>K: %{z:.1f} mD<extra></extra>',
              'line': {'smoothing': 0.8},
              'name': 'Permeabilidad',
              'type': 'contour',
              'x': {'bdata': ('XI/CdckSJUFcj8J1kRMlQVyPwnVZFC' ... 'XRMiVBXI/CdZkzJUFcj8J1YTQlQQ=='),
                    'dtype': 'f8'},
              'y': {'bdata': ('SOF6tF5IQUFI4Xq0kEhBQUjherTCSE' ... 'F6tNBOQUFI4Xq0Ak9BQUjherQ0T0FB'),
                    'dtype': 'f8'},
              'z': {'bdata': ('yke2DqaPZ0By1dijcZ1nQKYrFO3vqm' ... 'euPhQ/ZUDudiwqKThlQHin6vb7MWVA'),
                    'dtype': 'f8',
                    'shape': '36, 44'}},
             {'customdata': array([['Pozo-1', 480.816],
                                   ['Pozo-2', 442.26],
                                   ['Pozo-3', 70.308],
                                   ['Pozo-4', 34.02],
                                   ['Pozo-5', 283.5],
                                   ['Pozo-6', 74.844],
                                   ['Pozo-7', 10.6596],
                                   ['Pozo-8', 128.142],
                                   ['Pozo-9', 597.618],
                                   ['Pozo-10', 55.566],
                                   ['Pozo-11', 56.7],
                                   ['Pozo-12', 10.3194],
                                   ['Pozo-13', 28.35]], dtype=object),
              'hovertemplate': ('%{customdata[0]}<br>X: %{x:,.0' ... 'data[1]:.1f} mD<extra></extra>'),
              'marker': {'color': 'black', 'line': {'color': 'white', 'width': 1}, 'size': 9, 'symbol': 'triangle-up'},
              'mode': 'markers+text',
              'name': 'Pozos',
              'text': array(['Pozo-1', 'Pozo-2', 'Pozo-3', 'Pozo-4', 'Pozo-5', 'Pozo-6', 'Pozo-7',
                             'Pozo-8', 'Pozo-9', 'Pozo-10', 'Pozo-11', 'Pozo-12', 'Pozo-13'],
                            dtype=object),
              'textposition': 'top center',
              'type': 'scatter',
              'x': {'bdata': ('exSux5QeJUFI4XoUUholQUjhehT2Hy' ... 'C9vjAlQRSuR+GbFyVB9ihcjwIkJUE='),
                    'dtype': 'f8'},
              'y': {'bdata': ('ZmZmxtNLQUEzMzMz90xBQVyPwrUdS0' ... 'icH0pBQZqZmZkdTUFBXI/CFdlKQUE='),
                    'dtype': 'f8'}}],
    'layout': {'height': 720,
               'legend': {'orientation': 'h', 'x': 0, 'y': 1.04},
               'margin': {'b': 60, 'l': 60, 'r': 30, 't': 70},
               'template': '...',
               'title': {'text': 'Mapa Interactivo de Permeabilidad — Distancia Inversa'},
               'width': 950,
               'xaxis': {'title': {'text': 'Coordenada X'}},
               'yaxis': {'title': {'text': 'Coordenada Y'}}}
})
Ver código
fig.update_yaxes(
    scaleanchor="x",
    scaleratio=1
)
Figure({
    'data': [{'colorbar': {'title': {'text': 'K (mD)'}},
              'colorscale': [[0.0, '#440154'], [0.1111111111111111, '#482878'],
                             [0.2222222222222222, '#3e4989'], [0.3333333333333333,
                             '#31688e'], [0.4444444444444444, '#26828e'],
                             [0.5555555555555556, '#1f9e89'], [0.6666666666666666,
                             '#35b779'], [0.7777777777777778, '#6ece58'],
                             [0.8888888888888888, '#b5de2b'], [1.0, '#fde725']],
              'contours': {'end': 620, 'labelfont': {'size': 10}, 'showlabels': True, 'size': 20, 'start': 0},
              'hovertemplate': 'X: %{x:,.0f}<br>Y: %{y:,.0f}<br>K: %{z:.1f} mD<extra></extra>',
              'line': {'smoothing': 0.8},
              'name': 'Permeabilidad',
              'type': 'contour',
              'x': {'bdata': ('XI/CdckSJUFcj8J1kRMlQVyPwnVZFC' ... 'XRMiVBXI/CdZkzJUFcj8J1YTQlQQ=='),
                    'dtype': 'f8'},
              'y': {'bdata': ('SOF6tF5IQUFI4Xq0kEhBQUjherTCSE' ... 'F6tNBOQUFI4Xq0Ak9BQUjherQ0T0FB'),
                    'dtype': 'f8'},
              'z': {'bdata': ('yke2DqaPZ0By1dijcZ1nQKYrFO3vqm' ... 'euPhQ/ZUDudiwqKThlQHin6vb7MWVA'),
                    'dtype': 'f8',
                    'shape': '36, 44'}},
             {'customdata': array([['Pozo-1', 480.816],
                                   ['Pozo-2', 442.26],
                                   ['Pozo-3', 70.308],
                                   ['Pozo-4', 34.02],
                                   ['Pozo-5', 283.5],
                                   ['Pozo-6', 74.844],
                                   ['Pozo-7', 10.6596],
                                   ['Pozo-8', 128.142],
                                   ['Pozo-9', 597.618],
                                   ['Pozo-10', 55.566],
                                   ['Pozo-11', 56.7],
                                   ['Pozo-12', 10.3194],
                                   ['Pozo-13', 28.35]], dtype=object),
              'hovertemplate': ('%{customdata[0]}<br>X: %{x:,.0' ... 'data[1]:.1f} mD<extra></extra>'),
              'marker': {'color': 'black', 'line': {'color': 'white', 'width': 1}, 'size': 9, 'symbol': 'triangle-up'},
              'mode': 'markers+text',
              'name': 'Pozos',
              'text': array(['Pozo-1', 'Pozo-2', 'Pozo-3', 'Pozo-4', 'Pozo-5', 'Pozo-6', 'Pozo-7',
                             'Pozo-8', 'Pozo-9', 'Pozo-10', 'Pozo-11', 'Pozo-12', 'Pozo-13'],
                            dtype=object),
              'textposition': 'top center',
              'type': 'scatter',
              'x': {'bdata': ('exSux5QeJUFI4XoUUholQUjhehT2Hy' ... 'C9vjAlQRSuR+GbFyVB9ihcjwIkJUE='),
                    'dtype': 'f8'},
              'y': {'bdata': ('ZmZmxtNLQUEzMzMz90xBQVyPwrUdS0' ... 'icH0pBQZqZmZkdTUFBXI/CFdlKQUE='),
                    'dtype': 'f8'}}],
    'layout': {'height': 720,
               'legend': {'orientation': 'h', 'x': 0, 'y': 1.04},
               'margin': {'b': 60, 'l': 60, 'r': 30, 't': 70},
               'template': '...',
               'title': {'text': 'Mapa Interactivo de Permeabilidad — Distancia Inversa'},
               'width': 950,
               'xaxis': {'title': {'text': 'Coordenada X'}},
               'yaxis': {'scaleanchor': 'x', 'scaleratio': 1, 'title': {'text': 'Coordenada Y'}}}
})
Ver código
fig
Figure({
    'data': [{'colorbar': {'title': {'text': 'K (mD)'}},
              'colorscale': [[0.0, '#440154'], [0.1111111111111111, '#482878'],
                             [0.2222222222222222, '#3e4989'], [0.3333333333333333,
                             '#31688e'], [0.4444444444444444, '#26828e'],
                             [0.5555555555555556, '#1f9e89'], [0.6666666666666666,
                             '#35b779'], [0.7777777777777778, '#6ece58'],
                             [0.8888888888888888, '#b5de2b'], [1.0, '#fde725']],
              'contours': {'end': 620, 'labelfont': {'size': 10}, 'showlabels': True, 'size': 20, 'start': 0},
              'hovertemplate': 'X: %{x:,.0f}<br>Y: %{y:,.0f}<br>K: %{z:.1f} mD<extra></extra>',
              'line': {'smoothing': 0.8},
              'name': 'Permeabilidad',
              'type': 'contour',
              'x': {'bdata': ('XI/CdckSJUFcj8J1kRMlQVyPwnVZFC' ... 'XRMiVBXI/CdZkzJUFcj8J1YTQlQQ=='),
                    'dtype': 'f8'},
              'y': {'bdata': ('SOF6tF5IQUFI4Xq0kEhBQUjherTCSE' ... 'F6tNBOQUFI4Xq0Ak9BQUjherQ0T0FB'),
                    'dtype': 'f8'},
              'z': {'bdata': ('yke2DqaPZ0By1dijcZ1nQKYrFO3vqm' ... 'euPhQ/ZUDudiwqKThlQHin6vb7MWVA'),
                    'dtype': 'f8',
                    'shape': '36, 44'}},
             {'customdata': array([['Pozo-1', 480.816],
                                   ['Pozo-2', 442.26],
                                   ['Pozo-3', 70.308],
                                   ['Pozo-4', 34.02],
                                   ['Pozo-5', 283.5],
                                   ['Pozo-6', 74.844],
                                   ['Pozo-7', 10.6596],
                                   ['Pozo-8', 128.142],
                                   ['Pozo-9', 597.618],
                                   ['Pozo-10', 55.566],
                                   ['Pozo-11', 56.7],
                                   ['Pozo-12', 10.3194],
                                   ['Pozo-13', 28.35]], dtype=object),
              'hovertemplate': ('%{customdata[0]}<br>X: %{x:,.0' ... 'data[1]:.1f} mD<extra></extra>'),
              'marker': {'color': 'black', 'line': {'color': 'white', 'width': 1}, 'size': 9, 'symbol': 'triangle-up'},
              'mode': 'markers+text',
              'name': 'Pozos',
              'text': array(['Pozo-1', 'Pozo-2', 'Pozo-3', 'Pozo-4', 'Pozo-5', 'Pozo-6', 'Pozo-7',
                             'Pozo-8', 'Pozo-9', 'Pozo-10', 'Pozo-11', 'Pozo-12', 'Pozo-13'],
                            dtype=object),
              'textposition': 'top center',
              'type': 'scatter',
              'x': {'bdata': ('exSux5QeJUFI4XoUUholQUjhehT2Hy' ... 'C9vjAlQRSuR+GbFyVB9ihcjwIkJUE='),
                    'dtype': 'f8'},
              'y': {'bdata': ('ZmZmxtNLQUEzMzMz90xBQVyPwrUdS0' ... 'icH0pBQZqZmZkdTUFBXI/CFdlKQUE='),
                    'dtype': 'f8'}}],
    'layout': {'height': 720,
               'legend': {'orientation': 'h', 'x': 0, 'y': 1.04},
               'margin': {'b': 60, 'l': 60, 'r': 30, 't': 70},
               'template': '...',
               'title': {'text': 'Mapa Interactivo de Permeabilidad — Distancia Inversa'},
               'width': 950,
               'xaxis': {'title': {'text': 'Coordenada X'}},
               'yaxis': {'scaleanchor': 'x', 'scaleratio': 1, 'title': {'text': 'Coordenada Y'}}}
})

Comentarios finales

En este ejemplo construimos un mapa de permeabilidad a partir de datos puntuales de pozos mediante un procedimiento directo:

  1. Leímos las coordenadas y la permeabilidad desde un archivo CSV.
  2. Creamos una cuadrícula para representar el área del yacimiento.
  3. Estimamos la permeabilidad de cada nodo mediante distancia inversa.
  4. Generamos un mapa estático con Matplotlib.
  5. Creamos una versión interactiva con Plotly.

El método es sencillo y útil para visualizar rápidamente una propiedad. Sin embargo, el resultado no debe interpretarse como una caracterización geoestadística completa: no incorpora un variograma ni cuantifica la incertidumbre espacial. Su principal utilidad en este ejemplo es mostrar con claridad cómo pasar de datos puntuales a una superficie interpolada utilizando Python.

🛒
Propiedades De Los Fluidos Del Yacimiento

Disponible en Mercado Libre

Ver oferta →