PHP é a Quinta-Feira – Gráficos em PHP com pChart

22 Comentários

Por Pedro Peixoto para o PPLWARE

Nos dias correntes, e com a necessidade de melhorar o conteúdo das nossas páginas, é cada vez mais frequente apresentar dados na forma como melhor se entendem: em gráficos. Existem várias ferramentas que servem este propósito, umas pagas outras gratuitas, umas mais simples outras mais complexas, com animações ou sem animações. Hoje vamos conhecer o pChart, uma classe PHP que nos permite gerar gráficos de forma rápida, fácil e gratuita.

Para este exemplo vamos fazer um gráfico em pilha com dados fictícios das visitas do PPLWARE blog e PPLWARE fórum.

pchart_00

Preparação

Depois de fazer download da classe é necessário fazer os includes:

include("pChart/class/pData.class.php");
include("pChart/class/pDraw.class.php");
include("pChart/class/pImage.class.php");

De seguida vamos inicializar objecto que armazenará os dados:

MyData = new pData();

Para adicionar séries usa-se a função addPoints que recebe um array de dados e o nome da série:

$MyData->addPoints(array(7,8,15,20,18,12,8,19,9,16,20,8),"PPLWARE Blog");
$MyData->addPoints(array(19,0,8,8,8,12,19,10,5,12,20,8),"PPLWARE Forum");
$MyData->addPoints(array('JAN','FEB','MAR','ABR','MAI','JUN','JUL','AGO','SET','OUT','NOV','DEZ'),"Mes");

Como no nosso caso, queremos que uma das series seja o eixo das abcissas devemos indica-lo através da função setAbscissa:

$MyData->setAbscissa("Mes");

De seguida vamos indicar o texto a apresentar nos eixos, como uma das series vai ser o eixo dos xx, basta indicarmos o texto para o eixo dos yy, usamos a função setAxisName:

$MyData->setAxisName(0,"Visitantes únicos");

Uma vez que os dados que temos estão em milhares, vamos indicar a unidade usando a função setAxisUnit, no fundo esta função acrescenta à frente dos valores/eixos/legendas o texto indicado no segundo parâmetro, o primeiro parâmetro é o id do eixo, neste caso yy:

$MyData->setAxisUnit(0,”000″); ou $MyData->setAxisUnit(0,”k”);

Desenho

Agora que já temos os nossos dados preparados vamos desenhar o gráfico.

Em primeiro lugar temos de criar um objecto gráfico:

$myPicture = new pImage(1199,230,$MyData);

De seguida indicamos as dimensões usando a função setGraphArea:

$myPicture->setGraphArea(60,30,950,190);

Temos ainda de escolher a fonte a usar para a representação de texto através da função setFontProperties:

$myPicture->setFontProperties(array("FontName"=>"pChart/fonts/pf_arma_five.ttf","FontSize"=>6));

Falta apenas configurar a escala, neste capítulo há muitas opções disponíveis, neste caso queremos apenas uma escala simples com os yy entre 0 e 50, para isso usamos o drawScale.

$AxisBoundaries = array(0=>array("Min"=>0,"Max"=>50));
$myPicture->drawScale(array("Mode"=>SCALE_MODE_MANUAL,"ManualScale"=>$AxisBoundaries));

Estamos prontos para, finalmente, gerar o gráfico, como queremos um gráfico em pilha, usamos a função drawStackedBarChart, mas esta classe oferece muitos outros. Vamos então gerar um gráfico em pilha, com valores nas próprias colunas, cor automática, efeito de cor gradiente e contorno:

$myPicture->drawStackedBarChart(array("DisplayValues"=>TRUE,"DisplayColor"=>DISPLAY_AUTO,"Gradient"=>TRUE,"Surrounding"=>60));

Podemos adicionalmente colocar uma legenda, que neste caso é muito útil, usando a função drawLegend, indicado a sua disposição:

$myPicture->drawLegend(570,212,array("Style"=>LEGEND_NOBORDER,"Mode"=>LEGEND_HORIZONTAL));

Por fim, temos de fazer o output. Esta classe possibilita que uma imagem seja guardada em ficheiro ou mostrada directamente na própria página que é o que vamos fazer usando a função stroke:

$myPicture->stroke();

Eis o resultado final:

php_00

Sandbox

Existe ainda uma ferramenta chamada sandbox para a construção de gráficos através de um interface gráfico, para o caso de o utilizador não querer estar a escrever código.

clip_image004

Conclusão

O pChart é uma classe poderosa para a construção de gráficos que tanto pode ser usada para a construção de simples gráficos, como para os gráficos mais complexos. Possui muitas opções, parâmetros e funções que nos permitem fazer qualquer gráfico imaginável, pelo que não podemos deixar de lhe dar algum destaque.

A inclusão de javascript permite ainda implementar algumas funcionalidades de interacção, embora o facto de trabalhar com imagens estáticas o limite um pouco neste capítulo.

O pChart é muito mais do que uma simples classe para gerar gráficos, podendo por exemplo:

– Gerar códigos de barra

php_01

– Diagramas, Esquemas ou até mesmo simples imagens.

php_02

php_03

php_04

Por tudo o pChart isto é uma classe bastante útil que pode ser útil em qualquer altura. A ferramenta “Sandbox” disponibiliza ainda uma forma mais fácil de gerar gráficos, tornando esta classe uma das melhores entre tantas outras semelhantes, e o melhor de tudo: é grátis!

Artigos relacionados

Partilhar:
Tags:

Comentários

22

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *

  1. Avatar de Rui Costa
    Rui Costa

    Pedro,

    Agora que falas em gráficos, acabo por me lembrar de te perguntar se por acaso tens conhecimento do nome da library que permite criar gráficos ao estilo do google analytics.

    Bom artigo.

  2. Avatar de petersaints

    Para mim o melhor que anda aí em termos de gráficos são:

    HighCharts: http://www.highcharts.com/
    JSCharts: http://www.jscharts.com/

    Mas este dois são pagos, isto é, para uso pessoal pode-se usar mas para uso comercial há que pagar uma licença.

    Mas se tiver mesmo que ser Free posso aconselhar dois que tenho usado para projectos meus:
    OpenFlashChart 2: http://teethgrinder.co.uk/open-flash-chart-2/
    (mas este como é baseado em Flash tenho vindo a evitar o seu uso recenetemente)
    Ou pode-se usar a maravilhosa API da Google: http://code.google.com/apis/visualization/interactive_charts.html
    (esta está ao nível dos que referi acima mas usa como base os server da Google, o que pode não interessar em alguns casos)

    1. Avatar de ravager
      ravager

      Dentro dos free e exclusivamente em php tens também o JPgraph: http://jpgraph.net/

  3. Avatar de Mestre
    Mestre

    grande artigo…tava mesmo a precisar disto. ja é a 3x que me acontece com php =D

    obrigado e continuem com o bom trabalho. parabens

  4. Avatar de Pedro Peixoto

    Também já trabalhei com o Open Flash Chart, gerando o JSON em PHP, mas é em Flash, o que nos dias de hoje começa a ser negativo. Conheço as soluções jQuery, funcionam bem, já usei o hightcharts e é espectacular, permite uma interactividade fantástica. Mas para esta rúbrica de PHP tive de pegar numa solução verdadeiramente PHP. 🙂

  5. Avatar de miguel
    miguel

    Obrigado, estava mesmo a precisar disto para um trabalho.

    Continua com o bom trabalho, todas as 5as cá passo para ver o novo post.

  6. Avatar de JohnCN
    JohnCN

    Olá! óptimo tutorial!
    Estive a testar mas não consegui que fosse produzido nenhum gráfico. O código não dá erros e apenas produz um monte de caracteres estranho (como um dump do ficheiro binário).
    Alguma sugestão ?

  7. Avatar de Pedro Peixoto

    Boas John, esse código é a imagem do gráfico, mas o browser não está a interpretá-lo como uma imagem. Normalmente isso acontece-me quando estou a programar e vou fazendo F5 à página e quando o gráfico sai correctamente o browser já não interpreta como uma imagem. Limpa o cache do browser e em vez de fazeres F5 para actualizar põe o url da pagina mesmo na barra de endereço e abre. Normalmente quando isso me acontece resolvo assim. Se não funcionar apita! 😉

    1. Avatar de JohnCN
      JohnCN

      Olá Pedro,
      Já tentei a tua sugestão mas sem sucesso (com o IE9). No Firefox 4 diz que a página tem erros.
      Estive a ver o manual do pChart e existem várias opções para output. Já tentei com $myPicture->Stroke(); e com $myPicture->autoOutput(“grafico.png”);
      mas também sem grandes diferenças. Vou tentar outras alternativas. De qq modo obrigado pela sugestão.

      1. Avatar de Pedro Peixoto

        Boas, podes colocar aqui o erro que te dá no firefox?!

        Cumprimentos

        1. Avatar de JohnCN
          JohnCN

          Olá Pedro,
          já resolvi. obrigado!!

          1. Avatar de Gonçalo
            Gonçalo

            Como é que fizeste? Estou com o mesmo problema…

  8. Avatar de Gonçalo
    Gonçalo

    Boas.
    Eu gostava que alguém me explicasse sucintamente como é que eu ponho o pChart a funcionar..
    Para onde é que tenho que extrair a pasta que se faz o download do site pChart?
    Desde já obrigado e peço desculpa pela falta de clareza..

    1. Avatar de Pedro Peixoto
      Pedro Peixoto

      Bom dia Gonçalo, não sei em que ponto é que queres que comece a explicação. Tens o PHP e o apache instalados? Tens a pasta www, ou htdocs ou algo do genero, onde colocas os teus ficheiros… É nessa pasta ou numa subpasta que tens que ter o pchart extraído! Depois segues este tutorial…
      Explica melhor qual é o teu problema, para te poder ajudar.

  9. Avatar de Pedro
    Pedro

    Boa Tarde a todos! Tendo em conta a Google Chart API, pedia ajuda a alguém para perceber qual o meu erro… Estou a tentar montar um grafico de barras com dados mensais que são lidos de MSSQL. Não consigo fazer nada aparecer no gráfico.

    <?php
    $conexão = mssql_connect("SERVER", "", "") or die("Não foi possível a conexão com o servidor");

    mssql_select_db("DB",$conexão) or die("Não foi possível selecionar o banco de dados");

    $sql = "SELECT MONTH(CABECDOC.DATA) AS MES,
    round(sum(LINHASDOC.QUANTIDADE*ABS(LINHASDOC.PRECUNIT)- LINHASDOC.DESCONTOCOMERCIAL),0) as VENDAS
    FROM LINHASDOC
    INNER JOIN CABECDOC ON CABECDOC.ID= LINHASDOC.IDCABECDOC
    WHERE YEAR(LINHASDOC.DATA)=2010
    group by MONTH(CABECDOC.DATA)";

    $result = mssql_query($sql);

    /* Escreve resultados até que não haja mais linhas na tabela */
    while($consulta = mssql_fetch_array($result)) {
    print "$consulta[MES] – $consulta[VENDAS]”;
    }

    $gratab = array ();

    while($consulta= mssql_fetch_array($result)) {
    array_unshift ($gratab, $consulta);
    }

    /** Inclusao Classe */
    include( ‘GoogChart.class.php’ );

    /** Criaçao Grafico */
    $chart = new GoogChart();

    $i = count($gratab);
    echo $i;

    $data=array(); // Criação Table Vazia
    for($i = 0; $i < count($gratab); $i++){
    $data [ $gratab[$i][2] ]= $gratab[$i][3];
    }

    // Set graph colors
    $color = array(
    '#99C754',
    '#54C7C5',
    '#999999',
    );

    /* # Chart 1 # */
    echo 'Pie chart’;
    $chart->setChartAttrs( array(
    ‘type’ => ‘bar-horizontal’,
    ‘title’ => ‘Vendas 2011’,
    ‘data’ => $data,
    ‘size’ => array( 400, 300 ),
    ‘color’ => $color
    ));
    // Print chart
    echo $chart;

    mssql_close();
    ?>

    Desde já agradeço toda a ajuda que me puderem dar!
    Abcs
    Pedro

  10. Avatar de Tiago Santos
    Tiago Santos

    Olá a todos,

    Alguém teve um problema com as legadas e titulos do gráfico?

    eu consigo produzir o gráfico mas não estou a consegui criar uma imagem com as legendas, nem com os nomes do eixos?

    Alguém sabe porque?
    obrigado

    1. Avatar de Tiago Santos
      Tiago Santos

      Olá a Todos novamente,

      Já descobri o meu problema, apenas era necessário dar o caminho da font correcto, já que tinha alterado as pastas…

      lololol… estava dificil 😛

      Obrigado a todos,

  11. Avatar de Christophe Costa

    Olá a todos alguém me pode ajudar? Eu estou a utilizar o PChart e no final aparece um quadrado pequenino no lado esquerdo, alguém já teve este problema ou sabe o que pode ser?

  12. Avatar de vitor
    vitor

    Christophe Costa…

    experimenta correr um exemplo:

    …htdocs\pChart\examples\

    já tive um problema semelhante e o problema estava no caminho dos includes e das fontes do texto.