Visualizzazione risultati 1 fino 14 di 14

Discussione: grafici con php

  1. #1
    gianlucaweb non è connesso Utente attivo
    Data registrazione
    01-01-2003
    Messaggi
    470

    Predefinito grafici con php

    Ciao
    Avrei intenzione di creare (se possibile) dei grafici con il php.
    Mi spiego meglio:
    Interrogando il db su un certo cliente che ha fatto degli acquisti io posso sapere
    quando ha speso in un mese (o frazione) o quante fatture sono state emesse e in che giorno, sempre per uno stesso cliente (in verità posso avere anche i dati globali, cioè che sono riferiti alle somme di tutti i movimenti).
    Vorrei fare in modo adesso di visualizzare i dati sotto forma di grafici, come quelli di excel (es: asse x tempo, asse y quantità o valori) avendo come punto di riferimento per il tempo il mese cioè il grafico completo del mese anche
    se sono stati fatti movimenti solo dal 02 al 15 del mese (magari mettere in grigietto il resto) e così per tutti i mesi dell'anno.
    Prima domanda: è possibile farlo con le librerie grafiche del php?
    Seconda: Potete indicarmi, per il momento almeno in linea di massima, come?
    Grazie anticipatamente.

  2. #2
    Guest

    Predefinito

    Citazione Originalmente inviato da gianlucaweb
    Ciao
    Avrei intenzione di creare (se possibile) dei grafici con il php.
    Mi spiego meglio:
    Interrogando il db su un certo cliente che ha fatto degli acquisti io posso sapere
    quando ha speso in un mese (o frazione) o quante fatture sono state emesse e in che giorno, sempre per uno stesso cliente (in verità posso avere anche i dati globali, cioè che sono riferiti alle somme di tutti i movimenti).
    Vorrei fare in modo adesso di visualizzare i dati sotto forma di grafici, come quelli di excel (es: asse x tempo, asse y quantità o valori) avendo come punto di riferimento per il tempo il mese cioè il grafico completo del mese anche
    se sono stati fatti movimenti solo dal 02 al 15 del mese (magari mettere in grigietto il resto) e così per tutti i mesi dell'anno.
    Prima domanda: è possibile farlo con le librerie grafiche del php?
    Si
    Citazione Originalmente inviato da gianlucaweb
    Seconda: Potete indicarmi, per il momento almeno in linea di massima, come?
    Ti consiglio di iniziare dall'esempio che trovi nella funzione imagefilledarc, che ti mostra come fare una torta in 3D.
    Con la stessa idea ti fai anche le barre in 3D.
    Naturalmente la vita è più semplice se eviti il 3D .
    Prova a dare un'occhiata anche qua: http://pear.veggerby.dk/ noterai che c'è bisogno di alcuni package del PEAR che non credo siano installati su Altervista.
    Io ne ho preparati alcuni per conto mio ma li devo rivedere e spero di metterli tra i miei tutorial.
    Citazione Originalmente inviato da gianlucaweb
    Grazie anticipatamente.
    Ciao

  3. #3
    L'avatar di F1Italia
    F1Italia non è connesso Utente
    Data registrazione
    28-12-2003
    Messaggi
    200

    Predefinito

    guarda per darti un'idea ho buttato giù un esempio davvero molto molto semplice di come si può realizzare un grafico partendo da un array di valori:

    Codice:
    <?php
    
    
    $valori=array(10,70,30,40,50,60); // valori grafico
    
    $dimw = '10'; // larghezza blocco
    $dst = '5'; // distanza blocchi
    $h = '100'; // altezza immagine
    $w = '150'; // larghezza immagine
    
    
    $im = imagecreatetruecolor($w, $h);
    $bianco = imagecolorallocate($im, 255, 255, 255);
    $nero = imagecolorallocate($im, 0, 0, 0);
    imagefill($im,0,0,$bianco);
    
    for ($i=0; $i<=5; $i++) {
    	imagerectangle($im, $i*($dimw+$dst), $h-$valori[$i], ($i*($dimw+$dst))+$dimw, $h-1, $nero);
    }
    
    header("Content-type: image/png");
    imagepng($im);
    imagedestroy($im);
    
    
    ?>
    il risultato sarà un'immagine 100x150 (sfondo bianco) con 6 blocchi (sfondo bianco, bordo nero) con altezza pari al valore indicato nell'array, larghezza 10 e distanti 5.
    Fare facilmente ciò che gli altri trovano difficile è talento;
    fare ciò che è impossibile al talento è genio.


  4. #4
    gianlucaweb non è connesso Utente attivo
    Data registrazione
    01-01-2003
    Messaggi
    470

    Predefinito

    I grafici vanno bene.

    mi hanno suggerito anche questa pagina:

    http://builder.com.com/5100-6371-5092227.html?tag=crm

    Forse adotterò quello della figura b.


    Quello che devo fare è però abbastanza complesso (almeno per me si intende) mi spiego nei dettagli.

    Nella pagina della ricerca scelgo un determinato cliente e poi (usando dei campi imput text) un determinato intervallo di tempo come può essere ad esempio dal 15/01/07 al 31/03/07. Vorrei quindi, in base a questa scelta,
    che la pagina che riceve questi dati crei 3 grafici del tipo indicato
    (con sull'asse x tutti i giorni del mese e sull'asse Y vari intervalli di valori, da ? 1000, 2000, 3000 ecc ecc) sul primo, quello di gennaio tutti i valori dei movimenti commerciali (ad esempio il totale importo fattura o fatture x quel cliente in quel giorno) relativi a quel mese ma solo dal 15 in poi;
    il secondo, febbraio, con tutti i valori di febbraio e marzo la stessa cosa.
    Non so se sono stato chiaro. Penso di si.

    Il fatto è che non so come impostare il progetto ..sembra facile a dirsi ma a metterci le mani non so da dove cominciare. Per la ricerca con le date non dovrebbe esserci problemi, visto che ho affrontato la cosa (e risolto) in una mia discussione precedente. I totali delle fatture poi devono essere prelevati dal db ovviamente (nel caso sopra sono letti da un array)
    Potete aiutarmi a capire come fare in questo caso?
    Grazie ancora

  5. #5
    L'avatar di funcool
    funcool non è connesso Utente storico
    Data registrazione
    05-02-2004
    Residenza
    Qui... Non lì, qui!
    Messaggi
    15,433

    Predefinito

    Codice PHP:
    <?
    ...
    $risultato=mysql_query("SELECT * FROM tabella WHERE data>='{$dataminore}' AND data<='{$datamaggiore}'"); // Visto che la cosa delle date l'avevi già risolta, metto solo la query.
    $image=imagecreatetruecolor(1000,1000);
    $colorDarkBlue=imagecolorallocate($image, 0, 0, 255);
    $colorLightBlue=imagecolorallocate($image, 100, 100, 255);
    $i=0;
    while (
    $riga=mysql_fetch_array($risultato)) {
    imagefilledrectangle($image, $i*25, (250-$riga['totalefattura']), ($i+1)*25, 250, $colorDarkBlue);
    imagefilledrectangle($image, ($i*25)+1, (250-$riga['totalefattura'])+1, (($i+1)*25)-5, 248, $colorLightBlue);
    $i++;
    }
    ...
    ?>
    Mattia vi manda a FunCool - Matriz - Directory Gogol - Sfondo rosso per la Birmania
    «Tu mi dai fastidio perché ti credi tanto un Dio!» «Bè, dovrò pur prendere un modello a cui ispirarmi, no?» Woody Allen

  6. #6
    gianlucaweb non è connesso Utente attivo
    Data registrazione
    01-01-2003
    Messaggi
    470

    Predefinito

    Ciao
    Intanto ho provato a visualizzare il grafico della pagina al link sopra postato e mi da errore:

    Warning: Cannot modify header information - headers already sent by (output started at D:\Programmi\xampp\htdocs\fattura\trova.php:2) in D:\Programmi\xampp\htdocs\fattura\trova.php on line 138
    ‰PNG  ��� IHDR���–���d���ë9^§��IIDATxœíÛA ƒ@�Á5øÿ/›Ö I/Uç=f0Ûqƒ²×¯�ß’0OÂ< ó$Ì“0OÂ< ó$Ì“0OÂ< ó$Ì“0OÂ< ó$Ì“0OÂ< ó$Ì“0OÂ< ó$Ì“0OÂ< ó$ÌÛ§^oÛvþÀÿ¤ž7—pœFú˜;¤yæI˜'až„yæI˜'aÞôjŸ³üEiý „cõ‹’Aš'až„yæI˜'až„yæ%Wûå.S’ Çê—)iž„yæI˜'až„yæI˜÷/«½ƒËeÿ’p8¸\eæI˜'až„yæI˜'až„y7®ö.ϸ÷:ãàò�ƒ4OÂ< ó$Ì“0OÂ< ó$Ì“0OÂ< ó$Ì“0OÂ< ó$Ì“0O¼Ý.uûð…KœAš'až„yæI˜'až„yû˜\þ–œóκ'ñ·ž…Ž ����IEND®B`‚



    la linea 138 è riferita all'header:

    header("Content-type: image/png");

    Il tutorial del link dice che bisogna richiamare il grafico così:

    <img src="grid.php" />

    Ma io devo per forza mettere il tutto nella stessa pagina altrimenti avrei problemi con l'invio dei dati per il db e la visualizzazione della stessa pagiona.
    Come risolvo adesso il problema?
    Grazie

  7. #7
    Guest

    Predefinito

    Sono riuscito a trasportare il mio accrocchio su altervista e puoi trovare qualche esempio a questi indirizzi:

    http://golfox.altervista.org/tutorials/grafico1.php
    http://golfox.altervista.org/tutorials/grafico2.php
    http://golfox.altervista.org/tutorials/grafico3.php

    Domani, se trovo un po' di tempo, ti spiego come funziona (anche perché il sistema è un po' complesso e dovrebbe essere rivisto)... ammesso che sia ciò che tu stai cercando.

    Ciao

  8. #8
    gianlucaweb non è connesso Utente attivo
    Data registrazione
    01-01-2003
    Messaggi
    470

    Predefinito

    Citazione Originalmente inviato da golfox
    Sono riuscito a trasportare il mio accrocchio su altervista e puoi trovare qualche esempio a questi indirizzi:

    http://golfox.altervista.org/tutorials/grafico1.php
    http://golfox.altervista.org/tutorials/grafico2.php
    http://golfox.altervista.org/tutorials/grafico3.php

    Domani, se trovo un po' di tempo, ti spiego come funziona (anche perché il sistema è un po' complesso e dovrebbe essere rivisto)... ammesso che sia ciò che tu stai cercando.

    Ciao

    il primo farebbe a caso mio. Però dovrei adattarlo secondo le mie esigenze, come spiegato sopra.
    Grazie

  9. #9
    Guest

    Predefinito

    Nella fretta non ti ho fatto vedere anche un altro tipo di grafico:
    http://golfox.altervista.org/tutorials/grafico4.php

    Comunque ne ho anche altri

    Ciao

  10. #10
    L'avatar di funcool
    funcool non è connesso Utente storico
    Data registrazione
    05-02-2004
    Residenza
    Qui... Non lì, qui!
    Messaggi
    15,433

    Predefinito

    Citazione Originalmente inviato da gianlucaweb
    Il tutorial del link dice che bisogna richiamare il grafico così:

    <img src="grid.php" />

    Ma io devo per forza mettere il tutto nella stessa pagina altrimenti avrei problemi con l'invio dei dati per il db e la visualizzazione della stessa pagiona.
    Come risolvo adesso il problema?
    L'unico modo è quello suggerito dal tutorial perché il codice PHP produce un'immagine e io non ho mai visto il codice di un'immagine JPEG dentro al codice HTML.
    Mattia vi manda a FunCool - Matriz - Directory Gogol - Sfondo rosso per la Birmania
    «Tu mi dai fastidio perché ti credi tanto un Dio!» «Bè, dovrò pur prendere un modello a cui ispirarmi, no?» Woody Allen

  11. #11
    gianlucaweb non è connesso Utente attivo
    Data registrazione
    01-01-2003
    Messaggi
    470

    Predefinito

    Citazione Originalmente inviato da funcool
    L'unico modo è quello suggerito dal tutorial perché il codice PHP produce un'immagine e io non ho mai visto il codice di un'immagine JPEG dentro al codice HTML.
    No no, ho risolto (credo) con l'header
    e adesso visualizzo il grafico.
    mi metto sotto a provare con la query da te suggerita....sperando sempre nella tua assistenza.
    Grazie


    EDIT: Allora, ho adattato il codice in base al tuo sopra:

    Codice PHP:
    .....
    else {

    $db = mysql_connect('localhost', 'root', '') or die(mysql_error());
    @
    mysql_select_db('fattura', $db) or die(mysql_error());

    if ((
    $_REQUEST['clie']=="")&&($_REQUEST['firstinput']=="")&&($_REQUEST['secondinput']==""))
    {
    $risultato = mysql_query("SELECT * FROM fatture",$db);
    }

    // Define .PNG image
    header("Content-type: image/png");

    $imgWidth=800;
    $imgHeight=800;

    // Create image and define colors
    $image=imagecreate($imgWidth, $imgHeight);
    $colorWhite=imagecolorallocate($image, 255, 255, 255);
    $colorGrey=imagecolorallocate($image, 192, 192, 192);
    $colorBlue=imagecolorallocate($image, 0, 0, 255);
    $colorLightBlue=imagecolorallocate($image, 192, 192, 255);

    // Create border around image
    imageline($image, 0, 0, 0, 250, $colorGrey);
    imageline($image, 0, 0, 250, 0, $colorGrey);
    imageline($image, 249, 0, 249, 249, $colorGrey);
    imageline($image, 0, 249, 249, 249, $colorGrey);

    // Create grid
    for ($i=1; $i<11; $i++){
    imageline($image, $i*25, 0, $i*25, 250, $colorGrey);
    imageline($image, 0, $i*25, 250, $i*25, $colorGrey);
    }


    // Create bar charts
    $i=0;
    while (
    $riga=mysql_fetch_array($risultato)) {
    imagefilledrectangle($image, $i*25, (250-$riga['totale']), ($i+1)*25, 250, $colorBlue);
    imagefilledrectangle($image, ($i*25)+1, (250-$riga['totale'])+1, (($i+1)*25)-5, 248, $colorLightBlue);
    $i++;
    }


    // Output graph and clear image from memory
    imagepng($image);
    imagedestroy($image);
    }
    ?>
    La query al momento non prevede selezioni particolari (ho provato prima
    il caso più semplice che riporta in grafico i valori di totali di tutte le fatture
    presenti nel db come puoi notare dalla query.
    Come prova, diciamo, va bene, e questo sarebbe il risultato:




    Ma devo adesso sviluppare il grafico secondo i miei scopi.
    1)Nel db sono presenti, al momento, fatture che
    vanno dal 04/02/07 al 10/03/07 e in questo caso la query li ha selezionati tutti e
    riportati nel grafico; però (secondo quanto detto precedentemente) vorrei ottenere 2 grafici separati
    uno per il mese di febbraio e uno per il mese di marzo. Poi, sempre relativamente a questa query
    ci sono totali di + fatture dello stesso giorno che dovrei sommare ed ottenere una sola barra

    2)L'estetica e le informazioni presenti nel grafico dovrebbero essere potenziate:
    sull'asse X dovrei visualizzare i giorni del mese (e la barra relativa a un totale fattura/re posta proprio
    sul proprio giorno di competenza. Sull'asse y intervalli di valori (es: euro 1000, 2000, 3000 ecc ecc)

    Ho bisogno di una mano per fare questo.
    Grazie


    FunCool: Non scrivere due messaggi consecutivi, utilizza il tasto Edita.
    Ultima modifica di funcool : 06-04-2007 alle ore 08.48.47

  12. #12
    Ospite Guest

    Predefinito

    io avevo fatto un grafico per il mio giochino della corsa..non è il massimo come grafica ma se vuoi ti passo il codice per le etichette
    http://zenas.org/corsa/grafico.html
    tempo fa avevo anceh fatto questo..che ora onn è nenache + linkato al sito
    http://zenas.org/elezioni/

    ho anche i file d'esempio di una guida ma penso usino delle classi invece io ho fatto
    da sola

    nno ho capito la storia del richiamo dell'immagine ..io metto il normale codice dell'immagine e al posto del nome la pagina php che produce l'immagine

  13. #13
    L'avatar di funcool
    funcool non è connesso Utente storico
    Data registrazione
    05-02-2004
    Residenza
    Qui... Non lì, qui!
    Messaggi
    15,433

    Predefinito

    Citazione Originalmente inviato da farlimas
    nno ho capito la storia del richiamo dell'immagine ..io metto il normale codice dell'immagine e al posto del nome la pagina php che produce l'immagine
    Infatti si fa così.
    Mattia vi manda a FunCool - Matriz - Directory Gogol - Sfondo rosso per la Birmania
    «Tu mi dai fastidio perché ti credi tanto un Dio!» «Bè, dovrò pur prendere un modello a cui ispirarmi, no?» Woody Allen

  14. #14
    gianlucaweb non è connesso Utente attivo
    Data registrazione
    01-01-2003
    Messaggi
    470

    Predefinito

    ho trovato questo grafico che fa proprio per me:



    l'ho leggermente modificato.

    Questo il codice:

    Codice PHP:
    <?php

    $size_x
    = 640;
    $size_y = 480;
    $title = 'Ammontare fatture mensili';
    $title2 = 'Totale fatture (x Euro 100)';

    $values = array(
    1999 => 5300,
    2000 => 5700,
    2001 => 6400,
    2002 => 6700,
    2003 => 6600,
    2004 => 7100
    );
    $max_value = 15000;
    $units = 500;

    $img = imagecreatetruecolor($size_x, $size_y);
    imageantialias($img, true);
    imagealphablending($img, true);

    $bg_image = 'images/pan.png';
    $bg = imagecreatefrompng($bg_image);
    $sizes = getimagesize($bg_image);

    imagecopyresampled(
    $img, $bg,
    0, 0, 0, 0,
    $size_x, $size_y, $sizes[0], $sizes[1]
    );

    /* Chart area */
    $background = imagecolorallocatealpha($img, 127, 127, 192, 32);
    imagefilledrectangle(
    $img,
    20, 20, $size_x - 20, $size_y - 80,
    $background
    );
    imagefilledrectangle(
    $img, 20, $size_y - 60, $size_x - 20, $size_y - 20,
    $background
    );

    /* Values */
    $barcolor = imagecolorallocatealpha($img, 0, 0, 128, 80);
    $spacing = ($size_x - 140) / count($values);
    $start_x = 120;
    foreach (
    $values as $key => $value) {
    $x1 = $start_x + 0.2 * $spacing;
    $x2 = $start_x + 0.8 * $spacing;
    $y1 = $size_y - 120;
    $y2 = $y1 - (($value / $max_value) * ($size_y - 160));
    imagefilledrectangle($img, $x1, $y1, $x2, $y2, $barcolor);
    $start_x += $spacing;
    }

    /* Grid */
    $black = imagecolorallocate($img, 0, 0, 0);
    $grey = imagecolorallocate($img, 128, 128, 192);
    for (
    $i = $units; $i <= $max_value; $i += $units) {
    $x1 = 110;

    $y1 = $size_y - 120 - (($i / $max_value) * ($size_y -160));
    $x2 = $size_x - 20;
    $y2 = $y1;
    imageline(
    $img,
    $x1, $y1, $x2, $y2,
    (
    $i % (2 * $units)) == 0 ? $black : $grey
    );
    }
    /* Axis */
    imageline($img, 120, $size_y - 120, 120, 40, $black);
    imageline(
    $img,
    120, $size_y - 120, $size_x - 20, $size_y - 120,
    $black
    );

    /* Title */
    $c_x = $size_x / 2;
    $c_y = $size_y - 40;
    $box = imagettfbbox(20, 0, 'arial.ttf', $title);
    $sx = $box[4] - $box[0];
    $sy = $box[5] + $box[1];
    imagettftext(
    $img,
    20, 0,
    $c_x - $sx / 2, $c_y - ($sy / 2),
    $black,
    'arial.ttf', $title
    );

    $c_x = 50;
    $c_y = ($size_y - 60) / 2;
    $box = imagettfbbox(14, 90, 'arial.ttf', $title2);
    $sx = $box[4] - $box[0];
    $sy = $box[5] + $box[1];
    imagettftext(
    $img,
    14, 90,
    $c_x - ($sx / 2), $c_y - ($sy / 2),
    $black,
    'arial.ttf', $title2
    );

    /* Labels */
    $c_y = $size_y - 100;
    $start_x = 120;
    foreach (
    $values as $label => $dummy) {
    $box = imagettfbbox(12, 0, 'arial.ttf', $label);
    $sx = $box[4] - $box[0];
    $sy = $box[5] + $box[1];
    $c_x = $start_x + (0.5 * $spacing);
    imagettftext(
    $img,
    12, 0,

    $c_x - ($sx / 2), $c_y - ($sy / 2),
    $black,
    'arial.ttf', $label
    );
    $start_x += $spacing;
    }
    $r_x = 100;
    for (
    $i = 0; $i <= $max_value; $i += ($units * 2)) {
    $c_y = $size_y - 120 - (($i / $max_value) * ($size_y - 160));

    $box = imagettfbbox(12, 0, 'arial.ttf', $i / 100);
    $sx = $box[4] - $box[0];
    $sy = $box[5] + $box[1];
    imagettftext(
    $img,
    12, 0,
    $r_x - $sx, $c_y - ($sy / 2),
    $black,
    'arial.ttf', $i / 100
    );
    }

    /* Output to browser */
    header('Content-type: image/png');
    imagepng($img);
    ?>
    Adesso dovrei adattarlo.

    Sull'asse x dovrei mettere i giorni del mese e sulle barre relative al giorno devo mettere la barra con il totale fatture relative a quel giorno (faccio il caso di non aver selezionato nessun cliente).
    L'altro problema è aver un grafico separato per ogni mese (o frazione di esso) chiamato in questione dalla ricerca, come dicevo sopra.

    Grazie

    ps: a proposito volevo inserire il simbolo dell'euro ma non riesco a visualizzarlo. Come mai?

Regole di scrittura

  • Non puoi creare nuove discussioni
  • Non puoi rispondere ai messaggi
  • Non puoi inserire allegati.
  • Non puoi modificare i tuoi messaggi
  •