JavaScript para Graficos y Visualizacion de Datos

25
JavaScript para Gráficos y Visualización de Datos Nicolas Garcia Belmonte - @philogb

Transcript of JavaScript para Graficos y Visualizacion de Datos

Page 1: JavaScript para Graficos y Visualizacion de Datos

JavaScript para Gráficos y Visualización

de Datos

Nicolas Garcia Belmonte - @philogb

Page 3: JavaScript para Graficos y Visualizacion de Datos
Page 4: JavaScript para Graficos y Visualizacion de Datos

Soy el autor de dos frameworks de visualización en JavaScript

PhiloGL JavaScript InfoVis Toolkit

Page 5: JavaScript para Graficos y Visualizacion de Datos
Page 6: JavaScript para Graficos y Visualizacion de Datos

Visualización en la Web con JavaScript

Gather

Transform

Serve

Load Data

Build Models

Render

Interact

DB

Python

JSON / Binary

XHR2

Workers / TypedArrays

WebGL / 2D Canvas

DOM Events / HTML Forms

Extraer

Transformar

Servir

Cargar Datos

Crear Modelos

Renderear

Interactuar

Datos / Servidor / Cliente

Viz / Cliente

Page 7: JavaScript para Graficos y Visualizacion de Datos

Primer Ejemplo

Page 9: JavaScript para Graficos y Visualizacion de Datos

Data SourceVideo / Camera

InteractionForms

RenderingWebGL

Page 10: JavaScript para Graficos y Visualizacion de Datos

Recolección de Datos

<video id="movie" autoplay controls class="shadows" width="480">  <source src="movie/shrek.mp4" type='video/mp4; codecs="avc1.42E01E, mp4a.40.2"' />  <source src="movie/shrek.ogv" type='video/ogg; codecs="theora, vorbis"' /></video>

HTML5 Video & Media Source

var video = document.getElementById('movie');video.play();video.pause();video.volume += 0.1;

navigator.getUserMedia('video', function(localMediaStream) {    video.src = window.URL.createObjectURL(localMediaStream);}, function() {    //error...});

Page 11: JavaScript para Graficos y Visualizacion de Datos

Obtener pixel data usando 2D Canvas

<canvas id="pastie" width="50" height="50" style="display:none;"></canvas>

var canvas = document.getElementById('pastie'),    ctx = canvas.getContext('2d'),    rgbaArray;

ctx.drawImage( movie, 0, 0, 50, 50);

rgbaArray =  ctx.getImageData(0, 0, 50, 50).data;

Transformación de Datos

Page 12: JavaScript para Graficos y Visualizacion de Datos

Crear Modelos 3DWeb Workers

var worker = new Worker('task.js');

worker.addEventListener('message', function(e) {    var models = e.data;    //do something with the models once they're built...}, false);

worker.postMessage();

//in task.jsself.addEventListener('message', function(e) {    var models;    //build models...    self.postMessage(models);});

Page 13: JavaScript para Graficos y Visualizacion de Datos

Renderear la EscenaCanvas / WebGL / PhiloGL

  function loop() {    //send data to GPU    program.setUniform('size', sizeValue);    program.setBuffer('histogram', {      value: new Float32Array(createColorArray(movie)),      size: 1    });    //rotate histogram a little bit    theta += 0.007;    histogramModel.rotation.set(-Math.PI / 4, theta, 0.3);    histogramModel.update();    //clear the screen    gl.clearColor(color, color, color, 1);    gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);    //render the scene    scene.render();    //request next frame for loop    Fx.requestAnimationFrame(loop);  }

Page 14: JavaScript para Graficos y Visualizacion de Datos

Segundo Ejemplo

Page 16: JavaScript para Graficos y Visualizacion de Datos

InteractionForms

InteractionForms

Rendering / InteractionWebGL

Page 17: JavaScript para Graficos y Visualizacion de Datos

Datos

• 1200 estaciones de meteorología

• 72 horas de datos

• 5 variables - latitud, longitud, velocidad y dirección del viento, temperatura

= 460.000 items

Page 18: JavaScript para Graficos y Visualizacion de Datos

DatosDatos Binarios

direction speed temperature direction speed temperature

unsigned ints

JSON[10, 1, 100, ...]

Page 19: JavaScript para Graficos y Visualizacion de Datos

DatosDatos Binarios

0

375000

750000

1125000

1500000

Bytes

Binary JSON

Page 20: JavaScript para Graficos y Visualizacion de Datos

Cargar DatosXHR2

var xhr = new XMLHttpRequest();xhr.open('GET', 'http://some.binary.data/', true);

//track file loading progressxhr.addEventListener('progress', function(e) {    console.log(Math.round(e.loaded / e.total * 100));}, false);

//set to receive array bufferxhr.responseType = 'arraybuffer';

//get data when availablexhr.addEventListener('readystatechange', function(e) {    if (xhr.readyState == 4 /* COMPLETE */) {        if (xhr.status == 200 /* OK */) {            //binary data here!            handleBinaryData(xhr.response); //ArrayBuffer        }                        }}, false);

//send requestxhr.send();

Page 21: JavaScript para Graficos y Visualizacion de Datos

Cargar DatosTyped Arrays: Ultra rápidos Arrays

function handleBinaryData(arraybuffer) {    var typedArray = new Uint16Array(arraybuffer);    //do stuff like with a regular array    for (var i = 0, l = typedArray.length; i < l; ++i) {        typedArray[i] += 2;            }}

ArrayBuffer

Uint8Array

Float32Array

Int16Array

etc.

Page 22: JavaScript para Graficos y Visualizacion de Datos

InteracciónHTML5 Forms

<input id='time' type='range' value='0' min='0' max='71' step='1'>

var slider = document.getElementById('time');

slider.addEventListener('change', function(e) {    var value = slider.valueAsNumer;}, false);

Otros tipos: color, date, datetime, email, month, number, range, search, tel, time, url, week, etc.

Page 23: JavaScript para Graficos y Visualizacion de Datos

Rendering

WebGL / PhiloGL  //Create application  PhiloGL('canvasId', {    program: {      from: 'uris',      vs: 'shader.vs.glsl',      fs: 'shader.fs.glsl'    },    camera: {      position: {        x: 0, y: 0, z: -50      }    },    textures: {      src: ['arroway.jpg', 'earth.jpg']    },    events: {      onDragMove: function(e) {        //do things...      },      onMouseWheel: function(e) {        //do things...      }    },    onError: function() {      alert("There was an error creating the app.");    },    onLoad: function(app) {      /* Do things here */    }  });

Page 24: JavaScript para Graficos y Visualizacion de Datos

HTML5 APIs Puras+

Polyfills+

Lightweight Frameworks

> Monolithic Application Frameworks

ConclusiónEn mi opinión: