SisdaiGraficas
El componente de <SisdaiGraficas>
actúa como un contenedor principal para visualizar distintos tipos de gráficas. Al utilizarlo, se crea un elemento SVG con un identificador único (id) donde se renderizan los subcomponentes gráficos como barras, series de tiempo, cajas, entre otros.
Ejemplo de implementación:
<SisdaiGraficas
:titulo_eje_y="'título del eje y'"
:titulo_eje_x="'título del eje x'"
>
...
</SisdaiGraficas>
API
Propiedades
id
: Identificador único del componente que se asigna como atributo-selectorid
del elementoHTML
- Tipo:
String
- Valor predeterminado: Se genera un identificador único aleatorio al montar el componente
- Requerido: no
- Tipo:
margenes
: Objeto que especifica en píxeles la separación que habrá entre los bordes del SVG y los elementos gráficos como ejes.- Tipo:
Object
con la estructura{arriba: Number, abajo: Number, izquierda: Number, derecha: Number}
- Valor predeterminado:
{ arriba: 20, abajo: 20, derecha: 20, izquierda: 30 }
- Requerido: opcional
- Tipo:
titulo_eje_y
: Título del eje vertical.- Tipo:
String
- Valor predeterminado:
""
- Requerido: Opcional
- Tipo:
titulo_eje_x
: Título del eje horizontal.- Tipo:
String
- Valor predeterminado:
""
- Requerido: Opcional
- Tipo:
ancho
: Ancho personalizado delSVG
. Por defecto el ancho delSVG
se ajusta de forma responsiva al 100% del contenedor, pero si se desea especificar otro ancho en píxeles se puede usar esta propiedad.- Tipo:
Number
- Valor predeterminado:
Number
Ajuste automático al 100% - Requerido: No
- Tipo:
alto
: Alto personalizado delSVG
. Por defecto el alto delSVG
es de400px
, pero si se desea usar otra altura en píxeles se puede usar esta propiedad.- Tipo:
Number
- Valor predeterminado:
400
- Requerido: No
- Tipo:
Slots
- Slot principal: Se utiliza para insertar los subcomponentes gráficos, como
<SisdaiBarras/>
, dentro de<SisdaiGraficas/>
. panel-encabezado-vis
: En este slot se puede introducir contenidoHTML
en la parte superior del gráfico usando los estilos especificados para visualizaciones por el Sisdai, tales como títulos de gráfica, instrucción, fecha de actualización, entre otros.panel-pie-vis
: En este slot se puede introducir contenidoHTML
en la parte inferior del gráfico, usando los estilos especificados para visualizaciones por el Sisdai, tales como nomenclaturas, fuentes, entre otros.globo-informacion
: En este slot se inserta el componente<SisdaiGraficasGloboInfo/>
que muestra información sobre el gráfico de forma interactiva. Puedes consultar más información aquí.
Métodos
obteniendoDimensiones
: Esta función toma el tamaño del contenedor o las propiedadesancho
yalto
en caso de haber sido especificadas, así como los tamaños de los contenedores deltitulo_eje_y
ytitulo_eje_x
y con ello asigna el tamaño delSVG
.siHayGlobo
: Se ejecuta si se está usando el slotglobo-informacion
, y en caso de ser así activará las funciones interactivas demousemove
,click
ymouseout
. Además almacenará la posición del cursor en el método y propiedad expuestagrafica
que se menciona más adelante.panelesEnUso
: Detecta si los slotspanel-pie-vis
opanel-encabezado-vis
están siendo utilizados y agrega clases al elementoHTML
para configurar estilos.grafica
: Es un método expuesto que devuelve un objeto con información sobre el componente con los siguientes atributos:_alto
:Number
altura delSVG
_ancho
:Number
ancho delSVG
_globo_visible
:Boolean
que indica si se está usando el slotglobo-informacion
_grupoVis
:Object
con los valores dealto
yancho
que corresponden al espacio en donde se graficará. Equivalen a las dimensiones delSVG
_alto
y_ancho
una vez que se restan los márgenes verticales y laterales respectivamente._margenes
:Object
igual a la propiedadmargenes
_posicion_cursor
:Object
con los valoresx
yy
correspondientes a la posición horizontal y vertical del cursor. Estos se actualizan de forma interactiva si se utiliza el slotglobo-informacion
.
Propiedades expuestas
ancho_grafica
:Number
altura delSVG
alto_grafica
:Number
ancho delSVG
grafica
:Function
método que devuelve información sobre el componente, descrita en el métodografica
.grupoFondo
:Object
de tipoSelection
de D3 asociada a un grupog.grupo-fondo
delSVG
, ubicada detrás del grupo en el que se va a graficar, por lo tanto hereda todos los métodos deSelection
de D3. Auxiliar para agregar elementos gráficos de fondo.grupoFrente
:Object
de tipoSelection
de d3 asociada a un grupog.grupo-frente
delSVG
, ubicada en frente del grupo en el que se va a graficar, por lo tanto hereda todos los métodos deSelection
de D3. Auxiliar para agregar elementos gráficos en el primer plano.
Ejemplos
Ejemplo básico de componente
En este ejemplo se muestra cómo se escribe el componente <SisdaiGraficas>
y se especifican algunas de sus propiedades. Al inspeccionar los elementos, se puede observar que este componente crea un SVG
con algunos grupos en su interior.
<script setup></script>
<template>
<SisdaiGraficas
:titulo_eje_y="'título del eje y'"
:titulo_eje_x="'título del eje x'"
:alto="300"
>
</SisdaiGraficas>
</template>
Ejemplo con propiedades dinámicas
En este ejemplo se agrega un rectángulo en el interior del SVG
para mostrar cómo se puede aplicar reactividad y ajustar sus dimensiones en función del ancho del contenedor del SVG
y la manipulación de los márgenes. El área del rectángulo ilustra el espacio en el cual se dibujarán los gráficos, mientras que los márgenes pueden utilizarse como espacio reservado para los ejes.
<script setup>
import { onMounted, ref } from 'vue'
const margen = ref(30)
const sisdaiGraficaEditable = ref(null)
onMounted(() => {
// Los métodos de grupoFondo y grupoFrente son heredados de d3
sisdaiGraficaEditable.value.grupoFondo
.append('circle')
.attr('cx', 10)
.attr('cy', 10)
.attr('r', 20)
.style('fill', 'cyan')
.style('fill-opacity', '.8')
sisdaiGraficaEditable.value.grupoFrente
.append('circle')
.attr('cx', 30)
.attr('cy', 10)
.attr('r', 20)
.style('fill', 'magenta')
.style('fill-opacity', '.8')
})
</script>
<template>
<SisdaiGraficas
class="con-panel-encabezado-vis"
ref="sisdaiGraficaEditable"
:margenes="{
arriba: Number(margen),
abajo: Number(margen),
derecha: Number(margen),
izquierda: Number(margen),
}"
:titulo_eje_y="'título del eje y'"
:titulo_eje_x="'título del eje x'"
>
<template #panel-encabezado-vis>
<div>
<p class="vis-titulo-visualizacion">Titulo de visualizacion</p>
<p class="vis-instruccional">
Modifica el margen para ver su efecto en el componente{{
sisdaiGraficaEditable?.grafica()._grupoVis
}}
</p>
<label for="margenes">margen: {{ margen }}</label>
<input
id="margenes"
type="range"
v-model="margen"
/>
</div>
</template>
<template #globo-informacion>
<SisdaiGraficasGloboInfo :ancho="180">
<p>Soy un globo de información :P</p>
</SisdaiGraficasGloboInfo>
</template>
<rect
fill="rgba(0,0,0,.5)"
:x="margen"
:y="margen"
:height="sisdaiGraficaEditable?.grafica()._grupoVis.alto"
:width="sisdaiGraficaEditable?.grafica()._grupoVis.ancho"
></rect>
<template #panel-pie-vis>
<div>
<p class="vis-instruccional">
Se están agregando elementos al grupoFondo y grupoFrente, además se
agregó el slot de globo-informacion
</p>
</div>
</template>
</SisdaiGraficas>
</template>