Capítulo 43 Mapa de burbujas con plotly

En el ejemplo que se presenta, el objetivo es visualizar en un mapa interactivo la distribución de individuos de la especie Merluccius merluccius, usando puntos codificados por color y tamaño según el tipo de registro y la cantidad de individuos35.

## [1] "LC_COLLATE=en_US.UTF-8;LC_CTYPE=en_US.UTF-8;LC_MONETARY=en_US.UTF-8;LC_NUMERIC=C;LC_TIME=en_US.UTF-8"
import plotly.graph_objects as go
import pandas as pd
merluccius = pd.read_csv("merluccius_tmp.csv", na_filter=False)

Se crea un relación de colores con las dos categorías existentes:

color_map = {
    'Especimen_conservado': 'blue',
    'Obs_humana': 'red'
}
merluccius['color_code'] = merluccius['basis_record'].map(color_map)

Se define el mensaje que debe presentarse cuando se traslade el cursor por encima de algún punto:

merluccius['localidad'] = merluccius['localidad'].fillna('Desconocida')
merluccius['basis_record'] = merluccius['basis_record'].fillna('No especificado')

merluccius['tooltip'] = ("Latitud: " + merluccius['lat'].astype(str) +
    ", Longitud: " + merluccius['lon'].astype(str) +
    "<br>Localidad: " + merluccius['localidad'] +
    "<br>Tipo de registro: " + merluccius['basis_record'] +
    "<br>Número de individuos: " + merluccius['conteo'].astype(str))

Se crea el gráfico con los puntos geográficos:

fig_mapa = go.Figure()
trace = go.Scattergeo(lon = merluccius['lon'],
    lat = merluccius['lat'],
    text = merluccius['tooltip'],
    mode = 'markers',
    marker = dict(size = merluccius['conteo'],
        color = merluccius['color_code'],  # color ya asignado
        opacity = 0.6,
        sizemode = 'area',
        sizeref = 2. * merluccius['conteo'].max() / (15**2),
        sizemin = 3,
        line = dict(width=0, color='white')),
    hoverinfo='text')
  • lon, lat: coordenadas de cada punto.

  • text: el tooltip creado antes.

  • size: el tamaño del punto depende del número de individuos.

  • color: según el tipo de registro.

  • opacity: transparencia de los puntos.

  • sizeref: ajusta el tamaño máximo para que todos los puntos sean proporcionales.

  • sizemin: asegura un tamaño mínimo para que se vean bien.

  • line: borde blanco para destacar los puntos, pero se dejó de ancho cero.

A continuación se configura el diseño (layout) del mapa:

fig_mapa.add_trace(trace)
fig_mapa.update_layout(
    title={'text': 'Distribución de Merluccius merluccius', 
           'y': 0.98, 
           'x': 0.5,
           'xanchor': 'center',
           'yanchor': 'top',
           'font': dict(size=14)},
    height=300,
    margin=dict(l=0, r=0, t=25, b=0),
    showlegend=False)
fig_mapa.update_geos(
    resolution=50, 
    projection_type='natural earth',
    showframe=False,
    showcoastlines=True,
    coastlinecolor="gray",
    showocean=True,
    oceancolor="skyblue", 
    showland=True,
    landcolor="khaki",
    showlakes=True,
    lakecolor="skyblue",
    showcountries=False)

Se define el estilo visual del mapa:

  • Tipo de proyección: “natural earth” (una vista del mundo real).

  • Colores para océanos, tierra, lagos, ríos.

  • Se puede ajustar el área visible del mapa con lataxis y lonaxis.

Se combina y se presenta el mapa:

fig_mapa = go.Figure(data=[trace], layout=layout)
fig_mapa.write_html('mapa_merluza.html')

  1. Idea tomada de https://zenodo.org/records/16929799, de Camila Neder y Daniel Ignacio Valdés Barrera en su trabajo con el Instituto BASE https://institutobase.cl/↩︎