Encapsulando una gráfica realizada con D3.js en un plugin jQuery (parte I)

Imaginemos que queremos realizar un panel de control. Dentro de este panel de control, queremos una gráfica de líneas que nos vaya mostrando en tiempo real la evolución temporal de un indicador.

El resultado final

El resultado final conseguido es éste:

Podéis abrir este mismo resultado en una ventana independiente aquí.

El código html

Se limita a crear un div con id graph1 en el que insertaré posteriormente mi gráfica:

El generador de datos

Para realizar este experimento, necesito una fuente de datos (para simular al indicador). Así que me he creado un pequeño generador de datos:

Básicamente, es una clase que:

  • Mantiene un array de 10 valores (podría haber parametrizado el número de valores, pero he sólo he parametrizado lo mínimo que me interesaba para el experimento).
  • Cada dato del array, es un objeto con dos propiedades date y value.
  • Las propiedades date de cada valor están separadas por 1 minuto de diferencia, partiendo del valor inicial options.initialDate.
  • Las propiedades value de cada valor los calculo aleatoriamente entre 0 y options.maxValue.
  • Cada intervalo de tiempo options.timeInteval (en milisegundos), se genera un nuevo valor.
  • Usando el método onNewValue, se pueden registrar funciones callback que serán invocadas cuando se genere un nuevo valor.

Cuando se genera un nuevo valor:

  • El primer valor de la pila es eliminado y se añade este nuevo valor.
  • Invoca a las funciones callback registradas.

Un ejemplo de uso de este generador sería:

El código javascript para la gráfica

Desde el punto de vista de d3.js, este código es bastante trivial (ya me he extendido bastante más al respecto en mi serie sobre d3.js).

Define los componentes de la gráfica:

  • Genera un elemento svg en el que inserta los elementos para los ejes de coordenadas (xAxisLine y yAxisLine) y la gráfica graphLine.
  • Define una escala horizontal xRange que será temporal y una escala vertical yRange que será lineal.
  • Define un eje horizontal xAxis asociado a la escala xRange y al eje xAxisLine.
  • Define un eje vertical yAxis asociado a la escal yRange y al eje yAxisLine.

La funcion redrawData será invocada cuando el array data esté correctamente inicializado:

  • Configura la escala horizontal xRange en función de los valores mínimo y máximo de la propiedad date.
  • Redibuja los ejes horizontal y vertical.
  • Redibuja la gráfica.

La parte realmente interesante, es al final del código:

  • Crea un objeto dataSource de la clase DataSource.
  • Inicializa la variable data para que apunte a la propiedad data del objeto dataSource.
  • Le pasamos al evento dataSource.onNewValue una función anómima que llamará a redrawData.

La siguiente parte

Como explicaba antes, este código d3.js es bastante básico (en esta entrada, me he limitado a describirlo por encima, sin entrar en detalles). Pero ¿qué ocurre si en lugar de tener que representar una fuente de datos, tenemos que representar en la misma página más de una fuente de datos, cada una con su propia gráfica? ¿Hacemos un copia-y-pega del código actual? En la siguiente entrada, crearé un plugin jQuery que nos permita modularizar este código.

Deja una respuesta

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

*
*
Sitio Web