Spesso capita di vedere un grafico dove è disegnata la merce che è misurata, un classico sono i barili di petrolio per un grafico sulla produzione o il consumo di greggio.
Il prossimo grafico rappresenta un ipotetico consumo di birra per 4 nazioni europee (tabella successiva).
Nazione Italia Francia Spagna Germania
Consumo 425 500 232 1000
La dimensione del consumo è mostrata dalla grandezza dei bicchieri ricolmi, grandezza proporzionale al valore attribuito di consumo.
Sotto ogni bicchiere la quantità di consumo e sotto un'immagine stilizzata della nazione.
Le immagini delle nazioni ed il boccale sono letti da disco.
In base ai valori del consumo e la distanza che dovranno avere fra loro i bicchieri, viene creata l'immagine che conterrà il grafico in scala 1/2.
Vendono poi disegnati gli assi x,y con la scala dei valori ed il titolo del grafico.
Con un loop sono analizzati i 4 valori, calcolate le dimensioni dei bicchieri e con
imagecopyresampled() incollato il bicchiere della dimensione e nel punto della nazione corrente.
Sempre nello stesso loop viene disegnato il valore numerico sul rispettivo bicchiere e sotto copiata l'immagine della nazione.
<?php
$Nazioni = array();// legge file immagini delle nazioni
$Nazioni[0] =
imagecreatefrompng("immagini/Italia.png");
$Nazioni[1] =
imagecreatefrompng("immagini/Francia.png");
$Nazioni[2] =
imagecreatefrompng("immagini/Spagna.png");
$Nazioni[3] =
imagecreatefrompng("immagini/Germania.png");
// legge file immagini bicchiere di birra
$BicchiereBirra =
imagecreatefrompng("immagini/BicchiereBirra.png");
$BBx =
imagesx($BicchiereBirra); $BBy =
imagesy($BicchiereBirra); // dimensioni boccale birra
$NazConsumo = array(425, 500, 232, 1000); // consumo per nazione
$Legenda = 80; // contiene le immagini delle nazioni
$SpazioAsseY = 50; // // spazio alla sinistra dell'asse Y
$ScalaGrafico = .5; // scala grafico 1/2
$Max = max($NazConsumo); // valore massimo di consumo/nazione
$SpazioFraBicchieri = 30;
// calcola le dimensioni necessarie per il grafico
$DimOrizzBicchieri = array();
$DimOrizzGrafico = 0;
for($z=0; $z<4;$z++){
// calcola dimensione boccale in larghezza moltiplicando l'altezza per rapporto aureo 0.618
$DimOrizzBicchieri[$z] = $NazConsumo[$z] * 0.618; // echo "<br>".$DimOrizzBicchieri[$z];
// somma spazio fra bicchieri più dimensione bicchiere in orizzontale per ogni nazione
// per determinare larghezza del grafico da creare
$DimOrizzGrafico = $DimOrizzGrafico + $DimOrizzBicchieri[$z] + $SpazioFraBicchieri;
}
// dimensioni del grafico
$Larghezza = $DimOrizzGrafico * $ScalaGrafico + $SpazioAsseY + $SpazioFraBicchieri*2;
$Altezza = $Max * $ScalaGrafico + $Legenda; // valore massimo più spazio legenda
$Immagine =
imagecreatetruecolor($Larghezza, $Altezza);//crea l'immagine che conterrà il grafico
// imposta trasparenza del fondo dell'immagine
imagealphablending($Immagine, false);// Spenge alpha blending
imagesavealpha($Immagine, true); // imposta il flag per salvare informazioni con canale Alpha
$CanaleAlpha =
imagecolorallocatealpha($Immagine, 0, 0, 0, 127);
imagefill($Immagine, 0, 0, $CanaleAlpha); // rende l'immagine completamente trasparente
$Nero =
imagecolorallocate($Immagine,0,0,0); // alloca colore nero per testo e assi x,y
// titolo del grafico
imagestring ($Immagine,5 , $Larghezza/5 , 40 , "Consumo Birra" , $Nero );
// disegna coordinate x,y
imageline($Immagine,0,$Altezza - $Legenda , $Larghezza , $Altezza - $Legenda ,$Nero);
imageline($Immagine,$SpazioAsseY, 0 , $SpazioAsseY , $Altezza ,$Nero);
// valori e linee x
for($z= 100; $z < 401; $z+=100){
imageline($Immagine, 0 ,($Altezza - $Legenda) - $z , $Larghezza , ($Altezza - $Legenda) - $z,$Nero);
imagestring ($Immagine,5 , 5 , $z , (($Altezza - $z) - $Legenda) *2 , $Nero );
}
// copia il bicchiere all'interno del grafico
// dimensionandolo in modo proporzionale al consumo della nazione
$PosizioneX = $SpazioAsseY + $SpazioFraBicchieri;
for($z=0; $z < 4; $z++){
$PosizioneY = $Altezza - ($Legenda + $NazConsumo[$z] * $ScalaGrafico);
imagecopyresampled($Immagine,$BicchiereBirra,
$PosizioneX, $PosizioneY , // x,y destinazione
0,0, // x,y sorgente
$DimOrizzBicchieri[$z] * $ScalaGrafico, $NazConsumo[$z] * $ScalaGrafico, // largh./alt. destinazione
$BBx,$BBy // larghezza e altezza sorgente
);
// copia immagine della nazione
$NazX = $PosizioneX + ($DimOrizzBicchieri[$z] * $ScalaGrafico *.25);
$NazY = $Altezza -($Legenda - 5);
imagecopyresampled($Immagine,$Nazioni[$z],
$NazX, $NazY, // x,y destinazione
0,0, // x,y sorgente
60, 60, // larghezza e altezza destinazione
60,60 // larghezza e altezza sorgente
);
// incrementa la posizione x per determinare il punto di copia del boccale successivo
$PosizioneX = $PosizioneX + $SpazioFraBicchieri + $DimOrizzBicchieri[$z]* $ScalaGrafico;
// testo del consumo disegnato sul boccale
imagestring($Immagine,5,$NazX,$NazY-$DimOrizzBicchieri[$z]*$ScalaGrafico,$NazConsumo[$z],$Nero );
}
imagepng($Immagine); // al browser
imagepng($Immagine,"es_103_Consumo_Birra.png"); // salva
imagedestroy($Immagine); // libera memoria
?>