Gerando Gráficos com PHP

Gráficos utilizando a Classe PHPlot

Esse Post foi movido para :

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

Desculpe pelo transtorno, aproveite para assinar o novo blog.

Marcado:, , ,

76 pensamentos sobre “Gerando Gráficos com PHP

  1. Lorenzi agosto 19, 2008 às 1:44 pm

    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

    • Evilásio novembro 1, 2012 às 6:14 pm

      Fantástico!!

  2. Rafael Clares agosto 20, 2008 às 5:49 pm

    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 agosto 21, 2008 às 12:20 pm

    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 agosto 27, 2008 às 1:08 pm

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

  5. Diego wildberger agosto 29, 2008 às 8:18 pm

    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 agosto 29, 2008 às 8:26 pm

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

  7. Rafael Clares agosto 30, 2008 às 3:32 pm

    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 setembro 1, 2008 às 3:38 pm

    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 janeiro 28, 2009 às 8:42 pm

    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

    • Rafael Clares janeiro 28, 2009 às 10:14 pm

      Carlos, tem sim, claro. Acho que deve ser um dos maiores propósitos de gráficos, trabalhar números.
      Dê uma olhada na documentação.
      abraços

  10. Carlos janeiro 29, 2009 às 12:39 am

    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…

    • Rafael Clares janeiro 29, 2009 às 1:58 pm

      Carlos, realmente isso irá ocorrer se você não converter o número para o formato desejado antes de enviar para o gráfico, para isso você terá que utilizar a função number_format do PHP, dê uma olhada em http://br.php.net/number_format.
      abraços!

  11. Carlos janeiro 30, 2009 às 10:23 pm

    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 janeiro 30, 2009 às 11:30 pm

      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ê fevereiro 12, 2009 às 1:38 pm

    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….

    • Rafael Clares fevereiro 12, 2009 às 10:35 pm

      Olá, no arquivo open_flash_chart_object.php você deve setar a variável $base com o url do diretório desejado.
      Até mais,
      Ah, nunca usei, nem sabia que existia mas gostei!
      Valeu!

  13. Ana março 11, 2009 às 7:33 pm

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

  14. jessica abril 20, 2009 às 1:19 pm

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

    • Rafael Clares abril 22, 2009 às 11:10 am

      Jessica, me desculpe, não entendi o que deseja fazer;

  15. RSel abril 30, 2009 às 2:22 pm

    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

    • Rafael Clares maio 5, 2009 às 1:17 pm

      Olá Rosana, verifique se seu PHP tem a biblioteca GD/GD2 intalada/ativada, se estiver me envie o código que está gerando o gráfico para eu ver! Tchau

  16. FaGnEr julho 4, 2009 às 5:29 am

    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 julho 30, 2009 às 2:02 pm

    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 novembro 17, 2009 às 1:10 am

    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. Miquéias Reale abril 21, 2010 às 4:40 am

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

  20. Adriana junho 1, 2010 às 6:44 pm

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

  21. Greice outubro 8, 2010 às 11:29 am

    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!!

    • Rafael Clares outubro 8, 2010 às 6:04 pm

      Greice, poderia postar o trecho do código que está utilizando para montar o gráfico?

  22. Greice outubro 14, 2010 às 11:22 am

    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 outubro 15, 2010 às 5:49 pm

    Olá Rafael..

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

    Obrigada..

  24. Rodrigo outubro 19, 2010 às 11:49 pm

    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 outubro 20, 2010 às 2:38 pm

      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 novembro 3, 2010 às 4:10 pm

    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 novembro 8, 2010 às 7:09 pm

    Olá,

    Gerando Gráficos com PHP

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

    Desde já, grato pelo ajuda.

    At,

  27. Alex fevereiro 8, 2011 às 11:58 am

    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 fevereiro 8, 2011 às 12:08 pm

      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 fevereiro 8, 2011 às 12:22 pm

        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 fevereiro 8, 2011 às 12:32 pm

        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 julho 13, 2011 às 9:30 am

    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?

    • Rafael Clares julho 13, 2011 às 8:49 pm

      Verifique se sua extensão GD2 está ativa no PHP.ini

  29. adriano agosto 18, 2011 às 8:53 pm

    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 agosto 30, 2011 às 5:24 pm

      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 agosto 25, 2011 às 7:06 am

    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 outubro 7, 2011 às 5:20 pm

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

  32. Diego janeiro 18, 2012 às 1:16 pm

    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 janeiro 19, 2012 às 10:57 pm

      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 janeiro 28, 2012 às 1:18 am

    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 março 26, 2012 às 8:26 pm

    gostei da explicação muito boa.

  35. Paulo Oliveira julho 16, 2012 às 1:05 pm

    Galera eu copiei o código acima pra teste e inclui o phplot.php de forma correta mas ainda sim o gráfico não e gerado na minha tela. Alguém pode ajudar?

    • Rafael Clares julho 16, 2012 às 7:35 pm

      Ao copiar o código veja se as aspas não foram trocadas por outro caractere, as vezes ao copiar e colar fica errado; Prefira fazer download dos fontes ao copiar!

      • Leandro julho 30, 2012 às 7:36 pm

        Tenho o seguinte codigo:

        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(‘Qtde de Acessos’);
        # Legenda, nesse caso serao tres pq o array possui 3 valores que serao apresentados
        $plot->SetLegend(array(‘Dias’));
        # Metodos utilizados para marcar labes, necessario mas nao se aplica neste ex. (manual) :
        $plot->SetXTickLabelPos(‘none’);
        $plot->SetXTickPos(‘none’);
        #Gera o grafico na tela
        $plot->DrawGraph();
        ?>

        Porém o gráfico fica em branco, apenas com a legenda

      • Rafael Clares agosto 1, 2012 às 3:59 pm

        Já confirmou se o GD2 está habilitado no seu PHP ?

  36. Thiago Alexandre agosto 20, 2012 às 3:00 pm

    Olá Rafael!
    Seguinte, estou com um problema ao gerar o gráfico. Olha como eu faço:
    No arquivo grafico_produtos.php e no começo está:

    <?php
    //Carrega includes
    include('phplot.php');
    include("conexao.php");

    Se eu tiro a linha do include("conexao.php"); o phplot gera a imagem do gráfico, porém com os dados inseridos manualmente na $data. Agora se eu coloco o conexao.php, o phplot não gera nenhuma imagem e fica com x vermelho na onde era para ser o local da foto.

    OBS:
    1. Uso banco de dados PostgreSQL;
    2. conexao.php não tem nenhuma tag HTML. Olha aí:

    Sabe o que pode ser ?

    • Rafael Clares agosto 20, 2012 às 3:16 pm

      Cara, pode ser que o conexao.php esteja retornando alguma mensagem e causando o erro.
      Até mesmo estar com erro na conexão.
      Faça o seguinte teste.
      Deixe o include do conexão e faça uma query qualquer para ver se está realmente conectando.
      Ex:
      $query = pg_query(“select * from nomeDatabela”);
      if($query)
      {
      print_r(pg_fetch_array($query));
      }

      exit; //

      ou seja tente exibir qualquer dado do banco para se certificar do funcionamento

  37. Thiago Alexandre agosto 20, 2012 às 3:42 pm

    Rafael, fiz esse teste e funciono. Exibiu o array. A conexão está Ok.
    Coloquei o include e logo abaixo fiz a query.

    Agora se eu faço o include da conexão e do PHPlot, aí volta o erro.

  38. Thiago Alexandre agosto 20, 2012 às 4:00 pm

    Qual código ? php.ini, conexao.php e o produtos.php ?

    • Rafael Clares agosto 20, 2012 às 4:01 pm

      a principio o que gera o gráfico!

  39. Thiago Alexandre agosto 20, 2012 às 4:08 pm

    Um exemplo:
    http://pastebin.com/vwGGC9fM

    Utilizei de exemplo o seu código, apenas modificando o $data e o título, deixando em branco.
    OBS: se eu coloco manualmente o caminho do banco, ele funciona, agora se eu tiro o caminho e carrego a include, aí mensagem, por exemplo no firefox: “imagem contém erros e não pode ser exibida”.

    • Rafael Clares agosto 20, 2012 às 4:15 pm

      brother, não estou entendendo mais o problema!
      Eu não coloquei nenhum exemplo com banco de dados.
      Onde está o trecho do sistema que lê as tabelas, em que arquivo está esse trecho ?
      Uma coisa é a conexão mas não estou vendo no seu código o trecho que alimenta os arrays para gerar o gráfico?
      Onde está sendo lido as tabelas do seu banco?

    • Rafael Clares agosto 20, 2012 às 4:17 pm
  40. Thiago Alexandre agosto 20, 2012 às 4:26 pm

    Então, fiz um teste. Peguei seu código, inteiro e só acrescentei a include conexao.php. Não gera o gráfico mesmo assim. Se eu tiro a include, ele gera o gráfico igual ao do seu exemplo.

    Vou ler este post, acho que vai se de grande importância para mim.
    Obrigado pela ajuda Rafael !

    • Rafael Clares agosto 20, 2012 às 4:28 pm

      Ah sim mas esse exemplo do PHPlot não lê o banco, leia o outro post. Além de ter o exemplo do banco o gráfico é mais bonito hehehee
      boa sorte! Qualquer coisa posta as dúvidas, mas procure ler os comentários antes de postar ok. abs

  41. Thadeu outubro 9, 2012 às 7:51 pm

    Prezado Rafael,

    Boa Tarde.

    Tenho um arquivo txt por minuto no formato abaixo:

    HH:MM VALOR
    00:00 1.2
    00:01 1.234
    00:02 1.5
    até
    23:50 10.9

    Só consigo mostrar o eixo X em minutos e gostaria de mostrar o resultado em horas.

    Exemplo: 00 01 02 …. 23

    Como devo proceder ?

    Att,

    Thadeu

    • Rafael Clares outubro 16, 2012 às 4:25 pm

      Fala Thadeu, cara poderia colocar o código do arquivo que gera o gráfico no pastebin.com e me mandar o link para que eu possa dar uma olhada como está?

      • Thadeu outubro 18, 2012 às 11:20 am

        Olá Rafael, segue abaixo o código. O gráfico deve mostar todos os pontos por minuto e o display no X deve exibir a hora e não os minutos. Um abraço, Thadeu

      • Rafael Clares outubro 24, 2012 às 7:07 pm

        É então, eu havia pedido para você colocar o código no pastebin.com e me passar o link. Por aqui sem chances, como eu já disse, códigos em comentários ficam confusos porque o wordpress bloqueia muita coisa daí não entendo nada.

  42. Thadeu outubro 27, 2012 às 2:56 pm

    Rafael, segue o link: http://pastebin.com/LFG5jhAD

Os comentários estão desativados.