• Saltar a la navegación principal
  • Saltar al contenido principal
Geoinnova

Consultoría y Formación en SIG, Territorio y Medio Ambiente

  • Geoinnova
    • Quiénes somos
    • Coworking
    • Alianzas Estratégicas
    • Visor de proyectos Geoinnova
  • SIG y Desarrollo
    • Plugins QGIS
    • GeoNode
    • QElectricGIS
    • Planero Web
  • Consultoría Territorial
    • Planes de Emergencia Municipales de Protección Civil
    • Planes Urbanos de Actuación Municipal – PUAM
    • Evaluación Ambiental Estratégica de planes y programas
    • Minimización de Impacto Territorial y Declaración de Situación Individualizada en suelo no urbanizable
    • Turismo sostenible
  • Consultoría Ambiental
    • Trámites de Economía Circular
    • Prevención y gestión ambiental
    • Responsabilidad social corporativa
    • Estrategia de sostenibilidad
  • Formación
    • Todos los cursos
    • Formación para empresas
    • Máster y Diplomas
    • Cursos de QGIS Online Certificados
    • Cursos de programación, desarrollo SIG y geoservicios
    • Cursos de Teledetección
    • Cursos de Giswater
    • Cursos de SIG con ArcGIS
    • Cursos de Medio Ambiente
    • Campus
  • Divulgación
    • Blog
    • Tertulia Territorio Geoinnova
    • TFMs y otro trabajos de alumnos
    • Noticias
    • Webinars
    • Geolibrería
  • Contacto
    • Soporte – Tickets
Especialista Universitario 2 MATRICÚLATE AHORA
Programación y Desarrollo SIG SIG Tecnología

Cómo Integrar Gráficos Interactivos de Plotly con OpenLayers

29/10/2024 Deja un comentario

Esta guía te permitirá integrar y visualizar de manera efectiva varios gráficos interactivos de Plotly con OpenLayers . Aprenderás a configurar gráficos de diferentes tipos, como barras, líneas, dispersión y tartas, personalizando colores, títulos y otros parámetros.

Tipos de gráficos de Plotly

Con este enfoque, podrás integrar visualizaciones dinámicas y atractivas directamente en tus mapas, haciendo que la interacción con los datos sea más intuitiva y visualmente impactante.

¿Qué es OpenLayers y Plotly?

Como ya sabemos, OpenLayers es una biblioteca de JavaScript que permite mostrar mapas interactivos en la web. Es altamente personalizable y soporta múltiples fuentes de datos geoespaciales.

Openlayers

Por otro lado, Plotly es una biblioteca para la creación de gráficos interactivos que se puede utilizar para representar datos de manera visual en aplicaciones web.

Ploty
Contenidos ocultar
Incluir Librerías y Estilos de OpenLayers y Plotly
Configuración del Mapa con OpenLayers
Añadiendo Datos GeoJSON
Implementación del Gráfico con Plotly
Personalizar la apariencia del gráfico
Control de Visibilidad del Gráfico

Creando el Mapa Interactivo

En el siguiente ejemplo, crearemos un mapa interactivo utilizando OpenLayers con puntos representando varias ciudades de España. Visualizaremos varios gráficos interactivos de Plotly donde se mostrarán datos de ventas, población y turismo. Además, incluiremos un selector para cambiar entre diferentes tipos de gráficos (barra, línea, dispersión y tarta).

A continuación, se desglosarán los aspectos clave del código y se explicará cómo personalizar tanto el mapa como los gráficos.

Incluir Librerías y Estilos de OpenLayers y Plotly

Para integrar OpenLayers y Plotly, necesitamos agregar sus archivos CSS y JavaScript en el <head> de nuestro documento HTML (incluimos directamente los archivos desde sus respectivas CDNs para integrarlos sin necesidad de instalar nada localmente)

<!-- Estilos de OpenLayers -->
<link rel="stylesheet" href="https://openlayers.org/en/v6.5.0/css/ol.css" />
<!-- Scripts de OpenLayers -->
<script src="https://openlayers.org/en/v6.5.0/build/ol.js"></script>
<!-- Script de Plotly -->
<script src="https://cdn.plot.ly/plotly-latest.min.js"></script>

Configuración del Mapa con OpenLayers

Seguidamente, configuraremos el mapa con OpenLayers utilizando una capa base como la de CartoDB Dark Matter.

const map = new ol.Map({
    target: 'map', // Elemento HTML donde se renderiza el mapa
    layers: [
       new ol.layer.Tile({
           source: new ol.source.XYZ({
             url: 'https://basemaps.cartocdn.com/dark_all/{z}/{x}/{y}.png'  // Mapa de fondo negro
    })
})
    ],
    view: new ol.View({
        center: ol.proj.fromLonLat([-3.7038, 40.4168]), // Coordenadas centradas en Madrid
        zoom: 6 // Nivel de zoom inicial
    })
});

El mapa se centra inicialmente en Madrid, con coordenadas en el formato estándar EPSG:4326 (latitud/longitud) y luego transformado a EPSG:3857 para que OpenLayers pueda manejarlo.

Añadiendo Datos GeoJSON

El siguiente paso es cargar los datos geográficos usando el formato GeoJSON. En este caso, representamos varias ciudades de España con coordenadas y propiedades adicionales (ventas, población, turismo):

const geojsonData = {
    "type": "FeatureCollection",
    "features": [
        {
            "type": "Feature",
            "properties": {
                "name": "Madrid",
                "ventas": 600,
                "poblacion": 3223334,
                "turismo": 10000000
            },
            "geometry": {
                "type": "Point",
                "coordinates": [-3.7038, 40.4168]
            }
        },
        // Otros datos de ciudades...
    ]
};
const geojsonFormat = new ol.format.GeoJSON();
const features = geojsonFormat.readFeatures(geojsonData, {
    featureProjection: 'EPSG:3857' // Proyectar coordenadas para el mapa
});

Para añadir estos puntos al mapa, utilizamos ol.source.Vector y ol.layer.Vector.

const vectorSource = new ol.source.Vector({
    features: new ol.format.GeoJSON().readFeatures(geojsonData, {
        featureProjection: 'EPSG:3857'
    })
});
const vectorLayer = new ol.layer.Vector({
    source: vectorSource
});
map.addLayer(vectorLayer);  // Añadir la capa vectorial al mapa

Implementación del Gráfico con Plotly

Usaremos Plotly para crear los gráficos basados en los datos del GeoJSON. Dependiendo del tipo de gráfico seleccionado, Plotly renderizará el gráfico adecuado (barra, línea, dispersión o tarta):

function showGraph() {
  // Obtener datos de todas las ciudades
  const cities = [];
  const ventas = [];
  const poblacion = [];
  const turismo = [];
  geojsonData.features.forEach((feature) => {
    cities.push(feature.properties.name);
    ventas.push(feature.properties.ventas);
    poblacion.push(feature.properties.poblacion);
    turismo.push(feature.properties.turismo);
  });
  // Determinar el tipo de gráfico
  const chartType = document.getElementById("chart-type").value;
  let data; // Se usa let ya que el valor se puede cambiar dependiendo del tipo de gráfico
  if (chartType === "bar") {
    data = [
      { x: cities, y: ventas, name: "Ventas", type: "bar", marker: { color: "blue" }},
      { x: cities, y: poblacion, name: "Población", type: "bar", marker: { color: "green" }},
      { x: cities, y: turismo, name: "Turismo", type: "bar", marker: { color: "orange" }}
    ];
  } else if (chartType === "line") {
    data = [
      { x: cities, y: ventas, name: "Ventas", type: "scatter", mode: "lines+markers", marker: { color: "blue" }},
      { x: cities, y: poblacion, name: "Población", type: "scatter", mode: "lines+markers", marker: { color: "green" }},
      { x: cities, y: turismo, name: "Turismo", type: "scatter", mode: "lines+markers", marker: { color: "orange" }}
    ];
  } else if (chartType === "scatter") {
    data = [
      { x: cities, y: ventas, name: "Ventas", type: "scatter", mode: "markers", marker: { color: "blue", size: 10 }},
      { x: cities, y: poblacion, name: "Población", type: "scatter", mode: "markers", marker: { color: "green", size: 10 }},
      { x: cities, y: turismo, name: "Turismo", type: "scatter", mode: "markers", marker: { color: "orange", size: 10 }}
    ];
  } else if (chartType === "pie") {
    data = [
      { labels: cities, values: ventas, type: "pie", textinfo: "label+percent", name: "Ventas" }
    ];
  }
} 

Esta función extrae los datos de cada ciudad y se guardan en un array para crear el gráfico.
Para cada tipo de gráfico (bar, line, scatter, pie), se deben configurar los ejes, los valores y el tipo de gráfico, y opcionalmente, se pueden personalizar colores, marcadores y líneas.

Gráfico de Barras (bar)

Cuando chartType es "bar", se configura un gráfico de barras. Para este tipo de gráfico, se necesitan los siguientes parámetros:

  • x: Define las etiquetas para el eje X, en este caso, el nombre de las ciudades (almacenado en cities).
  • y: Define los valores para el eje Y, como las ventas, la población y el turismo de las ciudades.
  • type: Se especifica como "bar", lo que indica que será un gráfico de barras.
  • marker: Permite configurar el color de las barras. En este caso, las ventas son azules, la población es verde, y el turismo es naranja.

Gráfico de Líneas (scatter con lines+markers)

Cuando chartType es "line", se crea un gráfico de líneas con marcadores. Los parámetros necesarios son:

  • x: Nombres de las ciudades, que aparecen en el eje X.
  • y: Los valores (ventas, población o turismo) que se representan en el eje Y.
  • type: Aunque es un gráfico de líneas, el tipo sigue siendo "scatter", ya que Plotly usa esta configuración para gráficos de dispersión y líneas.
  • mode: Para este tipo de gráfico, se usa "lines+markers", lo que significa que se dibujarán líneas conectando los puntos y se mostrarán marcadores en cada punto de datos.
  • marker: Se usa para definir el color de las líneas y los puntos en el gráfico.

Gráfico de Dispersión (scatter)

Cuando chartType es "scatter", se configura un gráfico de dispersión. Los parámetros necesarios son:

  • x: Las etiquetas en el eje X (nombres de ciudades).
  • y: Los valores en el eje Y (ventas, población o turismo).
  • type: Sigue siendo "scatter", ya que es un gráfico de dispersión.
  • mode: Aquí se usa "markers", lo que significa que solo se mostrarán puntos en el gráfico sin conectar las líneas.
  • marker: Se define el color de los puntos y su tamaño. En este caso, los puntos son azules, verdes y naranjas, con un tamaño de 10.

Gráfico de Tarta (pie)

Cuando chartType es "pie", se crea un gráfico circular, que requiere una configuración diferente:

  • labels: Las etiquetas, que son los nombres de las ciudades.
  • values: Los valores para cada sector de la tarta, en este caso, las ventas.
  • type: Se especifica "pie", que indica que se generará un gráfico circular.
  • textinfo: Controla la información que se muestra en cada sector del gráfico. En este caso, se muestran tanto el nombre de la ciudad como el porcentaje correspondiente.

Personalizar la apariencia del gráfico

Este bloque de código se encarga de personalizar la apariencia del gráfico, como el título, la forma en que se agrupan las barras y los colores de fondo.

// Configurar layout
  const layout = {
    title: "Comparativa de Datos por Ciudad",
    barmode: "group", // Agrupar las barras
    plot_bgcolor: "rgba(0,0,0,0)", // Fondo transparente para el gráfico
    paper_bgcolor: "rgba(255,255,255,1)", // Fondo blanco para el área del gráfico
  };

Configura el diseño visual o el «layout» del gráfico que se va a generar. Aquí se definen aspectos estéticos y de presentación:

  • title: Define el título que aparecerá en la parte superior del gráfico, en este caso, «Comparativa de Datos por Ciudad».
  • barmode: Específicamente para gráficos de barras, esta propiedad establece que las barras se agruparán (group), es decir, no se superponen y están alineadas una al lado de la otra.
  • plot_bgcolor: Establece un fondo transparente (rgba(0,0,0,0)) para el área del gráfico donde se dibujan las barras, líneas, puntos, etc.
  • paper_bgcolor: Define el color de fondo de todo el gráfico, incluyendo los márgenes, siendo blanco (rgba(255,255,255,1)).

Renderizado del gráfico

La línea Plotly.newPlot("graph", data, layout); genera y renderiza un gráfico en el elemento HTML con el ID «graph».

  Plotly.newPlot("graph", data, layout);
  document.getElementById("graph").style.display = "block"; // Mostrar el gráfico
}

El parámetro data contiene los datos y configuraciones del gráfico (como tipo, colores, etc.).

Por último, la línea, document.getElementById("graph").style.display = "block";, se asegura de que el gráfico sea visible en la página, cambiando su estilo a «block» en caso de estar oculto.

Control de Visibilidad del Gráfico

El gráfico puede mostrarse u ocultarse mediante un botón. Aquí se controla su visibilidad.

document.getElementById('toggle-graph').addEventListener('click', function () {
    const graphDiv = document.getElementById('graph');
    if (graphDiv.style.display === 'none') {
        showGraph(); // Mostrar gráfico
        graphDiv.style.display = 'block';
        this.innerText = 'Ocultar Gráfico'; // Cambiar el texto del botón
    } else {
        graphDiv.style.display = 'none'; // Ocultar gráfico
        this.innerText = 'Mostrar Gráfico';
    }
});

Con estas simples configuraciones, hemos logrado crear gráficos interactivos y completamente personalizables. Puedes ajustar elementos como el título, el estilo de las barras o el fondo para adaptarlos a tus preferencias.

Consulta el código completo, experimenta con las opciones y personaliza los gráficos según tus necesidades. ¡Es hora de ponerse manos a la obra!

Un caso de éxito notable es nuestra implementación para el cliente Movactiva, donde desarrollamos gráficos de barras que mejoran la visualización y análisis de datos clave. Descubre más sobre este proyecto en el siguiente enlace: Movactiva Visor.

¿Te interesa saber más sobre este proyecto? Puedes asistir al webinar Atlas de Ciudades para la Movilidad Activa en España. Proyecto Movactiva que será el próximo 07 de noviembre de 2024, donde la investigadora Laia Mojica nos presentará los resultados de este proyecto.

Atlas de Ciudades para la Movilidad Activa en España. Proyecto Movactiva

Apúntate a nuestra newsletter semanal

"*" señala los campos obligatorios

Este campo es un campo de validación y debe quedar sin cambios.
Consentimiento*

Artículos relacionados

GeoServer-3-desarrollo-SIG-programación-web-GIS-Geoinnova
GeoServer 3: cambios en la interfaz, requisitos de sistema y checklist de migración
07/09/2026
cómo-digitalizar-en-Qgis-geoinnova-sig
Cómo digitalizar en QGIS: Guía completa paso a paso
01/09/2026
misiones-sentinel-copernicus-geoinnova
Las misiones Sentinel del programa Copernicus: qué observa cada una y para qué se utilizan
25/08/2026

Eva Rabasco

Full Stack Developer. Comprometida con el diseño y desarrollo de materiales innovadores basados en la Web. Amplia experiencia en tecnologías específicas del lado cliente y del servidor.

Actualmente forma parte del equipo de Programación y Desarrollo SIG de la Asociación Geoinnova.

Además desarrolla su labor como docente en algunos de los cursos de bases de datos y de programación SIG del catálogo de cursos de Geoinnova.

Interacciones con los lectores

¿Quieres comentarnos algo? Adelante! Cancelar la respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Geoinnova
c/ Luis Morondo Urra nº 8 Bajo A
31006 Pamplona (Navarra)
info@geoinnova.org
+34 948 117 137

Horario de atención

Lunes a Viernes - 09:00 a 14:00 y de 16:00 a 19:00.
Fines de semana y Festivos - Exclusivamente por mail.
Horario de Verano (01 de julio al 30 de agosto): De lunes a viernes de 8 a 15h.

Otras páginas de interes

  • Promociones y descuentos en formación
  • Formación bonificada FUNDAE
  • Verificador y descarga de Certificados de aprovechamiento
  • Cursos certificable por QGIS.org

Legal

  • Aviso Legal
  • Política de privacidad
  • Política de seguridad
  • Política de cookies
  • Términos y condiciones
Entidad adherida a Confianza Online Certificado de inscripción en el Registro de huella de carbono, compensación y proyectos de absorción Logo Plazox Certificado de conformidad con el ENS

Todo el contenido publicado desde 2009 hasta 2026 en el Blog de Geoinnova por Geoinnova y colaboradores está licenciado bajo CC BY-NC-ND 4.0
Para usos específicos, contactar con Geoinnova.

© 2026 · Desarrollada por Geoinnova

Gestionar el Consentimiento de las Cookies
Utilizamos tecnologías como las cookies para almacenar y/o acceder a la información del dispositivo. Lo hacemos para mejorar la experiencia de navegación y para mostrar anuncios personalizados. El consentimiento a estas tecnologías nos permitirá procesar datos como el comportamiento de navegación o las identificaciones únicas en este sitio. No consentir o retirar el consentimiento, puede afectar negativamente a ciertas características y funciones.
Funcional Siempre activo
El almacenamiento o acceso técnico es estrictamente necesario para el propósito legítimo de permitir el uso de un servicio específico explícitamente solicitado por el abonado o usuario, o con el único propósito de llevar a cabo la transmisión de una comunicación a través de una red de comunicaciones electrónicas.
Preferencias
El almacenamiento o acceso técnico es necesario para la finalidad legítima de almacenar preferencias no solicitadas por el abonado o usuario.
Estadísticas
El almacenamiento o acceso técnico que es utilizado exclusivamente con fines estadísticos. El almacenamiento o acceso técnico que es utilizado exclusivamente con fines estadísticos anónimos. Sin una requerimiento, el cumplimiento voluntario por parte de su proveedor de servicios de Internet, o los registros adicionales de un tercero, la información almacenada o recuperada sólo para este propósito no se puede utilizar para identificarlo.
Marketing
El almacenamiento o acceso técnico es necesario para crear perfiles de usuario para enviar publicidad, o para rastrear al usuario en un sitio web o en varios sitios web con fines de marketing similares.
  • Administrar opciones
  • Gestionar los servicios
  • Gestionar {vendor_count} proveedores
  • Leer más sobre estos propósitos
Personalizar
  • {title}
  • {title}
  • {title}