Personalización
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>Vista general
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>API
Propiedades
id: Identificador único del componente que se asigna como atributo-selectoriddel 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:
Objectcon 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 delSVGse 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:
NumberAjuste automático al 100% - Requerido: No
- Tipo:
alto: Alto personalizado delSVG. Por defecto el alto delSVGes 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 contenidoHTMLen 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 contenidoHTMLen 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 propiedadesanchoyaltoen caso de haber sido especificadas, así como los tamaños de los contenedores deltitulo_eje_yytitulo_eje_xy 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,clickymouseout. Además almacenará la posición del cursor en el método y propiedad expuestagraficaque se menciona más adelante.panelesEnUso: Detecta si los slotspanel-pie-visopanel-encabezado-visestán siendo utilizados y agrega clases al elementoHTMLpara configurar estilos.grafica: Es un método expuesto que devuelve un objeto con información sobre el componente con los siguientes atributos:_alto:Numberaltura delSVG_ancho:Numberancho delSVG_globo_visible:Booleanque indica si se está usando el slotglobo-informacion_grupoVis:Objectcon los valores dealtoyanchoque corresponden al espacio en donde se graficará. Equivalen a las dimensiones delSVG_altoy_anchouna vez que se restan los márgenes verticales y laterales respectivamente._margenes:Objectigual a la propiedadmargenes_posicion_cursor:Objectcon los valoresxyycorrespondientes 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:Numberaltura delSVGalto_grafica:Numberancho delSVGgrafica:Functionmétodo que devuelve información sobre el componente, descrita en el métodografica.grupoFondo:Objectde tipoSelectionde D3 asociada a un grupog.grupo-fondodelSVG, ubicada detrás del grupo en el que se va a graficar, por lo tanto hereda todos los métodos deSelectionde D3. Auxiliar para agregar elementos gráficos de fondo.grupoFrente:Objectde tipoSelectionde d3 asociada a un grupog.grupo-frentedelSVG, ubicada en frente del grupo en el que se va a graficar, por lo tanto hereda todos los métodos deSelectionde D3. Auxiliar para agregar elementos gráficos en el primer plano.
Ejemplo
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>