D3.js : un pas de plus vers la data visualisation sur le web

D3.js est une librarie graphique écrite en Javascript crée par Mike Bostock déjà auteur de la librarie Protovis. D3.js est en fait une évolution de protovis, son nom proviens de l’abréviation de Data-Driven Document.

Pourquoi D3.js au lieu de Protovis

D’après ce que j’ai compris, Mike Bostock a décidé d’arrêter le développement de Protovis pour commencer celui de d3.js dans le but d’offrir à tous une librarie puissante pour la visualisation basé sur des standards du W3C (HTML, SVG et CSS) au lieu de s’attacher à un framework propriétaire. D3.js est clairement axé Web et visualisation de données, ainsi il est très simple de manipuler des données via le DOM (Document Object Model).

Quelques exemples avec D3.js

Network Force Directed graph

New York Times

Cluster Layout

Cubism.js

Tag Cloud

Choropleth

Circle Packing

Conclusion

Comme vous pouvez le voir d3.js est la source de beaucoup de type de représentations graphiques différentes mais aussi à la base de quelques libraries / plugins. Ainsi se termine la présentation (rapide je l’avoue) de la librarie d3.js. A suivre un tutoriel pour mettre en place son premier graphique avec la librarie.

Comment mettre des données à l’échelle avec un calcul simple

Comment mettre des données à l’échelle avec un calcul simple

Je suis actuellement en train de construire un plugin pour WordPress. Ce plugin a pour but d’afficher un tag cloud basé sur une librarie JS (d3.js) qui permet un rendu différent et amélioré du tag cloud de base de WordPress. Des fois certaines contraintes nous obligent à travailler à l’echelle (plus grand ou plus petit) et donc de normaliser un set de données.

L’exemple par le tag cloud (nuage de mots-clés)

Pour un tag cloud le principe consiste à compter le nombre de fois qu’un mot apparaît dans le blog (Ce nombre peut-être de grandeur très variable, par exemple un mot peu apparaître 10 fois comme un autre pourrait apparaître 1000 fois). Ensuite il faut afficher la liste des mots les plus trouvés et les faire apparaître avec une taille de police en fonction de leur nombre d’apparition dans le blog.

Le problème : Pourquoi mettre à l’echelle

Une police est quelque chose qui ne peut pas être modulé dans de grands écarts. Une police de caractère à 1000px par exemple risque de poser un petit problème de design. Et de même un mot qui n’aurait pas une grande fréquence dans un blog ne pourra pas se voir affubler une police à 2px. Vous voyez le problème.

La solution : Comment mettre à l’echelle

La solution à ce problème est d’appliquer une normalisation à votre échelle de donnée. Le principe est de « mapper » chaque valeur à sa valeur à l’échelle. Voici le calcul/code à utiliser :

//Dataset pour le tag cloud
$data = array("font" => 327, "design" => 1234, "jquery" => 123, "php" => 231, "visualisation" => 756, "html5" => 465, "wordpress" => 899, "javascript" => 534);
// Fixer un minimun et un maximum pour la font (en pixel)
$fontMin = 12;
$fontMax = 32;
//Trouver le minimum et le maximum du dataset
$datasetMin = min($data);
$datasetMax = max($data);
// Calculer les écarts
$ecartDataset  = $datasetMax - $datasetMin;
$ecartFont     = $fontMax - $fontMin;
$seuil         = $ecartFont / $ecartDataset;
// Boucle sur chaque mot 
$dataNormalise = "";
foreach($data as $texte => $freq){
$fontSize = $fontMin + ($freq - $datasetMin) * $seuil;
$dataNormalise[$texte] = $fontSize;
}
var_dump($dataNormalise);

Résultat du array normalisé entre 12 et 32 :

array(8) {
["font"]=>
float(15.6723672367)
["design"]=>
float(32)
["jquery"]=>
float(12)
["php"]=>
float(13.9441944194)
["visualisation"]=>
float(23.395139514)
["html5"]=>
float(18.1566156616)
["wordpress"]=>
float(25.9693969397)
["javascript"]=>
float(19.398739874)
}

Conlusion

Il s’agit donc de mapper chaque valeur pour obtenir un nombre entre le minimum et le maximum voulu. Personnellement j’utilise cette technique / formule pour travailler avec des libraries graphiques comme protovis ou d3.js. C’est assurément à garder dans sa boite à outil ! A noté que le code est ici en PHP mais ceci peu très bien se faire en n’importe quel autre language.

Comment charger des données via Ajax avec Highcharts

Comment charger des données via Ajax avec Highcharts

J’utilise de plus en plus Highcharts à mon travail et je l’apprécie de plus en plus. Voici un tutoriel qui va vous apprendre à utiliser Highcharts avec ajax. Je vais illustrer ce tutoriel avec un dataset plutôt d’actualité : le prix de l’essence mis en comparaison au prix du pétrole.

Que va t’on apprendre dans ce tutoriel sur Highcharts ?

  • Comment charger des données via AJAX dans Highcharts
  • Comment ajouter un 2ème axe Y à un graphique pour comparer des valeurs d’ordre différent.
  • Comment travailler les labels des axes X et Y
  • Comment insérer plusieurs séries de données dans un graph

Charger des données via AJAX dans Highcharts

Pour charger des données via AJAX dans Highcharts, il s’agit de construire un objet javascript contenant les options qui vont servir à générer le graph, il suffit donc de déclarer un objet et de lui attribuer les options de bases :

var chart;
var colors = ["#98DF8A", "#FFBB78", "#8C564B"];
var options = {};
options.chart = {
renderTo: 'essenceChart',
width: 588,
height: 400,
marginTop: 70,
marginLeft: 100,
marginRight: 100,
type:'line'
};
options.credits = {
enabled: false
};
options.colors = colors;
options.title = {
text: "Évolution du prix de l'essence et du baryl de pétrole de 1995 à 2012",
margin: 10
};
options.tooltip = {
formatter: function() {
return "Dépense : " + number_format(this.y,3,',',' ') + "€" ;
}
};

Définition des variables

On créer la variable « chart » qui va servir à instancier le graphique plus tard.
On créer la array « colors » pour définir ses couleurs personnelles et ainsi overwriter les couleurs par défaut.
On créer l’objet « options » qui va contenir tous les paramètres définissant le graphique.

Définition des paramètres du graph

« options.chart » représente les paramètres généraux du graph. On va pouvoir renseigner le type, la taille, les margins, le container …
« options.credits » permet de supprimer le lien vers Highcharts en bas à droite
« options.colors » définit les couleurs à utiliser (couleur par défaut si non renseigné)
« options.title » permet de donner un titre au graphique
« options.tooltip » permet de formater l’affichage du tooltip (étiquette au passage de la souris)

Créer 2 axes Y dans Highcharts

Le but de créer de axe Y est de pouvoir comparer 2 valeurs d’ordre différent. Dans notre exemple, on va comparer le prix de l’essence en euro avec une valeur autour de 1€ et le prix de baryl de pétrole en $ autour de 50$. Vous voyez où je veux en venir ?

options.yAxis = [
{
title : {
text: "Gazoil & Super 95 (€)"
},
labels: {
formatter: function() {
return this.value +' €';
},
style: {
color: '#000'
}
}
},{
title: {
text: "Baryl brent ($US)"
},
labels: {
formatter: function() {
return this.value +' $';
},
style: {
color: '#8C564B'
}
},
opposite: true
}];

Je pense que la définition de l’objet parle d’elle même, en gros on créer un array contenant deux objets définissant chaque axe. La beauté de Highcharts réside dans le fait qu’elle va s’occuper de mettre à l’échelle les axes en fonction des valeurs fournis, donc rien à faire de ce côté là.

Mettre en place l’axe des X avec une rotation des labels

options.xAxis = {
categories: [],
labels: {
rotation: -45,
y: 20
}
};

Encore une fois c’est assez parlant, vous pouvez jouer avec la valeur de rotation du label pour arriver au résultat souhaité.

Insérer plusieurs dataset dans un graphique

Cela se traduit par insérer plusieurs courbe dans notre graphique avec pour chaque courbe ses valeurs propres.

options.series = [
{
name: 'Gazoil (€)',
data: []
},
{
name: 'Super 95 (€)',
data: []
},
{
name: 'Baryl de pétrole ($US)',
yAxis: 1,
data: []
}
]

Ici nous créons donc un array de series, chaque element de cet array est un objet définissant le nom et le array qui recevra les données via ajax.

Préparation du fichier HTML qui va recevoir le graphique

<!DOCTYPE HTML>
<html>
<head>
<title>Undisconnected - Prix essence illustré avec Highcharts</title>
<meta http-equiv=&amp;quot;Content-Type&amp;quot; content=&amp;quot;text/html; charset=UTF-8&amp;quot; />
<!-- Libs -->
<script type=&amp;#039;text/javascript&amp;#039; src=&amp;#039;https://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js&amp;#039;></script>
<script type=&amp;#039;text/javascript&amp;#039; src=&amp;#039;../js/Highcharts-2.1.9/js/highcharts.js&amp;#039;></script>
<script type=&amp;#039;text/javascript&amp;#039; src=&amp;#039;../js/utils.js&amp;#039;></script>
<script type=&amp;#039;text/javascript&amp;#039; src=&amp;#039;main.js&amp;#039;></script>
</head>
<body style=&amp;#039;margin:0px;&amp;#039;>
<div class=&amp;#039;wrapper&amp;#039;>
<div id=&amp;#039;essenceChart&amp;#039;></div>
</div>
</body>
</html>

Chargement des données dans Highchart

Pour charger les données en ajax, j’utilise ici la methode get de Jquery pour aller lire le fichier de donnees JSON. Il suffit ensuite de manipuler les données dans votre fonction de callback pour aller nourrir les array de data de chacune de vos series. On en profite pour créer les categories (les labels) qui apparaîtrons sur l’axe des X.

$.getJSON('https://undisconnected.com/sandbox/highcharts-essence/prix-essence.json', function(essence) {
$.each(essence, function(i,e){
var theDate = new Date(parseInt(i),0,1);
options.series[0].data.push(e.gazoil);
options.series[1].data.push(e.super95);
options.series[2].data.push(e.brent);
options.xAxis.categories.push(i);
})
console.log(options.categories)
chart = new Highcharts.Chart(options);
});

Le resultat

Conclusion

J’espère que vous aurez pris plaisir à suivre ce tutoriel. Highcharts permet de customiser vos graphiques en javascript de manière simple, efficace et rapide. Comme vous le voyez, faire ce graphique n’est pas une tâche ultra complexe et pourtant le résultat obtenu est vraiment interessant.

Ressources :

Migrez de nom de domaine avec WordPress en 4 étapes faciles

Changer de nom de domaine dans WordPress se trouve être utile généralement lorsqu’on migre d’un environnement de développement à l’environnement de production. Par exemple vous avez construit votre blog en local sur votre ordinateur à l’aide de MAMP ou WAMP ou Easy PHP … et vous souhaitez le mettre en ligne sur votre serveur de production.

Réaliser cette migration se fait en 4 étapes faciles :

Faire une copie de vos fichiers WordPress

Rien de plus simple, avec votre logiciel FTP, vous envoyez les fichiers sur votre serveur de production. (Généralement à la racine du serveur).

Faire un export de votre base de données

Allez dans PhpMyAdmin de votre serveur de développement et exportez la base de données. (SQL ou ZIP au choix). Allez ensuite sur PhpMyAdmin de votre serveur de production et importez les données via le fichier que vous venez de créer.

Modification sur la base de données

La base de données WordPress contient dans certaines tables le nom de domaine de votre blog. Pour changer ces informations vous pouvez exécuter votre ces requête SQL suivante dans PphpMyAdmin :

UPDATE wp_options
SET option_value = replace(option_value, 'http://www.dev-site.com', 'http://www.production-site.com')
WHERE option_name = 'home'
OR option_name = 'siteurl';
UPDATE wp_posts
SET guid = replace(guid, 'http://www.dev-site.com','http://www.production-site.com');
UPDATE wp_posts
SET post_content = replace(post_content, 'http://www.dev-site.com', 'http://www.production-site.com');
UPDATE wp_postmeta
SET meta_value = REPLACE (meta_value, 'http://www.ancien-site.com','http://www.nouveau-site.com');

Changez « http://www.dev-site.com » par l’url de votre environnement de développement et « http://www.production-site.com » par votre nom de domaine de production. Attention le préfixe des tables « wp_ » pourrait être différent pour vous. Attention aux « www » aussi. Si la première requête ne donne aucun résultat, essayez sans les www.

Modifier la config de WordPress

Dans votre logiciel FTP éditez le fichier wp_config.php et remplacez les informations de bases de données par celles de production :

/** Nom de la base de données de WordPress. */
define('DB_NAME', 'votre_nom_de_bdd');
/** Utilisateur de la base de données MySQL. */
define('DB_USER', 'votre_utilisateur_de_bdd');
/** Mot de passe de la base de données MySQL. */
define('DB_PASSWORD', 'votre_mdp_de_bdd');
/** Adresse de l'hébergement MySQL. */
define('DB_HOST', 'localhost');

Conclusion

J’ai crée cette procédure pour mes besoins personnels, j’espère qu’elle vous sera utile à vous aussi, c’est pour ça que je la partage ici. Pour une migration réussie pensez à :

  • avoir au moins 1 heure devant (en cas de problème)
  • être concentré (couper le téléphone et les distractions).
  • Tester une fois la migration finie (toutes les pages, les posts si possibles, les formulaires …)

Bug width 100% dans webkit mobile

Voici un article qui va être assez court mais qui je l’espère vous aidera à résoudre un bug un peu spécial sous Safari mobile (Ipad, Pod Touch et Iphone) et plus généralement webkit mobile. Dans un des contrats web que j’ai fais récemment j’ai été confronté à un problème de CSS apparemment référencé sous Safari IOS. Safari IOS est basé sur le moteur de rendu de pages Web open source Webkit. Webkit est utilisé par de nombreux navigateur web mobile comme Android, Nokia, Blackberry, Iphone, Ipad …

Explication du bug CSS

Dans le header de ce site j’ai un css qui permet à une div avec un width de 100% d’avoir un background positionné à 50% sur l’axe des x comme suit :

#branding {
width:100%;
height:392px;
background-position: 50% 50%;
background-repeat: no-repeat;
}

Dans tous les navigateurs (Testé dans Chrome, Firefox, Safari, IE 8,9) ce CSS fonctionne parfaitement et permet d’avoir une image en background qui s’affichera toujours à 100% de la taille du navigateur. Il faut bien évidemment une image assez grande (1600px minimum) pour que l’effet soit réussit. MAIS sous Safari mobile, seule une partie du background s’affiche. Cela provient du viewport (partie affiché à l’écran) qui est différent sur IOS. Voici un lien à lire pour comprendre le viewport.

Résolution du bug en utilisant viewport

J’ai donc réussit à résoudre ce bug en ajoutant une meta qui permet de fixer la largeur du viewport désiré dans webkit mobile. En fait pour simplifier j’ai utiliser la largeur maximale du content de mon site. Cela donne dans le head de votre HTML :

<meta name = "viewport" content = "width = 590">

Ce paramètre va permettre à Webkit de savoir la partie que vous souhaitez afficher à l’écran et va donc exécuter un « zoom » sur la largeur (width) que vous avez définie.

Conclusion

Je pense que je vais intégrer cela dans tous mes développements car cela permet de toute façon de fixer la façon dont vous souhaitez que Webkit affiche vos pages sur un navigateur basé sur webkit (la plupart maintenant) en plus de résoudre certains bug CSS.