Il diagramma circolare descrive una ipotetica produzione italiana in quintali d'olio per l'anno anno 2006 secondo i valore della tabella seguente:
Produzione italiana quintali d'olio, anno 2006
Abruzzo Calabria Campania Lazio Puglia Sicilia Toscana Umbria Altri
204717 2080943 338591 248514 1914535 488027 171205 138602 209000
Al di fuori di ogni arco è scritto il nome abbreviato della regione e la sua percentuale di produzione.
Queste le variabili e funzione usate:
$Larghezza, larghezza dell'immagine, trattandosi di un'immagine quadrata l'altezza è identica.
$Raggio,raggio del diagramma circolare.
$Regioni, array con nomi delle regioni
$Valori, array() con valori numerici delle quantità prodotte.
$Totale, quantità totale prodotta.
$Colori, array() dei colori utilizzati nel diagramma circolare.
$ColoreIniziale, numero del colore dal quale inizia la serie colori da implementare.
$Nero, colore per effetto 3d al testo.
$Cx, centro X diagramma circolare riferito alle coordinate del piano cartesiano.
$Cy, centro Y diagramma circolare riferito alle coordinate del piano cartesiano.
$SL, spostamento Legenda Circolare rispetto al diagramma.
$InizioArco, valore in gradi inizio primo arco, zero corrisponde a ore 3.
Cambiare questo valore (espresso in gradi) per ruotare il diagramma circolare
$Font, tipo di carattere ttf per i testi del grafico.
$PosOriz e $PosVert, posizione avvio legenda testuale in basso
$FontDim, dimensione font.
$FontRotLC, rotazione font in legenda circolare
$FontRot , rotazione font NON di legenda circolare.
$Arco, dimensioni angolo/arco corrente.
$Percentuale, percentuale del valore corrente sul totale
$RadX, vertice arco corrente, posizione X sul piano cartesiano.
$RadY, vertice arco corrente, posizione Y sul piano cartesiano
IMG_ARC_PIE, costante della funzione
imagefilledarc()
Connette gli estremi degli archi con una linea curva.
L'area circoscritta (centro ed estremi degli archi) riempita del colore stabilito nella funzione.
function GeneraColori($Numero), genera una sequenza di colori diversi a partire da $Numero
<?php
function GeneraColori($Numero) {
$Num32exa = md5('color' . $Numero); // Restituisce come numero esadecimale di 32 cifre.
// preleva codici per colore, crea e restituisce array come r g b
return array(hexdec(substr($Num32exa, 0, 2)), hexdec(substr($Num32exa, 2, 2)), hexdec(substr($Num32exa, 4, 2)));
}
$Larghezza = 600; $Altezza = $Larghezza;
$Immagine =
imagecreate($Larghezza, $Altezza);
imagecolorallocate($Immagine, 254, 254, 233); // sfondo
$Raggio = 300;
$Regioni = array('Abruzzo','Calabria','Campania','Lazio','Puglia','Sicilia','Toscana','Umbria','Altri');
$Valori = array (204717, 2080943, 338591, 248514, 1914535, 488027,171205,138602,209000);
$Totale = array_sum($Valori); // totale quintali rappresentati
$Colori = array();
$ColoreIniziale = 18;
for($i=$ColoreIniziale; $i < ($ColoreIniziale+ count($Valori)); $i++)
{$ColoreRGB = GeneraColori($i , $ColoreIniziale+ count($Valori)); // genera colori
$Colori[] =
imagecolorallocate($Immagine, $ColoreRGB[0], $ColoreRGB[1], $ColoreRGB[2]);
}
$Nero =
imagecolorallocate($Immagine, 0, 0, 0); // colore per effetto 3d al testo
$Cx = $Larghezza/2; // centro x
$Cy = $Altezza/2 -60; // centro y
$SL = .70; // Spostamento Legenda Circolare
// valore in gradi inizio primo arco, zero corrisponde a ore 3
$InizioArco = 60;
$Font = "font/arial.ttf"; // Tipo di carattere per i testi nel grafico
$PosOriz = 0; $PosVert = 490; // Posizione avvio legenda testuale in basso
// font, dimensione e rotazione legende circolare e orizontale
$FontDim = 12; $FontRotLC = 5; $FontRot = 0;
// titolo del grafico
imagettftext ($Immagine, 18 , 0 , 50 , 22 , $Nero , $Font , "Produzione italiana quintali d'olio, anno 2006");
foreach($Valori as $index => $V ) { // scorre array $Valori e $Colori, disegnando gli archi
$Arco = number_format((360 * $V) / $Totale); // dimesioni angolo/arco corrente
$Percentuale = number_format(($V * 100) / $Totale, 2, '.', ''); // percentuale sul totale del valore corrente
imagefilledarc($Immagine,
$Cx, $Cy, // coordinate x,y del centro
$Raggio, $Raggio,
$InizioArco,
($InizioArco + $Arco), // fine arco
$Colori[$index], // colore corrente
IMG_ARC_PIE // Connette angoli, area circoscritta è riempita con $Colori[$index]
);
// *** calcola X,Y sul piano cartesaino dei vertici archi per legenda circolare ***
$VerticeArco = ($InizioArco + $Arco/2) + 90; // promo arco inizio ore 3
// seno e coseno in radianti
$sin = sin(deg2rad($VerticeArco)); $cos = cos(deg2rad($VerticeArco));
$RadX = round($cos*(0) - $sin*($Raggio * $SL * -1)); //Vertice arco corr., posizione X su piano cartesiano
$RadY = round($sin*(0) + $cos*($Raggio * $SL * -1)); //Vertice arco corr., posizione Y su piano cartesiano
// LEGENDE INIZIO //////////
imageline ($Immagine, $Cx, $Cy, $Cx + $RadX, $Cy + $RadY, $Colori[$index] );// segmento grafico/testo
// etichette intorno al grafico con nomi regione e percentuali
imagettftext ($Immagine, $FontDim , $FontRotLC , $Cx + $RadX - 14 , $Cy + $RadY+1 , $Nero , $Font , substr($Regioni[$index],0,3)." ".$Percentuale."%");
imagettftext ($Immagine, $FontDim , $FontRotLC , $Cx + $RadX - 15 , $Cy + $RadY , $Colori[$index] , $Font , substr($Regioni[$index],0,3)." ".$Percentuale."%");
// Posizioni progressive legenda testuale in bassa
imagettftext ($Immagine, $FontDim , $FontRot , 40 + $PosOriz +1 , $PosVert + $index *25 +1 , $Nero , $Font , $Regioni[$index]." q.li = ".$V);
imagettftext ($Immagine, $FontDim , $FontRot , 40 + $PosOriz , $PosVert + $index *25 , $Colori[$index] , $Font , $Regioni[$index]." q.li = ".$V);
if($index > 3){$PosOriz = 350; $PosVert = 364;};
// // LEGENDE FINE //////////
$InizioArco += $Arco; // inizio nuovo arco
}
header("Content-Type: image/png");
imagepng($Immagine,"NomeFile.png"); // salva
imagepng($Immagine); // al browser
imagedestroy($Immagine); // libera memoria
?>