Wykresy w php

Niedawno znalazłam ciekawą bibliotekę do rysowania wykresów w php pchart. Wykresy są ładne wizulanie. Ponadto klasa posiada naprawdę dobrą dokumentację. Dane mogą być pobierane między innymi z zapytań SQL lub plików CSV. Dla zademonstrowania działania klasy ściągnęłam przykładowy plik csv ze strony ranking.pl na temat popularności poszczególnych przeglądarek.

Wykres kołowy

Najpierw wykonamy prosty wykres kołowy 3d. Później zajmiemy się importem z pliku csv. wykres kołowy w php
  // Załączamy odpowiednie pliki   
  include("pChart/pData.class");
  include("pChart/pChart.class");

  // Definiujemy dane 
  $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");

  // Inicjalizacja obiektu wykresu
  $Test = new pChart(380,200);

  // Rysujemy wykres
  $Test->setFontProperties("Fonts/tahoma.ttf",8);
  $Test->drawPieGraph($DataSet->GetData(),$DataSet->GetDataDescription(), 150, 90, 110, PIE_PERCENTAGE, TRUE, 50, 20, 5);
  $Test->drawPieLegend(310,15,$DataSet->GetData(),$DataSet->GetDataDescription(),250,250,250);
  $Test->Stroke();
Na początku pliku załączamy dwa pliki pData.class i pChart.class. Następnie definiujemy dane, które chcemy prezentować na wykresie. Funkcją AddPoint dodajemy punkty do serii1 i serii2 naszych danych. Potem funkcją AddAllSeries określamy, że wszystkie serie są rysowalne. Funkcja SetAbsciseLabelSerie określa, która z serii (czy w ogóle) służy do opisu danych. Kolejnym krokiem jest utworzenie obiektu wykresu. W konstruktorze przekazujemy jego wymiary. Funkcją setFontProperties wybieramy czcionkę i określamy jej wielkość. Do narysowania wykresu kołowego 3d służy funkcja drawPieGraph. Przyjmuje ona wiele parametrów w następującej kolejności: dane, dane opisów, pozycję x, pozycję y, promień, podpisy części wykresu (u nas procentowe),wzmocnienie brzegów wykresu (jeśli TRUE), przechylenie, wysokość 3d oraz tzw. spliceDistance - jeśli jest większy od 0 kawałki wykresu będą od siebie odsunięte. Pełny opis wszystkich parametrów w dokumentacji. Do określenia legendy wykresu służy funkcja drawPieLegend. Przyjmuje ona jako parametry: pozycję x i y legendy, dane, opisy danych oraz kolor tła (r,g,b) zdefiniowany przez trzy ostatnie parametry. Na końcu funkcją Stroke wyświetlamy wykres w przeglądarce. Demo działania skryptu.

Import danych z pliku csv (Excel)

Do przykładu dane na temat popularności przeglądarek pobrałam ze strony ranking.pl. Po otworzeniu pliku w Excelu da się zauważyć trochę nadmiarowych danych. Usuwamy je zostawiając tylko kolumny dotyczące nazwy przeglądarek i ilości osób je używających. Następnie ponownie zapisujemy plik jako CSV. Mój plik csv można pobrać stąd.
,"Firefox 3.x","46.992998"
,"MSIE 8.x","15.864262"
,"Chrome 9.x","11.880119"
,"MSIE 7.x","9.259036"
,"Opera 11.x","7.22752"
Pierwsze pytanie, które można sobie zadać to po co nam przecinki na początku każdej linijki? W moim pliku w Excelu pierwsza kolumna była pusta, druga z nazwami przeglądarek itd. Zatem przy zapisie pliku csv Excel zapisał tą pierwszą kolumnę jako pustą. Przejdźmy teraz do importu danych i rysowania wykresu kołowego.Najpierw includujemy dwa pliki biblioteki (tak jak w poprzednim przykładzie).
include("pChart/pData.class");
include("pChart/pChart.class");
Następnie definiujemy dane
$DataSet = new pData;
// Import danych z pliku CSV
$DataSet->ImportFromCSV("gemiusRanking.csv",",",array(1,2));
W powyższym kodzie za pomocą funkcji ImportFromCSV importujemy dane z pliku csv o nazwie gemiusRanking.csv, w którym separatorem jest przecinek (drugi parametr) kolumnę drugą i trzecią (trzeci parametr array(1,2) - numeracja od zera). Teraz zajmiemy się przekształacaniem danych z pliku csv.
$serie1 = array();//tablica na serię pierwszą
$serie2 = array();//tablica na serię drugą
$super_dane = array();//tablica na ostateczne dane
$dane = $DataSet->GetData();
foreach($dane as $key => $val)
{
	$serie2[] = floatval(str_replace('"','',$dane[$key]['Serie2']));
	$serie1[] = $dane[$key]['Serie1'];
	$super_dane[$key]['Serie1'] = $dane[$key]['Serie1'];
	$super_dane[$key]['Serie2'] = floatval(str_replace('"','',$dane[$key]['Serie2']));
}
Przygotowujemy sobie trzy tablice na odpowiednie dane. Do zmiennej $dane zapisujemy dane pobrane z naszego pliku csv. Najważniejszą częścią jest tu pętla foreach. Do tablicy $serie1 zapisujemy dane dotyczące nazw przeglądarek czyli serii Serie1 z pliku csv. W tablicy $serie2 natomiast Serie2 z pliku csv, tyle że znaki cudzysłowu są zamieniane na puste znaki, a potem całość zamieniana na liczbę typu float. Tablica $super_dane zawiera tak naprawdę zbiorcze dane na temat obydwu serii. Dla lepszego zrozumienia idei można przyjrzeć się strukturze najpierw tablicy $dane, a potem $super_dane. Można to zrobić np. funkcją print_r lub var_dump.
print_r($dane);
var_dump($dane);
Następnie określamy nasze tablice odpowiednio seriami 1 i 2. Ponadto definiujemy, że pierwsza seria będzie służyła jako opisująca dane.
$DataSet->AddPoint($serie1,"Serie1");
$DataSet->AddPoint($serie2,"Serie2");
$DataSet->AddAllSeries();
$DataSet->SetAbsciseLabelSerie("Serie1");
Ostatecznie rysujemy wykres tak jak w porzednim przykładzie. Jedyną różnicą jest to, że tym razem jako dane przekazujemy stworzoną wcześniej tablicę $super_dane.
// Inicjalizacja obiektu wykresu
$Test = new pChart(380,200);
// Rysujemy wykres
$Test->setFontProperties("Fonts/tahoma.ttf",8);
$Test->drawPieGraph($super_dane,$DataSet->GetDataDescription(), 150, 90, 110, PIE_PERCENTAGE, TRUE, 50, 20, 5);
$Test->drawPieLegend(290,15,$super_dane,$DataSet->GetDataDescription(),250,250,250);
$Test->Stroke();
Efekt działania skryptu.