Alluvial

El componente <SisdaiAlluvial/>, permite generar diagramas de flujo de tipo Alluvial. Es ideal para representar flujo y/o conexiones entre diferentes datos.

Ejemplo de implementación:

html
<SisdaiGraficas>
  <SisdaiAlluvial
    :datos="datos"
    :variables="variables"
  >
  </SisdaiAlluvial>
</SisdaiGraficas>

Vista general

El siguiente ejemplo muestra el funcionamiento del componente con un conjunto de datos simples y un globo de información condicional:

vue
<script setup>
import { ref } from 'vue'
const elAlluvial = ref()
</script>
<template>
  <SisdaiGraficas
    :margenes="{ arriba: 30, abajo: 70, derecha: 30, izquierda: 40 }"
  >
    <template #panel-encabezado-vis>
      <p class="vis-titulo-visualizacion">Ejemplo básico</p>
    </template>
    <template #globo-informacion>
      <SisdaiGraficasGloboInfo :ancho="180">
        <p v-if="elAlluvial?.datos_hover?.tipo === 'nodo'">
          {{ elAlluvial?.datos_hover?.name }} <br />
          Valor: {{ elAlluvial?.datos_hover?.value }}
        </p>
        <p v-else-if="elAlluvial?.datos_hover?.tipo === 'enlace'">
          {{ elAlluvial?.datos_hover?.source?.name }} →
          {{ elAlluvial?.datos_hover?.target?.name }}<br />
          Valor: {{ elAlluvial?.datos_hover?.value }}
        </p>
      </SisdaiGraficasGloboInfo>
    </template>
    <SisdaiAlluvial
      ref="elAlluvial"
      :datos="{
        nodos: [
          { name: 'Nodo 0', id: 'nodo0' },
          { name: 'Nodo 1', id: 'nodo1' },
          { name: 'Nodo 2', id: 'nodo2' },
        ],
        enlaces: [
          { source: 'Nodo 0', target: 'Nodo 2', value: 1 },
          { source: 'Nodo 1', target: 'Nodo 2', value: 1 },
        ],
      }"
      :variables="[
        { id: 'nodo0', color: '#2c7fb8' },
        { id: 'nodo1', color: '#2c7fb8' },
        { id: 'nodo2', color: '#2c7fb8' },
        {
          id: 'enlaces',
          color: '#2c7fb8',
        },
      ]"
    />
  </SisdaiGraficas>
</template>

API

Propiedades

  • datos: Conjunto de datos a visualizar. Consiste en un objeto que contiene dos claves principales: "nodos" cuyo valor es un arreglo de objetos que representan cada nodo con su respectivo nombre e id, y "enlaces", que es un arreglo de objetos que define las conexiones entre los nodos, especificando la fuente, el objetivo y los valores asociados a cada enlace.

    • Tipo: Object
    • Valor predeterminado: undefined
    • Requerido: Sí

Ejemplo de datos:

json
{
  "nodos": [
    { "name": "Nodo 0", "id": "nodo0" },
    { "name": "Nodo 1", "id": "nodo1" },
    { "name": "Nodo 2", "id": "nodo2" },
    { "name": "Nodo 3", "id": "nodo3" }
  ],
  "enlaces": [
    { "source": "Nodo 0", "target": "Nodo 2", "value": "1" },
    { "source": "Nodo 1", "target": "Nodo 2", "value": "1" }
    { "source": "Nodo 2", "target": "Nodo 3", "value": "2" }
  ]
}

Para este tipo de visualización no se recomienda usar archivos .csv, por lo que se sugiere importar los datos desde un archivo en formato .json.

  • variables: Un arreglo de objetos que contiene la configuración gráfica para cada nodo o enlace dentro de los datos.
    • Tipo: Array
    • Valor predeterminado: undefined
    • Requerido: Sí

Ejemplo de variables:

json
[
  {
    "id": "nodo0",
    "color": "pink"
  },
  {
    "id": "nodo1",
    "color": "orange"
  },
  {
    "id": "enlaces",
    "color": "#2c7fb8"
  }
]

Esta propiedad incluye un validador que asegura que cada objeto en el arreglo contenga las siguientes dos claves:

  • id: su valor es un String que debe coincidir con alguna subcategoría de datos, equivalente a uno de los nombres de las columnas que contiene información numérica.
  • color: es un String que define el color de cada categoría, en formato RGB, hexadecimal u otro formato reconocido por CSS.

Métodos

  • creaAlluvial: Este método crea y actualiza el diagrama cuando detecta cambios en datos, variables o en otros elementos del componente contenedor<SisdaiGraficas>, como margenes o las dimensiones del SVG.

Propiedades expuestas

  • datos_hover: Esta propiedad expuesta se actualiza cuando el cursor se posiciona sobre uno de los rectángulos (nodos) o en algún enlace y devuelve un Object con los datos asociados al elemento generado por D3. Generalmente se usa esta propiedad para llenar el componente de SisdaiGraficasGloboInfo con información.
    • Si el cursor está sobre un enlace, devuelve un objeto con la clave tipo: "enlace", junto con las claves target, source y value entre otros que asigna automáticamente D3.
    • Si el cursor está sobre un nodo, devuelve un objeto con la clave tipo:"nodo", además de los datos name, id y value entre otros que asigna automáticamente D3.

Ejemplo

Como se observa en el ejemplo anterior, cuando el cursor está dentro del gráfico en un área en blanco, el globo de información se queda sin contenido. Para evitar esto y mostrar el globo solo cuando el cursor está sobre un elemento visual, se puede usar la directiva v-show como se muestra en el siguiente ejemplo:

vue
<script setup>
import { ref } from 'vue'
import datos_energia from '../../assets/datos/alluvial_balance_energia.json'

const datos = ref(datos_energia)
const elAlluvial = ref()
</script>
<template>
  <SisdaiGraficas
    :alto="800"
    :margenes="{ arriba: 30, abajo: 30, derecha: 30, izquierda: 30 }"
  >
    <template #panel-encabezado-vis>
      <p class="vis-titulo-visualizacion">Ejemplo complejo</p>
      <p class="vis-instruccional">
        Pasa el cursor sobre el gráfico para explorar el funcionamiento
      </p>
    </template>
    <template #globo-informacion>
      <SisdaiGraficasGloboInfo
        :ancho="180"
        v-show="
          (elAlluvial?.datos_hover?.tipo === 'nodo') |
            (elAlluvial?.datos_hover?.tipo === 'enlace')
        "
      >
        <p v-if="elAlluvial?.datos_hover?.tipo === 'nodo'">
          {{ elAlluvial?.datos_hover?.name }} <br />
          Valor: {{ elAlluvial?.datos_hover?.value.toLocaleString('en') }}
        </p>
        <p v-else-if="elAlluvial?.datos_hover?.tipo === 'enlace'">
          {{ elAlluvial?.datos_hover?.source?.name }} →
          {{ elAlluvial?.datos_hover?.target?.name }}<br />
          Valor: {{ elAlluvial?.datos_hover?.value.toLocaleString('en') }}
        </p>
      </SisdaiGraficasGloboInfo>
    </template>
    <SisdaiAlluvial
      ref="elAlluvial"
      :datos="datos"
      :variables="[
        { id: 'node0', color: '#999' },
        { id: 'node1', color: '#999' },
        { id: 'node2', color: '#999' },
        { id: 'node3', color: '#000000' },
        { id: 'node4', color: '#85200c' },
        { id: 'node5', color: '#f00' },
        { id: 'node6', color: '#4a86e8' },
        { id: 'node7', color: '#9900ff' },
        { id: 'node8', color: '#783f04' },
        { id: 'node9', color: '#0000ff' },
        { id: 'node10', color: '#0ff' },
        { id: 'node11', color: '#0ff' },
        { id: 'node12', color: '#6d9eeb' },
        { id: 'node13', color: '#ff0' },
        { id: 'node14', color: '#b45f06' },
        { id: 'node15', color: '#999' },
        { id: 'node16', color: '#999' },
        { id: 'node17', color: '#999' },
        { id: 'node18', color: '#999' },
        { id: 'node19', color: '#999' },
        { id: 'node20', color: '#999' },
        { id: 'node21', color: '#999' },
        { id: 'node22', color: '#999' },
        { id: 'node23', color: '#999' },
        { id: 'node24', color: '#999' },
        { id: 'node25', color: '#999' },
        { id: 'node26', color: '#999' },
        { id: 'node27', color: '#999' },
        { id: 'node28', color: '#999' },
        { id: 'node29', color: '#999' },
        { id: 'node30', color: '#cc4125' },
        { id: 'node31', color: '#000000' },
        { id: 'node32', color: '#666666' },
        { id: 'node33', color: '#999' },
        { id: 'node34', color: '#b7b7b7' },
        { id: 'node35', color: '#cccccc' },
        { id: 'node36', color: '#c9daf8' },
        { id: 'node37', color: '#6d9eeb' },
        { id: 'node38', color: '#ff00ff' },
        { id: 'node39', color: '#999' },
        { id: 'node40', color: '#00ff00' },
        { id: 'node41', color: '#00ff00' },
        {
          id: 'enlaces',
          color: 'purple',
        },
      ]"
    />
  </SisdaiGraficas>
</template>