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

En la entrada anterior añadimos a la gráfica un par de selectores de fechas, para poder realizar un zoom en una zona específica de la gráfica. Sin embargo, el resultado no terminaba de convencerme. Así que en esta nueva versión voy a sustituir los selectores de fechas por un slider que permita cumplir dicha función de una forma más interactiva.

El resultado final

El resultado final es el siguiente

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

El código html

Para conseguir el slider, he usado el slider bootstrap-slider de seirya. En el html, me limito a crear el elemento input sobre el que inicializaré el slider en mi javascript.

El código css

He usado el CSS para perfilar un poco el aspecto del slider (sobre todo, para que slider ocupe el ancho disponible de la pantalla):

El código javascript

El código javascript es el siguiente:

Vamos a estudiarlo poco a poco, centrándonos en las partes nuevas

Definiciones iniciales

A las variables anteriores, añado las nuevas variables necesarias para coordinar el slider con la gráfica:

  • minDate, maxDate y maxValue guardarán los valores máximos y mínimos de los datos que recupere.
  • scrollSlider guardará la referencia al slider, para manipularlo.
  • millisecondsToDays es una constante que usaremos más adelante.

La inicialización del slider

En esta inicialización, me limito a:

  • Configurar el formatter que formatea el texto que aparece en la tooltip asociada al slider.
  • Configuro el evento slideStop del slider para redibujar la gráfica.

Para formatear las etiquetas, el slider me pasa como parámetro value o un valor o un array de dos valores con los valores vigentes del slider. Como he configurado mi slider para que los valores vayan desde 0 al número máximo de días (esto, lo hago más adelante), convierto este número de días a fechas concretas a partir de la fecha mínima de mis datos minDate.

El slider tiene varios eventos. Este evento elegido slideStop se dispara cuando el usuario deja de arrastrar el slider o cuando el usuario hace click en el slider. Me hubiera gustado usar el evento change para conseguir un efecto más interactivo, pero el rendimiento no me gustaba.

Defino los elementos básicos de la gráfica

La primera parte de este código, no ha experimentado cambios respecto de la versión anterior. Pero ahora también aprovecho para definir los elementos básicos d3 (xRange, yRange, xAxis, yAxis, valueFunc). Estos elementos, eran definidos dentro de la función redrawSvg y por lo tanto redefinidos cada vez que la gráfica experimentaba un cambio de tamaño. Me he dado cuenta que no es necesario esta redefinición y por eso los he cambiado de lugar en el código.

Defino los función responsable de terminar la definición de los elementos SVG de la gráfica

Esta parte del código, tampoco ha experimentado cambios respecto de la versión anterior. Excepto que, tal como he explicado previamente, la definiciones de los elementos d3.js ya no las hago aquí. Ahora, me limito a modificar los elementos afectados por los redimensionamientos de la ventana.

Defino la función responsable de dibujar la gráfica

Esta función, sí que ha cambiado:

  • Ahora, busca las fechas límites para mostrar fromDate y toDate en el nuevo slider.
  • Para calcular fromDate y toDate, sé que los valores que devuelve mi slider scrollSlider van de 0 días al máximo de días que abarcan mis datos (esto, lo configuro un poco más adelante).
  • Estos nuevos límites me dan el rango para xRange.
  • El rango para yRange es siempre el mismo. Si calculara el valor máximo en el rango mostrado, la escala vertical de la gráfica variaría con el tiempo.
  • Con los datos filtrados y los rangos configurados, lo redibujo todo.

Carga inicial de la aplicación

Por último, realizo la carga inicial de la aplicación.

Este código, es similar al de la versión anterior. Su diferencia estriba que esta vez tengo que inicializar el slider:

  • Calculo los valores máximos de los datos recuperados minDate, maxDate y maxValue.
  • Calculo el número de días numDays que abarcan estos datos.
  • Configuro el slider scrollSlider para que abarque desde 0 hasta numDays.

¿Conclusiones?

Como D3.js te proporciona una serie de primitivas básicas, esto te da una flexibilidad tremenda a la hora de planificar tu gráfica. En esta versión, creo que la interactividad ha mejorado. Todavía no es la óptima, pero prefiero investigar otros aspectos antes de optimizar este punto (todo llegará…).

Deja una respuesta

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

*
*
Sitio Web