Gerando gráficos com PHP + FusionCharts

  • Autor do post:
  • Categoria do post:PHP DEV

Gerando gráficos com PHP + FusionCharts – Gráficos 3D Animados com PHP  + XML + Flash

Olá Galera, após ter falado um pouco sobre gráficos com o PHPlot, na sequência estou apresentando maravilhoso gráfico gerado com o FusionCharts, esse cara aí nos permite criar belíssimos gráficos em flash!

O FusionCharts é um produto comercial, eu já tinha utilizado em uma outra ocasião porém não me recordo de terem uma versão free, mas a alguns dias entrei no site da FC e meus olhos brilharam com o anúncio “Free Version” !

Chega de conversa, eu me empolguei !  ; )

O FusionCharts permite gerar gráficos nas liguagens PHP, ASP, CSNET, VBNET e Javascript, em todos os casos você pode setar através dos métodos do FC os valores para o gráfico, porém existe a forma que acredito ser a mais simples e prática para o exemplo que é através de XML. Podemos criar um arquivo xml com os dados desejados e informar na aplicação o endereço do XML ou podemos apenas criar no próprio código uma variável com os dados do XML, a segunda opção seria ideal no caso de ler uma tabela do banco.

Exemplo do XML para um gráfico de barras:

E básicamente é apenas disso que precisamos enviar para a o arquivo PHP e Flash.

A linha 1 do XML contém o o atributo xAxisName que repesenta as colunas do gráfico e também o atributo yAxisName que representa as linhas do gráfico, observe no gráfico abaixo:
O XML pode receber mais parâmetros na primeira linha, como título do gráfico e outros, consulte os docs.

Agora que já vimos que precisamos de um XML e sabemos como deve ser sua estrutura, vamos para o PHP.

Primeiro exemplo
– Usando um arquivo XML – Precisamos dos seguintes diretórios e arquivos:

– diretório data e dentro dele o arquivo xml chamado dados.xml (como o do exemplo)
– diretório charts com os arquivos flash que recebem o XML e geram o gráfico
– diretório includes com os arquivos FusionCharts.php e fusioncharts.js

Importante saber que essa estrutura de arquivos e diretório são usadas especificamente neste exemplo devido eu ter adaptado de  forma que fosse mais fácil compreender e trabalhar, de outra forma, a estrutura utilizada nos exemplos que vem no pacote do Fusioncharts é um pouquinho diferente mas nada de complicado fique tranquilo, você vai olhar e entender de cara.  😉

Então voltando ao assunto principal, com essa estrutura de diretórios e seus respectivos arquivos precisamos apenas do arquivo PHP com as linhas abaixo.

<script language=”javascript” src=“charts/fusioncharts.js”></script>
<?php
#incluindo o arquivo FC
include(“includes/FusionCharts.php“);
#metodo que renderiza o grafico na tela
echo renderChart(“charts/FCF_Column3D.swf“, “data/dados.xml“, “”, “graf“, 600, 300);
?>

Acredite se quiser, com essa linha javascript e mais as 2 linhas PHP nós geramos o gráfico da imagem acima!

Como não há praticamente nada no arquivo PHP irei explicar apenas a linha que nos importa, a última linha.

 echo renderChart(“charts/FCF_Column3D.swf“, “data/dados.xml“, “”, “graf“, 600, 300);

Após incluirmos o arquivo FusionCharts na primeira linha do PHP nós chamamos a função renderChart que recebe alguns parâmetros e são eles na ordem:

1 parâmetro – caminho para o arquivo flash que irá gerar o gráfico.
2 parâmetro – caminho do arquivo XML que contém os dados que queremos exibir.
3 parâmetro – vazio, seria utilizado se ao invés de um arquivo estivessemos passando  uma variável, neste caso o parâmetro vazio seria o segundo que contém o caminho do arquivo.
4 parâmetro – nome do gráfico, dê o nome que quiser.
5 e 6 parâmetros – respectivamente largura e altura do gráfico na tela, altere como quiser.

Simples não?

Segundo exemplo
– Usando/concatenando uma váriavel PHP para gerar o XML

<script language=”javascript” src=“charts/fusioncharts.js”></script>
<?php
$strXML = “<graph xAxisName=’Meses’ yAxisName=’Acessos’>“;
$strXML .= “<set name=’Jan’ value=’462′ color=’AFD8F8′ />“;
$strXML .= “<set name=’Fev’ value=’857′ color=’F6BD0F’ />“;
$strXML .= “<set name=’Mar’ value=’671′ color=’8BBA00′ />“;
$strXML .= “<set name=’Abr’ value=’494′ color=’FF8E46’/>“;
$strXML .= “<set name=’Mai’ value=’761′ color=’008E8E’/>“;
$strXML .= “<set name=’Jun’ value=’960′ color=’D64646’/>“;
$strXML .= “<set name=’Jul’ value=’629′ color=’8E468E’/>“;
$strXML .= “<set name=’Ago’ value=’622′ color=’588526’/>“;
$strXML .= “<set name=’Set’ value=’376′ color=’B3AA00’/>“;
$strXML .= “<set name=’Out’ value=’494′ color=’008ED6’/>“;
$strXML .= “<set name=’Nov’ value=’761′ color=’9D080D’/>“;
$strXML .= “<set name=’Dez’ value=’960′ color=’A186BE’/>“;
$strXML .=  “</graph>“;
include(“includes/FusionCharts.php“);
echo renderChart(“charts/FCF_Line.swf“, “”, $strXML, “chart1“, 600, 300);
?>

Notem que as mudanças são:

– Ao invés de utilizarmos um arquivo XML, nós criamos e concatenamos a variável strXML com os valores requeridos no arquivo XML, como podem ver a estrutura do XML não muda, temos o atributo name que se refere à coluna o value que corresponde à altura da barra no gráfico e color que possui a cor em hexadecimal da barra.

– Já na função renderChart, o  segundo parâmetro está vazio e o terceiro possui a variável strXML assim como comentei mais acima, relembrando…

O segundo parâmetro é vazio quando passamos à função renderChart uma váriável php e o terceiro parâmetro é vazio quando passamos um arquivo XML.

Notem também que o nome do arquivo flash informado no primeiro parâmetro mudou, isso pq o FC dispoem de diversos tipos de gráficos que utilizam a mesma estrutura XML, deem uma vasculhada nos exemplos contidos na documentação do FC para ver os tipos de gráficos disponíveis. O arquivo flash utilizado neste exemplo irá gerar exatamente o gráfico abaixo:

Quando os gráficos que são gerados eles são animados, daí o flash. O FC É perfeito e estamos falando apenas das funções básicas da versão free, se quiserem se impressionar ainda mais olhem a versão comercial do FC, é de brilhar os olhos! 😉

Links:

FusionCharts vs. free:  http://www.fusioncharts.com/free/Download.asp?gMenuItemId=5

Nosso exemplo em ação e mais tipos de gráficos com o mesmo XML:  Exemplo

Tá legal, foi fácil entender o exemplo mas vocês terão que estruturar os diretórios como mostrei para que esses códigos do exemplo possam funcionar, a dica que dou é …

Baixe o FC e explore sua estrutura de arquivos. Verá que você não precisa fazer exatamente como eu fiz, teste os exemplos contidos no pacote mesmo. Se quiser a que eu modifiquei apenas para testes do exemplo acima, deixe um comentário aí que te mando por email, não quero colocar o link aqui! Mas não deixe de baixar o pacote completo do FC.

Últimas considerações:

– Se pretende colocar seu exemplo em um servidor linux não esqueça que o Linux entende FusionCharts e fusioncharts como 2 diretórios diferentes, ou seja, digamos que ele é CaSe sEnSiTiVe.

– Não deixe de explorar os métodos utilizados pela classe PHP, nesse exemplo não trabalhamos com a classe em si e seus métodos como no exemplo do PHPlot !

– Depois me arrisco em um post para mostrar um exemplo utilizando BD.

Abraços e até mais,

Rafael Clares

Este post tem 40 comentários

  1. cleber

    adorei o post…
    mas sou iniciante estou começando agora …
    seria super legal se mandasse o pacote…

  2. Marco

    Cara muito bacana o tutorial… ja to usando e gostei muito do resultado… só não achei uma forma de alinhar o grafico… pois ele sempre fica centralizado… e eu gostaria de deixar ele alinhado a esquerda… se puder dar uma força eu agradeço !!!

    abraço

    1. Rafael Clares

      Olá Marco, faça o seguinte no arquivo fusioncharts.php que é reponsável por gerar o gráfico tem uma linha que cria uma div assim div id="$chartIdDiv" align="center"
      altere para div id="$chartIdDiv" align="left" este código está na linha 86 do arquivo includes/fusioncharts.php depois da linha $render_chart basta procurar ok. Obrigado pelo comentário

  3. Liz

    Olá Rafael,
    gostei muito dos gráficos da FusionCharts, mas estou com um pouco de dificuldade de usar com BD. Será que tu já fez o exemplo?! Poste aí!!!
    Parabéns pelo Blog!!! Valew

  4. Fabio

    Muito útil cara, parabéns…

  5. Thiago

    Olá Rafael,

    parabéns pelo post.
    Achei muito didático, fiz os exemplos aqui e funcionou muito bem.
    Gostaria de saber se vc tem um tutorial PHP+FC utilizando banco de dados. Utilizo o postgres aqui e preciso buscar os dados da base. Se tiver algum exemplo e puder enviar pro meu e-mail fico muito grato.

    []’s

    1. Rafael Clares

      Thiago, obrigado pelo comentário.
      O exemplo proposto é http://clares.wordpress.com/2008/09/01/gerando-graficos-com-php-postgresql/
      no entanto não tem uma explanação muito legal, há tempos que estou querendo atualizar este post mas o tempo não tem sobrado viu … baixe o pacote e se tiver dúvidas vá me perguntando. Mas cara, por favor não vá direto no download ok, dê uma lida nas referências e links para entender legal.

      Abraços,

  6. Idol

    Oi, Rafael!

    Parabéns pelo post… Muito interesante!

    Só não estou conseguindo renderizar o gráfico no Browser. Estou utilizando o segundo exemplo, setando uma variável php para gerar o XML. Não dá erro na página… Ao invés disso aparece apenas a palavra “Chart.” Onde será que estou errado??

    Agradeço se puder me ajudar. 🙂

    Abraços!

      1. Idol

        Poxa, não funciona… 🙁

        O código que me enviou funciona perfeitamente no root do htdocs, sem problemas. Mas qdo entro com ele no contexto da minha aplicação, nada é exibido na div. Apenas a palavra “Chart”.

        Na verdade, estou usando o framework CodeIgniter. Acesso o Controller pela url que é responsável por chamar a View onde o código com o FusionCharts se encontra. Curiosamente, criei uma view na minha aplicação para testar o código que me enviou. Funcionou mais cedo e fiquei todo feliz! Quando foi agora, parou de funcionar.

        Será que é algum problema do Framework??

        Obrigado pela ajuda, Rafael! E parabéns pelo excelente trabalho.

        1. Rafael Clares

          Idol, é isso sim, mas não é problema no framework, é que depende de onde estão os diretórios e como está configurado o Rewrite.
          por exemplo, o CodeIgniter tem a estrutura abaixo:
          index.php (arquivo)
          system (diretório)

          a partir do system, já eras você não tem mais url absoluta!
          Onde estão, na hierarquia do CI, seus diretórios css, images, jscripts ?
          Dentro de views, fora?

          Uma dica para o CodeIgniter (há uns 15 meses eu quebrei cabeça também).
          Minha estrutura era assim no CI:

          – /
          – index.php
          – system
          – css
          – images
          – jscripts

          Daí você consegue a url absoluta porque está fora da aplicação, mesmo assim você precisa criar a regra abaixo no .htaccess

          <IfModule mod_rewrite.c>
          RewriteEngine on
          RewriteCond $1 !(index.php|images|css|jscripts|robots.txt|cgi-local|cgi-bin|phpinfo.php)
          RewriteRule ^(.*)$ index.php/$1 [L]
          </IfModule>

          Dá o rewrite será ignorado quando por ex exitir /css/ /images/ /jscripts/

          Suponha que na sua view queira colocar uma imagem e ficaria:
          <img src=”/images/foo.png”>

          Cara, não é difícil mas é chato, boa sorte, vai precisar um pouco.
          abs

  7. Idol

    Olá, Rafael!

    Minha estrutura no CodeIgniter é:

    – nome-da-minha-aplicacao
    – system
    – css
    – img
    – js
    – index.php

    Por enquanto estou testando tudo local, pois estou com um problema no servidor lá da empresa. Mesmo assim é preciso do arquivo .htaccess p/ testar localmente?

    Outra dúvida é: Com base na minha estrutura de diretórios, onde devem ficar os arquivos do FusionCharts? Por exemplo, posso deixar o FusionCharts.js na minha pasta js(pasta do javaScrip). E devo mudar algo no meu código baseado nos exemplos que vc postou aqui no post por eu estar usando o codeIgniter?

    Muito obrigado pela ajuda e rapidez nas respostas! Te tiver algo que possa fazer por você tb, por favor me avise! Sei lá, algum livro que queira ganhar 🙂

    Abraços!

    1. Rafael Clares

      – nome-da-minha-aplicacao
      – system
      – css
      – charts (dentro você deixa o diretório do fusion)
      – img
      – js
      – index.php

      exemplo do arquivo php:


      <script src="/charts/FusionCharts/FusionCharts.js"> </script >
      <?php
      print renderChart("/charts/FusionCharts/FCF_Column3D.swf", "Data/Data.xml", "", "myFirst", 600, 300, false, false);
      ?>

      Considerando que o diretório do fusion esteja dentro de /charts/ .

      abs

  8. claudio

    Olá muito boa a matéria. Eu baixei o fusion charts e criei o xml. Mas no meu modelo de negócio preciso do Funil de vendas. Pois bem meu xml alimenta ele, mas não está filtrando a partir do maior para o menor, será que vc poderia me ajudar?

    1. Rafael Clares

      Cláudio estou sem internet até segunda, só a partir desse dia poderia ajudar ok.

    2. Rafael Clares

      Cláudio, a questão é que o fusioncharts não vai filtrar esse resultado, ele monta o gráfico de acordo com a ordem do XML, então você precisa ordenar sua aplicação para que o XML seja gerado na ordem desejada.
      Se estiver montando o XML manualmente basta colocar na ordem que deseja, se está montando a partir de uma consulta SQL você precisa colocar o order by na sua query, ex:
      $query = “SELECT * FROM EMPLOYEES ODER BY EMPLOYEE_ID DESC” ; // maior para menor
      até logo

  9. fabiano

    rafael, tudo bom?

    estou precisando fazer colocar dados no Hover Caption Box do funsion charts. Você tem alguma dica?

    Abraços,

    1. Rafael Clares

      Olá Fabiano, infelizmente utilizei só o básico do FC como você vê aí, acredito que seja mais fácil você encontrar essa informação no site do fusion e até mesmo nos exemplos da versão free que pode ser baixada. Desculpe não poder ajuda-lo!

  10. vitor

    Ola!

    ótimo artigo!

    vc já trabalhou com o ZoomLine? (da fusionchart)… Não encontro um exemplo prático como o seu na web.

    Obrigado!

    1. Rafael Clares

      Vitor, lamento brother mas eu nem vi ainda. Fico te devendo essa.
      Abs

  11. Andre Chagas

    Cara, muito bom o seu exemplo bem pratico, vou ver se consigo fazer pegando as informações de um banco e montar o xml dentro de uma variavel, e gerar um grafico dinamico, queria saber se no campo values agente pode colocar mais de um valor pois o grafico que eu preciso é 2 valores para 1 item.

    Abraços e continue sempre com o seu trabalho ta muito bom.

  12. Júlio César

    Pegando dados do banco

    $sql = “SELECT * FROM info”;
    $query = mysql_query($sql);
    $num = mysql_num_rows($query)+1;

    $cores = array(‘AFD8F8′,’F6BD0F’,’8BBA00′,’FF8E46′,’008E8E’,’D64646′,’8E468E’,’588526′,’B3AA00′,’008ED6′,’9D080D’,’A186BE’);

    $strXML = “”;
    while($row = mysql_fetch_array($query))
    {
    $r = array_rand($cores, ($num-1));
    $cor = $cores[$r[0]];
    $ret = array_search($cor, $cores);
    unset($cores[$ret]);
    $strXML .= “”;
    }
    $strXML .= “”;

  13. Rogério Paulo Flores

    Ótimo post Rafael, bem didático me ajudou bastante.

    Vlw

  14. Dorival Junior

    Olá Rafael, muito boa dica! Funcionou tudo corretamente.
    Só tenho uma pergunta: no eixo y, existe como deixar apenas o valor sem acrescentar “.00” nos valores? Procurei no arquivo FusionCharts.php e nao encontrei onde poderia mudar…
    se puder dar uma força, agradeço,

    valeu!

      1. Dorival Junior

        Boaaa! Perfeito… Obrigado mais uma vez

        abraço!

  15. Marcia

    oiii, perfeito
    parabens!!!
    existe uma maneira de gerar 2 graficos diferentes, mas aparecendo na mesma pagina? na verdade gero 2 de linhas, porem um com qtd e outro com valores, gera normalmente, porem sobreescreve os charts….
    eu precisava um em cima na pagina, e outro logo abaixo…

    1. Rafael Clares

      Sim, você viu a demonstração, certo? Então, na demo tem mais de 5 gráficos!
      Veja esse exemplo abaixo é o exemplo da demo:

      include(“includes/FusionCharts.php”);
      echo renderChart(“charts/FCF_Funnel.swf”, “”, $strXML, “g1”, 600, 300);
      echo renderChart(“charts/FCF_Line.swf”, “”, $strXML, “g3”, 600, 300);
      echo renderChart(“charts/FCF_Column3D.swf”, “”, $strXML, “g2”, 600, 300);
      echo renderChart(“charts/FCF_Area2D.swf”, “Data/Area2D.xml”, “”, “g4”, 600, 300);
      echo renderChart(“charts/FCF_Pie3D.swf”, “”, $strXML, “g5”, 600, 600);

      mandei no seu email ok

  16. Evandro

    Estou com dificuldades na hora de Formatação número em FusionCharts, mesmo visualizando os link http://docs.fusioncharts.com/charts/contents/advanced/number-format/Number_Basics.html
    http://docs.fusioncharts.com/charts/contents/advanced/number-format/Number_Scaling.html
    http://docs.fusioncharts.com/charts/contents/advanced/number-format/Rec_Num_Scaling.html

    O meu codigo esta assim: <?php
    $bancos = $row_grafic_bancos['valor'];
    $despesas = $row_grafic_despesas['valor'];
    $folha = $row_grafic_folha['valor'];
    $fornecedor = $row_grafic_fornecedor['valor'];
    $impostos = $row_grafic_impostos['valor'];
    $pessoal = $row_grafic_pessoal['valor'];

    $strXML = "”;
    $strXML .= “”;
    $strXML .= “”;
    $strXML .= “”;
    $strXML .= “”;
    $strXML .= “”;
    $strXML .= “”;
    $strXML .= “”;
    include(“includes/FusionCharts.php”);
    echo renderChart(“charts/FCF_Column3D.swf”, “”, $strXML, “chart1”, 600, 300);
    ?>

    De qualquer maneira, tenho que agradecer meus olhos estão brilhando com os resultados desse tutorial.

    1. Evandro

      Opa Consegui:>
      <?php
      $bancos = $row_grafic_bancos['valor'];
      $despesas = $row_grafic_despesas['valor'];
      $folha = $row_grafic_folha['valor'];
      $fornecedor = $row_grafic_fornecedor['valor'];
      $impostos = $row_grafic_impostos['valor'];
      $pessoal = $row_grafic_pessoal['valor'];

      $strXML = "”;
      $strXML .= “”;
      $strXML .= “”;
      $strXML .= “”;
      $strXML .= “”;
      $strXML .= “”;
      $strXML .= “”;
      $strXML .= “”;
      include(“includes/FusionCharts.php”);
      echo renderChart(“charts/FCF_Column3D.swf”, “”, $strXML, “chart1”, 750, 300);
      ?>

      Valew otimo post

  17. Vagner Oliveira

    Man, existe algum meio de transforma essa medidas norte americana, em brasileira.

    1. Rafael Clares

      Vagner, o ideal é você dar uma lida nas docs do fusioncharts, tem como fazer sim mas você precisa ver na documentação, se ler os comentários irá perceber que outras pessoas também questionaram isso e eu passei o link da documentação, não é muito ruim de fazer, mas agora não tenho em mente como faz. Abs

  18. Nathalie

    http://pastebin.com/5UgVup2x
    mesmo lendo a documentação de ajuda, não consigo fazer com que apareça no gráfico os caracteres “ç ã õ”…
    alguma dica?

      1. Nathalie

        Oi Rafael, em primeiro lugar, muito obrigado pelo retorno, quero dizer que aprendi muito com tuas postagens, já consegui fazer gráfico com o FC, através da geração do XML pelo PHP, buscando valores (AVG) do banco de dados mysql, deu tudo certo!
        Já tentei sim com o ISO e não surtiu nenhum efeito, mas com a tua solução do link passado ficou tudo certo!
        Muito obrigado mais uma vez e parabéns pelo trabalho!

        1. Nathalie

          Deixo registrado também que a solução funciona no set name mas não no atributo yAxisName da graph (na vertical) =(

  19. Roberto Nascimento

    Rafael, baixei o suite do Fusion mas não possuiu o arquivo FusionChart.php. Você poderia disponibilizar o suite que utiliza?

Os comentários estão encerrados.