La dataviz – sans lib – Une visualisation de données c'est quoi ?



La dataviz – sans lib – Une visualisation de données c'est quoi ?

0 0


html5paris-201403

Mes slides pour le meetup HTML5-Paris de Mars 2014

On Github jacomyal / html5paris-201403

La dataviz

sans lib

par Alexis Jacomy / @jacomyal ingénieur JavaScript frontend @ Sciences-Po médialab

Une visualisation de données c'est quoi ?

Pour le designer

Une bonne connaissance du domaine Des données intéressantes Une histoire à raconter Un bon design

Pour le développeur

Des maths Du dessin

Pourquoi ne pas utiliser les outils existants

“JavaScript est un langage exigeant faussement facile qui nécessite d’aimer le bricolage, l’artisanat.“

@olivierpenhoat (source)

Et aussi

Pour mieux comprendre comment fonctionnent les outils Quand aucun outil existant ne correspond vraiment Pour avoir plus de contrôle sur l'application

Qu'est-ce qu'il reste?

L'API de dessin d'ActionScript 3

(pour l'exemple, bien sûr)

Les features

Une arborescence (la classe DisplayObjectContainer) Du dessin matriciel (la classe BitmapData) Du dessin vectoriel (la classe Graphics) La classe Sprite qui fait un peu tout ça

en pratique

on met des Sprites partout

Un exemple de code AS3

// Créer et afficher un sprite:
var sprite:Sprite = new Sprite();
parentSprite.addChild(sprite);

// Dessiner sur le sprite:
sprite.graphics.beginFill(0x666666);
sprite.graphics.drawCircle(100, 100, 50);
sprite.graphics.endFill();

// Tracer le sprite sur une Bitmap:
var bitmapData:BitmapData = new BitmapData(200, 200, true, 0x0);
bitmapData.draw(sprite);
var bitmap:Bitmap = new Bitmap(bitmapData);

// Remplacer le rendu par la Bitmap:
parentSprite.removeChild(sprite);
parentSprite.addChild(bitmap);

Au final

L'arbre permet de bien stucturer la scène La gestion du vectoriel facilite l'interactivité On peut cacher des éléments pour gagner en perfs Et tout ça grâce à une API assez simple et unifiée

Canvas

C'est quoi?

Une balise HTML Une API JavaScript La technologie HTML5 dédiée au dessin matriciel

À quoi ça sert?

L'API JavaScript permet de dessiner sur le canvas On peut aussi modifier directement la matrice L'état du canvas n'est stocké que dans sa matrice

Un exemple d'utilisation de Canvas

// Récupérer le contexte du canvas:
var canvas = document.getElementById('myCanvas'),
    context = canvas.getContext('2d');

// Dessiner sur le canvas:
context.fillStyle = '#666666';
for (var i = 0; i < 10000; i++)
  context.fillRect(
    Math.floor(Math.random() * canvas.width),
    Math.floor(Math.random() * canvas.height),
    1,
    1
  );
jsfiddle

En pratique

On retrace tout à la moindre modification On cache avec des ImageData ce qui est coûteux On observe nous même la souris pour gérer l'interactivité

C'est bien

Pour afficher beaucoup d'éléments Pour bidouiller le rendu au pixel

C'est mal

Pour le rendu des textes Pour tout ce qui est interactif Lorsque la surface d'affichage est grande

SVG

C'est quoi?

Un format XML pour décrire des dessins vectoriels La technologie pour faire du dessin vectoriel sur le Web

À quoi ça sert?

Ça permet de tracer des formes vectorielles Ça fonctionne comme le DOM Le SVG a sa propre arborescence

Un exemple d'utilisation de SVG

<svg version="1.1"
     xmlns="http://www.w3.org/2000/svg"
     width="400" height="300">
  <circle id="myCircle" cx="100" cy="100" r="50" />
</svg>
// Récupérer le cercle SVG:
var circle = document.getElementById('myCircle');

// Déplacer le cercle:
circle.setAttribute('cx', 50);
circle.setAttribute('cy', 50);
jsfiddle

En pratique

On créé d'abord des éléments, qu'on modifie ensuite On gère tout comme du DOM (CSS, events, etc...)

C'est bien

Pour manipuler des contenus vectoriels externes Pour créer des applis très interactives

C'est mal

Pour afficher un grand nombre d'éléments

DOM / CSS3

C'est quoi?

CSS3 permet d'afficher des triangles, des rectangles, des ronds... Beaucoup de graphiques sont traçables simplement grâce à CSS3

Mais pourquoi ne pas utiliser SVG???

Le navigateur est optimisé pour le rendu du DOM C'est la solution la plus portable

Un cas d'usage

#barchart {
  width: 100px;
  height: 100px;
  position: relative;
}

.bar {
  bottom: 0;
  width: 10px;
  position: absolute;
  background: #666666;
}
// Les données et le container:
var data = [12, 3, 189, 134, 56],
    barchart = document.getElementById('barchart'),
    width = barchart.offsetWidth,
    height = barchart.offsetHeight,
    barWidth = Math.floor(width / data.length) - 1;

// On trouve le maximum:
var max = Math.max.apply(Math, data);

// On trace le graphique:
data.forEach(function(value, i) {
  var bar = document.createElement('DIV');
  barchart.appendChild(bar);

  bar.setAttribute('class', 'bar');
  bar.style.width = barWidth + 'px';
  bar.style.left = (i * (barWidth + 1)) + 'px';
  bar.style.top = (width - value * width / max) + 'px';
});
jsfiddle

En pratique

Comme pour SVG: on garde des références sur les éléments Parfait tant qu'il n'y a pas de courbes de Bézier

C'est bien

Car c'est très portable Car on bénéficie des transitions CSS, etc...

C'est mal

Pour afficher un très grand nombre d'éléments Parce que ça ne marche pas partout

Conclusion

Comment choisir

Si c'est possible, utiliser le DOM + CSS3 S'il y a beaucoup d'éléments, utiliser Canvas S'il y a du mouse-over et des courbes, utiliser SVG

Il est pratiquement toujours possible de faire mieux en combinant ces différentes solutions qu'avec les bibliothèques existantes

même si ça demande un investissement certain.

Crédits:

Présentation réalisée avec reveal.js Photo bricolage par Geoffrey Dorne (licence)

Quelques liens:

"Data Visualization with JavaScript without D3" Le très bon benchmark de TheManInBlue Un autre benchmark avec des particules JS1K (pour voir la puissance de Canvas)

Merci beaucoup!

http://jacomyal.github.io/html5paris-201403