Practicando con D3.js y datos del IBEX35 – Parte III

Práctica 3: Filtrando los datos y optimizando la gráfica

Hasta ahora, en las dos primeras versiones que hemos realizado de nuestra gráfica de los datos del IBEX35 (si estás interesado, puedes consultarlas aquí y aquí) hemos representado el conjunto completo de los datos que hemos recuperado (estamos hablando de datos históricos diarios que abarcan desde el año 1994). Para comenzar a practicar a manejar D3.js, está bien. Pero si queremos estudiar estos datos, esta gráfica puede ser poco práctica. Así que en esta nueva versión vamos a concentrarnos en poder seleccionar qué rango de datos queremos mostrar en pantalla.

Para conseguir el filtro de los datos, teníamos dos alternativas:

  • La primera, es conseguir una API en el servidor que permita recuperar sólo ciertos datos, mediante parámetros adicionales.
  • La segunda, es continuar recuperando todos los datos y efectuar este filtro en el navegador, mediante javascript.

Para estos ejemplos, voy a emplear la segunda alternativa. Los motivos para esta decisión son dos:

  • El primero, para tener la oportunidad de hacer estas operaciones con javascript.
  • El segundo motivo, es que prefiero pedir todos los datos para manipularlos en local (conforme avance con futuras versiones, espero aclarar este motivo).

Además, el conjunto de datos no es muy grande y pueden ser recuperados de una sola vez (ése podía ser un motivo para segmentar las peticiones, pero como digo en este caso no es necesario).

El resultado final

El resultado final es el siguiente:

Podéis consultarlo en una ventana independiente pinchando aquí.

El código html

Para incluir los selectores del rango de fecha, nuestro código html se ha complicado un poco. Ha pasado de ser:

a ser:

Básicamente, he añadido un nuevo div que contiene los nuevos selectores de fecha.

Para crear los selectores de fecha, he usado bootstrap-datepicker.js (realmente, no me convence mucho el resultado, pero mi objetivo actual es concentrarme con D3.js, así que lo doy por razonable).

El código javascript

Primero, veamos el código javascript completo:

Y, ahora, vamos a comenzar a estudiarlo, poco a poco:

Definición de variables

La primera parte, la definición de las variables, sigue igual (si alguien tiene interés, puede consultar los artículos anteriores):

(Bueno, tenemos dos nuevas variables fromDate y toDate que guardarán el rango de fechas a visualizar).

Inicialización y configuración de los selectores del rango de fechas

Ahora, inicializamos los dos nuevos selectores del rango de fecha:

Y configuramos los eventos para cuando el usuario elija un nuevo rango reasigne las variables fromDate y toDate y redibuje la gráfica llamando a redrawData:

Creación del objeto svg y los elementos interiores

Como hacíamos en versiones anteriores, vuelvo a crear el elemento svg que me servirá de contenedor para mi gráfica y guardo una referencia en la variable svg:

Lo que es diferente de las versiones anteriores es que también creo el el elemento path al que adjuntaré la gráfica y los dos elementos g a los que adjuntaré los ejes de coordenadas. Los creo sin ningún contenido. Pero ya los tengo creados (más adelante en el código, los recuperaré y terminaré de rellenarlos).

Defino la organización general de la gráfica

Mi función redrawSvg será la responsable de configurar la gráfica. Primero, calculo la anchura y la altura y se la asigno a mi objeto svg. Como ya tengo la altura y la anchura, posiciono los dos ejes de coordenadas:

Esta vez, para calcular la altura disponible para mi gráfica, debo restarle a la altura disponible (para más información, puedes consultar la parte anterior) la altura que ocupan los selectores de rango de fecha. Para que la altura de la propia gráfica no influya en la altura del contenedor, le cambio su position a absolute.

Defino las escalas, los ejes y la gráfica

Ya expliqué estas definiciones en las entradas anteriores, así que esta vez me limito a citarlas:

Defino la función que dibujará la gráfica

Una vez que recupere los datos, mi función redrawData será la encargada de filtrarlos (en función del rango de fechas que elija el usuario) y de volcarlos en la gráfica. Vamos a ver paso a paso cómo lo hace.

Primero, filtro los datos:

Para filtrar los datos uso la el método filter y creo un nuevo array filteredData.

Una vez tengo los datos filtrados, ya puedo terminar de configurar las escalas horizontal y vertical:

Por último, dibujo los ejes de coordenadas y la gráfica:

Esta parte del código también es diferente de las dos versiones anteriores. Vamos a estudiarla más detalladamente:

  • ¿Recordáis cómo ya insertamos antes los elementos g para los ejes de coordenadas, pero vacíos? Pues ahora que tenemos toda la información, los recuperamos y les asignamos los objetos xAxis e yAxis que ya tenemos completamente definidos. Para recuperar estos elementos g, usamos selectores (cuando los insertamos, les asignamos clases que los identificaban perfectamente y nos permite seleccionarlos).
  • Hacemos algo similar con el elemento path para la gráfica: lo seleccionamos y le asociamos los datos filteredData y el objeto valueFunc para crear la gráfica.

¿Y qué diferencia hay entre la versión anterior y esta nueva?:

  • En la versión anterior, borrábamos los elementos y los volvíamos a añadir. Esto implicaba la visualización de una gráfica completamente nueva.
  • En este nueva versión, no borramos los elementos sino que cambiamos sus valores. Esto obliga a D3.js a realizar un redibujado de dichos elementos.
  • Además, antes de asignar a los elementos sus nuevos valores, llamamos al método transition. En esta llamada, se muestra la potencia visual de D3.js porque le estamos pidiendo que realice dicho cambio mediante una animación.

Efectivamente, una simple llamada a transition antes de realizar un cambio sobre un elemento preexistente, consigue efectos visuales espectaculares. Además, tiene muchas más alternativas de configuración (pero eso es tema para otra entrada específica).

Dibujo por primera vez la gráfica y capturo las notificaciones de cambios del rango de fecha

Al final del código, dibujo la gráfica por primera vez:

Esta parte del código, se ha complicado un poco respecto de las versiones anteriores:

  • La llamada a redrawSvg crea el elemento svg y su contenido básico.
  • Cuando termina la carga de los datos
    • Calculo las fechas más extremas y las guardo en fromDate y toDate.
    • Inicializo con esos valores los selectores de fechas.
    • Con los datos ya cargados, llamo a redrawData para que dibuje la gráfica.

Deja una respuesta

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

*
*
Sitio Web