J’ai travaillé récemment sur une solution pour générer des graphiques efficacement, tout en aillant le meilleur rendu possible, et ce pour des graphiques devant utiliser beaucoup de valeurs (de l’ordre de 5000 pour un graphique).
Je regroupe ici les résultats de mon étude, en espérant faire un petit état des lieux des différentes bibliothèques de génération de graphiques existantes, en tentant des les comparer. Volontairement, je ne désigne pas de meilleure bibliothèque, puisque cela dépends fortement du besoin qui l’accompagne.
J’ai tenté de faire un tour des bibliothèques qui me semblaient intéressantes, si toutefois vous connaissez une bibliothèque qui aurait sa place ici, je me ferais un plaisir de l’ajouter au comparatif.
Table des matières
Critères de comparaison
Ce comparatif se base sur les critères suivants:
- configuration (degré et facilité)
- Facilité d’ajout de nouveaux types de graphiques
- Qualité du code / maintenabilité
- les bibliothèques doivent êtres orienté objet
- générer les graphiques « coté» serveur (pas d’application flash ou javascript donc)
- être encore maintenue par ses auteurs
Solutions existantes et descriptions
pChart
Descriptif
pChart est une bibliothèque php qui comporte 3 classes:
- pChart qui est en charge de construire les graphiques. Cette classe est fournie avec 2 types de methodes: celles qui permettent de créer directement des graphiques de haut niveau, et celles de bas niveau qui permettent de tracer les lignes, ellipses etc.
- pData est en charge de la gestion des données. Elle fournit un certain nombre de méthodes qui permettent la manipulation de données pour les graphiques.
- Un système de cache: pCache
Avantages
pChart fournit des graphiques de qualité, et une grande abstraction vis à vis des méthodes de bas niveau qu’elle offre. Par exemple, les méthodes fournies pour générer un graphique de type Pie sont parlantes. De plus, une bonne séparation des couches est faite: pData, pChart et pCache on chacun leur rôle et s’y tiennent.
Inconvénients
pChart n’est pas forcement pensé pour être étendu de la meilleure manière. Ainsi, pour ajouter de fonctionnalités de bas niveau par exemple, tel le changement de format du fichier de sortie, il faut réécrire les méthodes de la classe pChart afin qu’elles supportent ce nouveau format (ie. Il n’existe pas de système de « driver» ). Aussi, le code en lui même n’est pas beaucoup commenté, ce qui constitue un frein à la compréhension de celui ci. Par defaut, pChart ne gère pas le SVG.
Exemple
$DataSet = new pData();
$DataSet->AddPoint(array(10,2,3,5,3),'Serie1');
$DataSet->AddPoint(array('Jan','Feb','Mar','Apr','May'),'Serie2');
$DataSet->AddAllSeries();
$DataSet->SetAbsciseLabelSerie('Serie2');
// Initialise the graph
$Test = new pChart(300,200);
$Test->drawFilledRoundedRectangle(7,7,293,193,5,240,240,240);
$Test->drawRoundedRectangle(5,5,295,195,5,230,230,230);
// Draw the pie chart
$Test->setFontProperties('Fonts/tahoma.ttf',8);
$Test->drawFlatPieGraph($DataSet->GetData(),$DataSet->GetDataDescription(),120,100,60,PIE_PERCENTAGE,10);
$Test->drawPieLegend(230,15,$DataSet->GetData(),$DataSet->GetDataDescription(),250,250,250);
$Test->Render('example13.png');

phPlot
Descriptif
phPlot est une bibliothèque qui comporte une seule classe en charge de la génération des graphiques. Cette classe interagit avec l’extension php GD pour construire des graphiques. Les méthodes de cette classe sont là aussi séparés en méthode de bas et haut niveau.
Avantages
La bibliothèque tiens dans une seule classe, ce qui peut s’avérer pratique, une documentation exhaustive est fournie sur internet
Inconvénients
Étant basée sur GD pour la génération des graphiques, il est semble assez difficile de rajouter un format de sortie facilement: la solution n’est pas pensée pour être extensible à ce niveau là. La classe en question n’est pas facile à étendre ou modifier. De plus les graphiques rendus ne sont pas très esthétiques
Exemple
$data = array(
array('Jan',10),
array('Feb', 2),
array('Mar', 3),
array('Apr', 5),
array('May', 3)
);
$plot->SetPlotType('pie');
$plot->SetDataType('text-data-single');
$plot->SetDataValues($data);
foreach ($data as $row)
$plot->SetLegend(implode(': ', $row));
$plot->DrawGraph();

ezComponents: Graph
Descriptif
Les ezComponents sont des composants originellement utilisés pour la plate forme de publication ezPublish, mais visant dès le début à ne pas être dépendant de cette plate forme de publication. Les ezComponents forment à eux seuls un ensemble de briques logicielles prêtes à l’usage, un peu comme peut l’être le Zend Framework.
Avantages
Cette bibliothèque, ainsi que la totalité des ezComponents, vise à être utilisée sur des sites importants. Pour cette raison, un support existe sur ces solutions, et les composants seront probablement maintenus durant une période importante. L’ensemble des ezComponents est fourni avec une documentation très complète, des exemples, des tests unitaires, et un diagramme de classe (UML), qui indique que le code est réellement pensé orienté objet. Chaque classe à alors une utilisation bien précise, l’application étant réellement bien découplée. Cette bibliothèque est également fournie avec un support natif du SVG, grâce à un système de plugin de sortie. Par défaut, le système est prévu pour être extensible; ainsi, pour ajouter un nouveau type de graphique par exemple, l’utilisation du système d’héritage permet de gagner du temps. La configuration peut être très poussée en restant lisible.
Inconvénients
Tous les ezComponents ont une dépendance vis à vis de la classe ezBase. De plus, utiliser ce composant induit le chargement d’un grand nombre de classes, et donc de fichiers. Par défaut, ce composant n’as pas de système de cache. Il en existe par contre un dans les ezComponents. Etre complètement orienté objet peut aussi s’avérer être un inconvénient: une bibliothèque graphique peut être amenée à afficher un nombre important de valeurs. Cela signifie dans ce cas là, passer dans un nombre aussi important de méthodes et le temps de rendu peut s’avérer réellement long (voir la section benchmarks à la fin de cet article)
Exemple
$graph = new ezcGraphPieChart();
// Add the data and hilight norwegian data set
$graph->data['months'] = new ezcGraphArrayDataSet( array(
'Jan' => 10,
'Feb' => 2,
'Mar' => 3,
'Apr' => 5,
'May' => 3
));
// Modify pie chart label to only show amount and percent
$graph->options->label = '%3$.0f%%';
$graph->options->font->maxFontSize = 10 ;
// legend
$graph->legend->landscapeSize = .3;
// Use 2d renderer, and beautify it
$graph->renderer = new ezcGraphRenderer2d();
$graph->renderer->options->dataBorder = false;
$graph->renderer->options->pieChartGleam = .3;
$graph->renderer->options->pieChartGleamColor = '#FFFFFF';
$graph->renderer->options->pieChartGleamBorder = 1;
$graph->renderer->options->showSymbol = false;
// set colors
$graph->palette = new ezcGraphPaletteEz();
// Output the graph with std SVG driver
$graph->render( 300, 200, 'ezGraph.svg' );
Benchmarks
Maintenant ces différentes solutions sont présentées, il peut être intéressant de les comparer sur le plan rapidité. Voici un Petit comparatif au niveau rapidité. Si vous êtes curieux, vous pouvez télécharger les fichier source du benchmark.
Les différentes valeurs utilisées sont les suivantes: (width, height, values)
Le fichier _realData.php contient retourne un tableau de quelques 1104 valeurs continues. Il se trouve aussi dans les sources disponibles plus haut.
Voici le résultat du test:
| simple | medium | hard | real | |
| ezc | 0.4 | 0.38 | 4.63 | 10 |
| pchart | 0.8 | 0.66 | 2.36 | 1.91 |
| phplot | 0.08 | 0.05 | 0.32 | 0.33 |
| artichow | 0.23 | 0.34 | 4.1 | 6.46 |
Tableau comparatif
| qualité du code | découplage | extensibilité | config (degré) | config (facilité) | qualité des graphs | temps de rendu | support du SVG | |
| pChart | ![]() |
![]() |
![]() |
![]() ![]() |
![]() ![]() |
![]() ![]() ![]() |
![]() |
![]() |
| PHPlot | ![]() |
![]() |
![]() |
![]() |
![]() ![]() |
![]() |
![]() ![]() |
![]() |
| ezComponents | ![]() ![]() ![]() |
![]() ![]() ![]() |
![]() ![]() ![]() |
![]() ![]() |
![]() ![]() |
![]() ![]() |
![]() ![]() ![]() |
![]() |




Intéressant comparatif ! Il manque juste le test de l’API Google Analytics
Adrien
5 déc 09 at 10:18
Tu ne dis pas quelle lib tu as utilisé dans ton projet ;o)
Kalamar
11 juin 10 at 5:44
@Kalamar: « je ne désigne pas de meilleure bibliothèque, puisque cela dépends fortement du besoin qui l’accompagne.»
En l’occurence, j’avais fini par utiliser pChart pour ce cas précis
Alexis Metaireau
11 juin 10 at 5:53