Gerando Gráficos com PHP

Publicado: agosto 9, 2008 em PHP
Tags:, , ,

Gráficos utilizando a Classe PHPlot

Pessoal, blz ai né?

Galerinha, vou apresentar hoje o PHPLot, uma classe bacana para criar gráficos em nossas aplicações PHP !

Vou começar dando alguns exemplos básicos da necessidade de se gerar gráficos na aplicação.

* Mostrar estatísticas de acesso diário/mensal/anual de um sistema on-line.
Consumo de itens em uma dada categoria.
* Estatísticas de venda de produtos através da internet.
* Contatos por categoria (dúvidas, vendas, financeiro …)

Enfim, dados de entrada e saída que precisam ser acompanhados e analisados.

Aqui será apresentado o código necessário para gerar o gráfico na tela, não iremos, ao menos neste post, ver como pegar os dados dinâmicamente do banco e gerar o gráfico. Eu estou trabalhando em um projeto que deverá conter esse recurso, então fiz de acordo com as necessidades da aplicação no projeto.

Então, entraremos com os dados pré-definidos requeridos como parâmetros da classe PHPLot.

O gráfico que iremos gerar irá mostrar os usuários cadastrados em um sistema qualquer, exibiremos três barras para cada mês do ano, cada barra representará uma categoria de usuário e a quantidade de ocorrências de cadastro naquele mês.

Primeiramente, vamos ver como o código é estruturado:

<?php
#incluindo a classe. verifique se diretorio e versao sao iguais, altere se precisar
include(‘phplot-5.0.4/phplot.php’);
#Matriz utilizada para gerar os graficos
$data = array(
  array(‘Jan‘, 20, 2, 4), array(‘Fev‘, 30, 3, 4), array(‘Mar‘, 20, 4, 14),
  array(‘Abr‘, 30, 5, 4), array(‘Mai‘, 13, 6, 4), array(‘Jun‘, 37, 7, 24),
  array(‘Jul‘, 10, 8, 4), array(‘Ago‘, 15, 9, 4), array(‘Set‘, 20, 5, 12),
  array(‘Out‘, 28, 4, 14), array(‘Nov‘, 16, 7, 14), array(‘Dez‘, 24, 3, 15),
);
#Instancia o objeto e setando o tamanho do grafico na tela
$plot = new PHPlot(800,600);
#Tipo de borda, consulte a documentacao
$plot->SetImageBorderType(‘plain‘);
#Tipo de grafico, nesse caso barras, existem diversos(pizza…)
$plot->SetPlotType(‘bars‘);
#Tipo de dados, nesse caso texto que esta no array
$plot->SetDataType(text-data);
#Setando os valores com os dados do array
$plot->SetDataValues($data);
#Titulo do grafico
$plot->SetTitle(‘Cadastro de usuários no Site‘);
#Legenda, nesse caso serao tres pq o array possui 3 valores que serao apresentados
$plot->SetLegend(array(‘Estudantes‘,’Colunistas‘, ‘Desenvolvedores‘));
#Utilizados p/ marcar labels, necessario mas nao se aplica neste ex. (manual) :
$plot->SetXTickLabelPos(‘none‘);
$plot->SetXTickPos(‘none‘);
#Gera o grafico na tela
$plot->DrawGraph();
?>

O código acima irá gerar exatamento o gráfico como no exibido na figura abaixo:

A começar pelo Array $data, perceba que ele recebe 4 valores, isso é uma divergência à informação passada mais acima, mas calma, vou explicar. São 4 valores, o primeiro recebe uma string que se refere ao mês, o segundo valor recebe a quantidade de ocorrências para a categoria 1, o segundo recebe a quantidade de ocorrências para a categoria 2, o terceiro recebe a quantidade de ocorrências para a categoria 3.

Então, fora o mês temos 3 valores, opa agora sim ta fazendo sentido o que falei lá em cima. Bem, claro que você pode utilizar quantos valores quiser no seu array vai depender de sua necessidade!

Um outro ponto à ser considerado neste exemplo é a linha:

$plot->SetLegend(array(‘Estudantes’,'Colunistas’, ‘Desenvolvedores’));

Perceba que o método recebe um array com 3 valores, certo até ai não é?

continue nessa linha de raciocinio… O array recebe 3 valores que irão representar justamente os valores das 3 barras que serão geradas, lembra? 3 barras no array $data, 1 barra para cada categoria! lembrou né!!

Então, acontece que o array passado pelo método SetLegend precisa estar em ordem em relação os valores que você quer representar nas 3 barras, por exemplo:

Imagine esse array ->  (‘Janeiro’,10,20,30)

Bem, como dito antes o primeiro valor do array não será representado, trata-se apenas da legenda para as 3 barras do mês de Janeiro. Assim concluímos que, teremos uma barra com altura 10, outra com altura 20 e a última com altura 30. Então vamos voltar ao método SetLegend(), os valores do array passado por esse método irão representar as cores das barras, vamos unir as duas linhas em questão.

1 -(‘Janeiro’, 10, 20, 30)
2 -SetLegend(array(‘Estudantes’,'Colunistas’, ‘Desenvolvedores’))

 Agora, tente visualizar o Estudantes = 10, Colunistas = 20 e Desenvolvedores = 30.

Sacou né? Por isso que você deve prestar atenção na ordem das legendas, parece bobeira mas se você acidentalmente inverter as posições seu sistema não servirá de nada além de apresentar os dados incorretos para o usuário fazendo-o tomar decisões erradas. É sempre bom nos atentarmos à estes detalhes, eles fazem toda a diferença, literalmente!  ;)

Importante!

Cada arquivo como o do exemplo acima gera o gráfico retornando como uma imagem, ou seja, você não adiciona textos ou conteúdo adicional à este arquivo. Para utilizar em meio à outras páginas com conteúdos você pode fazer como descrito abaixo.

Supondo que seus gráficos são gerados pelos arquivos grafico1.php  e grafico2.php, você pode cirar um novo arquivo .php (ou qualquer outro já existente) e inserir as linhas abaixo:

<p>Gráfico 1</p>
<img src=”grafico1.php” />
<p>Gráfico 2</p>
<img src=”grafico2.php” />

 

Algumas considerações:
O PHPlot não se resume apenas à gráficos em barras, ele permite gerar gráficos desde gráficos pizza até os mais complexos gráficos. As cores também podem ser setadas como parâmetro.

Dê uma boa olhada na documentação.

Links:
A Classe PHPlot em  http://sourceforge.net/projects/phplot/

A documentação do PHPlot deve estar contida no pacote, caso contrário http://www.jeo.net/php/phplot/doc/

O Exemplo (não inclui todos os arquivos do PHPlot e docs)
download exemplo

Galerinha, vai terminando por aqui, se quiserem ver como gerar gráficos à partir de uma tabela do banco de dados, peçam aí por comentário que escreverei com muito prazer!

Abraços e obrigado pelos comentários que vocês tem deixado aí, são todos motivadores!  ;)

Rafael Clares

Comentários
  1. Lorenzi disse:

    Ola Rafael, poderia passar um exemplo de como utilizar usando banco de dados , preciso fazer um grafico simples ou seja quantidade de pessoas cadastradas por cidade

  2. Rafael Clares disse:

    Olá Lorenzi, acredito que para o seu caso é melhor utilizar o exemplo que dei do PHP+Fusion Charts, dê uma olhada no outro post sobre gráficos e se mesmo assim não estiver fácil eu postarei essa semana o exemplo que pediu. Abraços

  3. Aline disse:

    Olá Rafel, seria interessante mesmo uns posts utilizando Banco de Dados. Estou aprendendo agora utilizar esta biblioteca, e agradeceria se pudesse ajudar. Está super explicativo seu texto, clareou muita coisa para mim, Parabéns!

  4. Aline disse:

    então Rafael!
    e os posts com Banco de dados?

  5. Diego wildberger disse:

    Boa tarde,

    Gostei muito do phplot, no entanto preciso gerar alguns relatorios, e no meio dos textos dos relatórios precisam ser inseridos alguns graficos. Só que quando eu insiro qualquer tipo de texto no arquivo que gera o gráfico dá erro de imagem.
    Como posso resolver esse problema, de modo que no meio de um parágrafo apareça um gráfico??

    Abraços

  6. Rafael Clares disse:

    Neste final de semana postarei o exemplo com BD.
    abraços

  7. Rafael Clares disse:

    Olá Diego, entao cara tem como colocar aqui o trecho do código que não está de acordo com que você espera? Acredito que ficará mais fácil.
    Abraços,

  8. Rafael Clares disse:

    Diego, fiz uma macacada aqui e acabei deletando seu último comentário ha-ha. Mas vou colorar no post a sua dica. Valeu brother ;)

  9. Carlos disse:

    Tem como trabalhar com valores monetários, tipo, imprimir um gráfico com porcentagem de cada valor: R$ 1.000,89 e 234,98, por exemplo?
    Valeu

  10. Carlos disse:

    não achei nada na documentação que falasse em números monetários. tentei fazer na unha, mas se colocar , ele interpreta como outro valor, tô buscando dados do MySQL e tenho que somar os resultados e mostrar a soma de cada tipo pra ele colocar a % de cada um no gráfico, mas se vier em float, ex 1.203,00 ele interpreta como sendo 1.2 e 00 separado como outro valor…

  11. Carlos disse:

    pois é, utilizei o number_format para formatar os valores. O problema é que o phplot interpreta mil reais como sendo 1 real e 20 reais como sendo um número maior. A função de formataçãod e números do PHPLOT idem…

    • Rafael Clares disse:

      Carlos, entendo o que está dizendo, mas como eu havia dito antes à você, dê uma olhada na documentação, bem, você disse que olhou, dai eu insisto em dizer que gráficos devem possuir formatação para numeros e todos os tipos de dados, enfim, vendo que realmente você não conseguiu fazer me propus a procurar na documentação e … em pouquissimo tempo olhando as docs eu consegui fazer o que você tanto precisa, não fiz o programa para você mas vou te apontar o local da documentação onde explica como fazer o que você precisa com apenas um método da classe.
      segue o link da documentação:
      http://phplot.sourceforge.net/phplotdocs/SetNumberFormat.html
      No geral, a sintaxe é a seguinte:

      $plot->SetNumberFormat($decimal_point, $thousands_sep)

      onde $decimal_point é o separador decimal e $thousands_sep é o separador da milhar, logo,

      $plot->SetNumberFormat(‘,’, ‘.’);

      basta incluir essa linha logo após instanciar o objeto PHPlot , mais precisamente após
      $plot = new PHPlot(600,400);

      Espero ter ajudado, de toda forma, tudo que precisa está na documentação, se tiver alguma dificuldade para entender a doc, me avise.
      Um grande abraço,

  12. Nenê disse:

    OI

    Você já utilizou a open flash chart ?

    Se sim… conseguiu mudar o caminho dos arquivos .swf ?

    Obrigada se puder me envia por e-mail..

    Valeu…

    ah e parabens pelo artigo….

  13. Ana disse:

    Mesmo problema do carlos, essa funcao mesmo existindo na doc, se colocar os ‘,’,’.’
    nao funciona o grafico da erro.

  14. jessica disse:

    olá,gostaria de saber onde eu salvo o arquivo para aparecer na internet.

  15. RSel disse:

    Eu estou passando por um problema com ele, ao montar o grafico e chama-lo, aparece apenas um quadrado branco com um “x”, e não aparece o meu grafico.. Os gradficosteste do sistema rodam muito bem, e já verifiquei que a tabela para o grafico é montada corretament. Poderias me ajudar? Fico muito grata

  16. FaGnEr disse:

    Muito bom o tutorial realmente funciona, muito obrigado espero que fale mais sobre o Phplot para imprimir objetos do banco de dados ou ate mesmo utilizar os outros graficos.

  17. EdsonAntolini disse:

    Cara achei bacana de mais como você explico essa classe e como usar. Valeu mesmo aprendi de mais com isso.
    Você poderia me enviar, alguma coisa como posso pegar dados do banco e jogar no grafico?
    Obrigado desde ja.

  18. Joeber Garcia disse:

    Olá amigos, preciso exibir nos gráficos de barras os valores. Quero que apareça os valores em cada barra dos gráficos (gráfico tipo ‘bars’ – barras).

    Exemplo de um gráficos que tenha 3 barrinhas referentes aos valores 30, 40 e 50 por exemplo. Quero que apareça em cima de cada barrinha esses valores, ou em outro local. Como poderia fazer isso? Se puderem me responder por e-mail também ou msn: joebergg@hotmail.com

  19. Boa noite, preciso de um exemplo deste grafico consultando o DB.

  20. Adriana disse:

    Quero saber como pegar os dados no mysql e gerar o grafico a partir desses dados.

  21. Greice disse:

    Olá..
    Estou criando gráficos com o PhPlot mas tenho tido duas dificuldades:
    1° – Não consigo alterar os valores no eixo y. O PhPlot já gera os valores, porém eu qria colocar valores redondos, pra facilitar a visualização desses valores dos graficos..
    2° – Qria tb colocar os valores dentro do grafico. Por exemplo: Criei um grafico de barras, no eixo y coloco o valor redondo aproximado das barras e dentro das barras coloco o valor exato, entendeu?
    Espero q alguem possa me ajudar..
    Obrigada!!

  22. Greice disse:

    Segue o código

    //Incluimos a biblioteca
    require(dirname(__FILE__).”/../includes/phplot/phplot.php”);

    //Chamo a função com array dos valores
    $l_arr_grafico = g_arr_vendas_mensais_por_loja_grafico($_REQUEST);

    //Definimos o objeto para inicar a “montagem” do gráfico
    $grafico =& new PHPlot(900, 600);

    // Título do gráfico
    $grafico->SetTitle(“Evolução do Faturamento Mensal “.$_REQUEST['f_int_ano_inicio'].” – Loja: “.$_REQUEST['f_int_storeno']);
    $grafico->SetXTitle(‘Meses’);
    $grafico->SetYTitle(‘Valor (R$)’);

    // Dados
    $grafico->SetDataValues($l_arr_grafico);

    //Cores do grafico
    $arrCores = array (‘#70C670′, ‘#4791DA’, ‘#D15353′);
    $grafico->SetDataColors($arrCores);

    //SertFont atera fontes do title, legend, x_title, y_title, x_label, Y_label
    //Fontes – Eixo Y
    $grafico->SetFont(‘y_label’,’2′, ’5′);

    //Fontes – Eixo X
    $grafico->SetFont(‘x_label’,’2′, ’5′);

    //Tipo de grafico
    $grafico->SetPlotType(“bars”);

    $grafico->SetPrecisionY(0);

    //Exibimos o gráfico
    $grafico->DrawGraph();

  23. Greice disse:

    Olá Rafael..

    Já encontrei as funções que resolvem os problemas..

    Obrigada..

  24. Rodrigo disse:

    Caro Rafael, consegui fazer o grafico e consegui buscar os dados do meu BD para gerar o mesmo, até ai tudo bem…quando vou chama do meu graph.php num iFrame…meu gráfico fico pequeno como resolver ??

    • Rafael Clares disse:

      Rodrigo, ao invés de usar um iframe para exibir o gráfico você tem que inseri-lo como imagem, ex:

      Como o arquivo que gera o gráfico retorna unicamente uma imagem, então você não precisa de iframe.
      Por se tratar de uma imagem você pode utilizar os atributos como width e height, border, etc…
      Entendeu ?
      Abs

  25. carlos cesar disse:

    Estou precisando desesperadamente, implementar um grafico em tempo real que plote os dados de uma aplicação escrita em openCv, alguem pode me ajudar?

  26. Fernando N Vicente disse:

    Olá,

    http://clares.wordpress.com/2008/08/09/gerar-graficos-com-php/

    Como posso colocar os valores do eixo Y com 2 casas decimais?

    Desde já, grato pelo ajuda.

    At,

  27. Alex disse:

    Oi Rafael, tenho um problema e peço uma ajuda para solucionar. Estou gerando gráficos em php+phplot, com número inteiro vai tranquilo, mas com vírgula tá difícil. Já tentei SetNumberFormat ou number_format do php, mas ele sempre arredonda. Se tiveres alguma idéia para ajudar te agradeço muito.
    Abaixo o código para teres uma idéia.
    <?php
    include("conexao.inc");
    include('PHPlot.php');
    $graph = new PHPlot(600,600,"","");

    $busca = $analise;
    $sql = "select * from efluente_liquido where eflu_procedencia=$selectcliente and $analise””;
    $result = odbc_exec($con,$sql);

    $contador = 1;
    while($linha = odbc_fetch_row($result))
    {
    $certificado[$contador] = odbc_result($result,”eflu_ensaio”);
    $resulta = odbc_result($result,$busca);
    $resulta = split(“\,”,$resulta); /* troquei a vírgula por ponto */
    $analise[$contador] = $resulta[0].’.’.$resulta[1];
    $contador++;
    }
    /* O elemento dados vai ter um número limitado de elementos*/
    $dados = array(
    array($certificado[1],$analise[1]),
    array($certificado[2],$analise[2]),
    array($certificado[3],$analise[3]));

    $graph->SetDataValues($dados);
    $graph->DrawGraph();
    ?>

    • Rafael Clares disse:

      Então cara, você tem que ler os comentários, já tem esse problema nos comentários, procura o comentário do dia 30 de janeiro que já está falando como fazer isso!

      • Alex disse:

        Valeu, mas como disse anteriormente, já tentei isso, mas não obtive sucesso. Pode deixar que vou continuar tentando sanar esta dúvida.

      • Rafael Clares disse:

        Alex, infelizmente cara a resolução do problema é só essa mesmo, mas no seu código não vejo o setNumber após a instância do obj phplot.
        De toda forma você precisa ter certeza de que os números estão retornando como float do banco. Se você printar na tela o valor ele está nesse formato com pontos e virgulas ?

        Já tentou algo como:
        $foo = floatval($number);

        ou

        settype($foo, “float”);

        São tentativas desesperadas mas realmente não entendo o porque não funciona, eu tenho todos esses exemplos do blog na minha máquina e testando está normal.
        Certa vez tive um problema parecido porque estava recebendo do banco já sem pontos.

        De toda forma, boa sorte e me desculpe não poder ajuda-lo.

  28. William Cf disse:

    Estou tendo problemas, comigo aparece a seguinte mensagem de erro.

    “A imagem contem erros e não pode ser exibidas… Isso eu creio que seja por causa da do header(). Pois eu tiro ele meu código volta ao normal e eu preciso colocar um gráfico que fica na index da area admistrativa… Eu pesqusei sobre isso na net não econtrei nenhuma solução, você sabe o que pode ser feito?

  29. adriano disse:

    cara preciso buscar os valores em mysql para esse grafico, não estou conseguindo.

    dá para colocar variavel como assim:
    array(‘Jan’, $andre_jan, 2, 4), array(‘Fev’, 30, 3, 4), array(‘Mar’, 20, 4, 14),

    como posso fazer?

    aguardo

    • Rafael Clares disse:

      Adriano, aparentemente está correto se o valor retornado de $andre_jan for númerico.
      Qualquer coisa tente :
      $andre_jan = (int) $andre_jan;
      array(‘Jan’, $andre_jan, 2, 4), array(‘Fev’, 30, 3, 4), array(‘Mar’, 20, 4, 14),

  30. Sebas disse:

    Olá Rafael!
    Estava buscando como poderia gerar um gráfico com alguns dados vindos de um BD do mysql e encontrei o teu post. Obviamente vou brincar agora para adapta-lo à minha realidade (o que não é dificil em função dos comentários) e ao BD. Valeu…
    Muito Obrigado

  31. Viconcursos disse:

    muito boma a explicação ajudou pra caramba um grande abraço …

  32. Diego disse:

    Olá Rafael! Parabéns pelo Post, rendeu uma longa lista de discussão! hehehe
    Cara, to com o mesmo problema da Greice, listado acima:
    “1° – Não consigo alterar os valores no eixo y. O PhPlot já gera os valores, porém eu qria colocar valores redondos, pra facilitar a visualização desses valores dos graficos..”

    Ou seja, como faço para colocar nos eixos X e Y os valores definidos por mim e não os gerados automaticamente pela classe?

    Grande Abraço!

    • Rafael Clares disse:

      Diego, cara fico muito feliz pela visita e triste pelo problema aí hehehe.
      Sinceramente, quando preciso gerar gráficos eu utilizo o fusioncharts, ele é mais simples e até mais bonito.
      Você chegou a ler o post sobre FusionCharts ?
      De toda forma, eu tentei também e não consegui… o máximo que consegui foi fazendo o seguinte:

      //$plot->SetNumberFormat(‘,’, ‘.’); //comentei essa linha
      $plot->SetPrecisionY(0);
      $plot->SetYLabelType(‘data’);

      Agora, vi que tem muitos exemplos de gráficos nesse link abaixo, dá para clicar em cada exemplo que aparece no ‘Table of Contents’ e ver os modelos. Boa sorte!

      http://pt.scribd.com/doc/76553996/Php-Lot

  33. Ricardo Lima disse:

    Cara quero saber como mandar valores do banco de dados pelo mysql, como por exemplo em jan que tem tres valores, eu quero que seja os valores do banco, mas não consigo fazer isso.
    Alguém poderia me ajudar?

  34. jander nery disse:

    gostei da explicação muito boa.

Deixe uma resposta

Preencha os seus dados abaixo ou clique em um ícone para log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Sair / Alterar )

Imagem do Twitter

You are commenting using your Twitter account. Sair / Alterar )

Foto do Facebook

You are commenting using your Facebook account. Sair / Alterar )

Connecting to %s