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

En la entrada anterior usamos d3.js para definir una gráfica lineal que evolucionaba temporalmente en tiempo real, siguiendo la evolución de una fuente de datos. El código era bastante lineal:

  • Simulamos una fuente de datos, creando un objeto de la clase DataSource.
  • En nuestra página, definimos un div con id graph1.
  • Usando d3.js, creamos una gráfica que insertamos en el div anterior y la refrescábamos cada vez que la fuente de datos tenía variaciones.

Pero, si en lugar de una sola fuente de datos (y una sola gráfica) ¿qué ocurre si tenemos seis fuentes de datos, cada una con su propia gráfica? ¿Cómo podemos modularizar el código anterior, para reutilizarlo?

En esta entrada, vamos a encapsular el código anterior, creando un plugin para jQuery.

El resultado final

El resultado final, es el siguiente:

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

El código html

Veamos el nuevo código html:

  • Defino seis div contenedores, uno para cada gráfica.
  • Todos los contenedores, son de la calse graph.
  • Cada div tiene dos atributos data-max-value y data-time-interval.
  • Cada div también tiene un id único.

El código javascript

Veamos primero el código completo:

Ahora, vamos a ir estudiándolo, poco a poco.

La activación del plugin

La primera parte del código, es la definición del nuevo plugin. Pero, antes de estudiarla, vamos a ver su activación que está al final del código (creo que es lo más didáctico):

  • Selecciono los div que van a contener mis gráficas con jQuery('div.graph').
  • Para cada div encontrado:
    • Extraigo sus atributos data-max-value y data-time-interval.
    • Creo un objeto de la clase DataSource.
    • Activo el nuevo plugin lineGraph sobre el div.
    • Configuro el evento onNewValue del objeto dataSource para que refresque la gráfica (llamando al método redraw del plugin que acabo de crear).

Yo creo que el uso del plugin es bastante directo. No le he añadido muchas opciones, porque mi objetivo era conseguir la configuración básica. Pero, aún así, se entiende de que hemos conseguido el objetivo (reutilizar el código encapsulándolo dentro del plugin para crear nuevas gráficas de forma bastante sencilla).

La definición del plugin

Ahora que hemos visto cómo usar el plugin, vamos a ver cómo debemos definirlo para conseguir ese interfase:

  • Defino el plugin dentro de jQuery.
  • Defino las opciones por defecto y la extiendo con las opciones que se le pasen al plugin cuando es activado.

La creación de la gráfica

El código que viene a continuación, prácticamente es el mismo usado en la entrada anterior para crear la gráfica:

Sólo merece la pena comentar:

  • La gráfica, es insertada en el objeto this que se le pasa al plugin (y que corresponde con el elemento div sobre el que se está activando la gráfica).
  • Usa las opciones opt.maxValue y opt.data para configurar la gráfica (el máximo valor en el eje vertical y los datos para dibujar la gráfica, respectivamente).
  • Devuelve un objeto con un sólo método redraw que será el que invoque para pedir al plugin que redibuje la gráfica.

El código css

Una vez que hemos visto el código html que hemos necesitado, vamos a ver el código css:

El detalle más importante es que, como he identificado a cada div contenedor con su propio id puedo usar estos id para dar formatos específicos a cada gráfica individual (en este caso, he dado un color distinto a cada gráfica).

Conclusiones

El plugin que he creado es bastante básico. Pero ha sido suficiente para conseguir encapsular mi código d3.js y poder reutilizarlo de forma muy limpia.

En una próxima entrada, me gustaría volver a encapsular nuevamente este código … pero dentro de un componente angular.js, para estudiar las diferencias entre ambas versiones.

Deja una respuesta

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

*
*
Sitio Web