Choix d'une bibliothèque

Comme le projet utilise déjà divers modules PEAR, j'ai choisi d'utiliser le composant Image_Graph. Quelques autres alternatives existent, comme Libchart ou GraPHPite. Image_Graph manque malheureusement de documentation, même si on trouve assez facilement des tutoriels et des exemples.

Générer des couleurs

Ayant à créer de jolies courbes, je me suis trouvé confronté au problème de leur affecter à chacune une couleur différente, sans savoir au préalable de combien de couleurs j'aurai besoin. Plutôt que de créer un tableau contenant suffisament de nuances pour être tranquille, j'ai essayé de créer les couleurs dynamiquement. Je me suis intéressé à l'espace colorimétrique HSV qui définit chaque couleur en fonction de 3 paramètres :

  • sa teinte (hue) (rouge, vert, bleu...). Les teintes sont positionnées sur un spectre, une roue de couleur, et leur position est mesurée par un angle, de 0 à 360°, avec par convention le rouge à 0°. On aura par exemple le jaune à 60°, le vert à 120°, le cyan à 180°, le bleu à 240 et le magenta à 300°.
  • sa saturation indique la pureté de la couleur, le pourcentage respectif de blanc et de couleur. Ainsi une saturation de 100% signifie que la couleur est pure, ne contient pas de blanc.
  • sa brillance, l'intensité lumineuse, de 0 (noir) à 100%.

Pour créer dynamiquement des couleurs, il suffit donc de choisir une saturation, une brillance et de faire varier la teinte de 0 à 360.

La bibliothèque Image_Color dont dépend Image_Graph prend en compte l'espace colorimétrique HSV et offre des fonctions de conversion entre des valeurs HSV et RGB. J'ai utilisé hsv2hex($hue, $saturation, $value) qui attend trois valeurs entre 0 et 256 et renvoie le code hexadécimal d'une couleur. Attention, elle ne peut apparemment pas être appelée statiquement.

Voici un petit bout de code pour assigner une couleur différente à chacune des valeurs d'un tableau:

$lColor = new Image_Color();
$colors=Array();
$sat=255;
$bright=255;
$hue=0;
$hue_increment=\(\(int\)256/count\($incident_types\)\)
foreach ($valeurs as $k=>$v)
{
  $valeurs[$k]['color'] = $lColor->hsv2hex($hue, $sat, $bright);
  $hue+=$hue_increment;
}

Vala. Bon, j'avoue que c'est très lourd par rapport à l'utilisation d'un tableau statique contenant une palette. Mais j'espère que ça pourra servir.