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:
<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:
<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í
- Tipo:
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í
- Tipo:
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 unString
que debe coincidir con alguna subcategoría dedatos
, equivalente a uno de los nombres de las columnas que contiene información numérica.
color
: es unString
que define el color de cada categoría, en formato RGB, hexadecimal u otro formato reconocido porCSS
.
Métodos
creaAlluvial
: Este método crea y actualiza el diagrama cuando detecta cambios endatos
,variables
o en otros elementos del componente contenedor<SisdaiGraficas>
, comomargenes
o las dimensiones delSVG
.
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 unObject
con los datos asociados al elemento generado por D3. Generalmente se usa esta propiedad para llenar el componente deSisdaiGraficasGloboInfo
con información.- Si el cursor está sobre un enlace, devuelve un objeto con la clave
tipo: "enlace"
, junto con las clavestarget
,source
yvalue
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 datosname
,id
yvalue
entre otros que asigna automáticamente D3.
- Si el cursor está sobre un enlace, devuelve un objeto con la clave
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:
<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>