Gerando gráficos a partir do banco de dados – PHP + PostgreSQL
Gerando gráficos com PHP + PostgreSQL + FusionCharts
Pessoal, como eu havia prometido estou postando um exemplo de como gerar gráficos à partir do BD com PHP. Neste exemplo utilizaremos o PHP5 + PostgreSQL, usaremos também a classe de conexão já mostrada em outro post aqui (Classe conexão PHP + PostgreSQL).
O FusionCharts que iremos utilizar para gerar os gráficos também já foi abordado aqui de outra forma (veja o post do Fusioncharts).
Dê uma revisada nos 2 posts acima e volte aqui para não ficar perdido!
Bem, não vou abordar assuntos já discutidos em outros posts, então vamos direto ao assunto ok.
Neste exemplo estamos gerando um gráfico que mostra os usuários cadastrados por cidade.
Baixem o pacote .rar, peguem o arquivo .sql, criem a base e tabela no postgres e populem a tabela. No arquivo .sql já estão todos os dados necessários para popular a tabela bastando apenas mudar os dados para os dados desejados.
O arquivo index.php
<script language=”Javascript” src=”charts/FusionCharts.js”></script>
<?
#Incluindo a classe conexao
include ‘includes/conexao.class.php‘;
#Incluindo a classe do Fusion
include ‘includes/FusionCharts_Gen.php‘;
#Criando a conexao
$con = new Conexao(“localhost”,”postgres”,”postgres”,”contrib“);
#Abrindo a conexao
$con->open();
#Criando o obj fusion
$FC = new FusionCharts(“column3D“,”650“,”400“);
#Setando o diretorio que contem os arquivos .swf
$FC->setSwfPath(“charts/“);
# Setando os atributos para o grafico
$FC->setChartParams(“caption=Usuarios; xAxisName=Cidades; yAxisName=Usuarios; decimalPrecision=0;“);
#Selecionando/contando os usuarios por cidade
$queryCid = pg_query(“select * from cidades“);
while($row = pg_fetch_array($queryCid))
{
$idcidade = $row[‘idcidade‘];
$nomecidade = $row[‘nomecidade‘];
$numCidUsu = pg_num_rows(pg_query(“select * from usuarios where idcidade = $idcidade“));
#Adicionando os dados nas barras ( usuarios a cidade)
$FC->addChartData($numCidUsu,”name=$nomecidade“);
}
#Gera/renderiza o grafico
$FC->renderChart();
?>
Note que foi utilizada a classe do FusionCharts (não abordada em posts anteriores) para criar o objeto e criar o gráfico.
Para não complicar nada, estou disponibilizando os arquivos do exemplo (sql, php, fusion e js).
Não há muito o que eu comentar neste exemplo devido aos comentários do código e os demais posts sobre o assunto. Mas sintam-se à vontade para perguntar, terei o maior prazer em responde-los.
Obs: Alterem as informações (usuario, senha, base) da classe conexao.class.php (contida no diretório includes/ do pacote).
Links:
P.S Obrigado aqueles que comentaram e pediram esse post, sei como é, alguns só querem achar tudo pronto e pensam que o que satisfaz um cara que fica que nem loko de madrugada escrevendo artigos é a quantidade de downloads.
Abraços,
Rafael Clares
Parabéns pelo blog. Posts de grande utilidade
Opa…achei o post
Valew Rafael!!!!!!!!
Olá adorei o post!
a ferramenta é bem interessante, estou procurando a tempos uma ferramenta de grafico para trabalhar com php que seja free.
Vi os exemplos em php, mas nao encontrei nenhum com legenda, vc sabe ajeitar a legenda do grafico de multi-séries para que ela fique do lado direito do grafico?
muito obrigada
beatriz
muito obrigado pelo post, esta a precisando muito desse grafico…
vc é o cara!!!
valeu
VAleu cara me ajudou muito
Parabéns pelo blog!
Sou iniciante, estou tentando fazer o gráfico AngularGauge,até então nada.
Pode me dar alguma dica sobre?
Agradeço
Dionete, neste post é abordado o tema “gráficos com php” mas não conheço os tipo de gráficos, bem, o código proposto funciona, se tiver alguma dificuldade com o código você pode informar os erros e detalhes para eu tentar de ajudar…
abraços
haeee!!!! otimo post, mas assim, tem como interagir o codigo com html, ou melhor, dentro de um formulario? É que estou tentando criar um formulario (html), e no mesmo quero colocar o grafico, só que ate agora não encontrei uma classe que funcione em pagina que tenha codigo em htmt.
Mara, funciona sim com html, normal. Dê uma olhada nesse link: http://www.fusioncharts.com/free/docs/Contents/FirstChart.html
No caso do FusionCharts como é em flash entãoé como se você estivesse inserindo qualquer elemento flash no html, enfim, não deixa de ser uma animação.
Até logo,
parabéns! é a primeira vez que comento num post, gostei da sinceridade no fim do tópico.rs =D abraço
Rafael, muito bom seu post!!!
Estou tentando fazer um com consulta SQL, gostaria que vc me ajudasse!!!
Tenho uma tabela com os campos, equipe, mes, idpedidos.
Tenho que gerar um grafico onde mostre no mes as equipe e total de pedidos, até consegui fazer, porém ele esta bagunçando os valore. por exemplo o total da equipe “Adminitrativo” esta saindo no mês de novembro e deveria sair no mês de Abril.
Segue o codigo que estou usando:
$strQueryCategories = ” select distinct mes as mes from medicao ORDER BY equipe, mes “;
$resultCategories = mysql_query($strQueryCategories) or die(mysql_error());
$strQueryData = ” select equipe, mes, count(idpedido) as total from medicao group by equipe, mes order by equipe, mes “;
$resultData = mysql_query($strQueryData) or die(mysql_error());
$strXML = “”;
// Build category XML
$strXML .= buildCategories ($resultCategories, “mes” );
// Build datasets XML
$strXML .= buildDatasets ( $resultData, “total”, “equipe”);
//Finally, close element
$strXML .= “”;
//Create the chart – Pie 3D Chart with data from strXML
echo renderChart(“../../FusionCharts/StackedColumn3D.swf”, “”, $strXML, “FactorySum”, 700, 400, false, true);
// Free database resource
mysql_close($con);
/***********************************************************************************************
* Function to build XML for categories
* @param $result Database resource
* @param $labelField Field name as String that contains value for chart category labels
*
* @return categories XML node
*/
function buildCategories ( $result, $labelField )
{
$strXML = “”;
if ($result) {
$strXML = “”;
while($ors = mysql_fetch_array($result)) {
$strXML .= “”;
}
$strXML .= “”;
}
return $strXML;
}
/***********************************************************************************************
* Function to build XML for datesets that would contain chart data
* @param $result Database resource. The data should come ordered by a control break
field which would require to identify datasets and set its value to
dataset’s series name
* @param $valueField Field name as String that contains value for chart dataplots
* @param $controlBreak Field name as String that contains value for chart dataplots
*
* @return Dataset XML node
*/
function buildDatasets ($result, $valueField, $controlBreak )
{
$strXML = “”;
if ($result) {
$controlBreakValue =””;
while( $ors = mysql_fetch_array($result) ) {
if( $controlBreakValue != $ors[$controlBreak] )
{
$controlBreakValue = $ors[$controlBreak];
$strXML .= ( $strXML ==”” ? “” : “”) . ( “” ) ;
}
$strXML .= “”;
}
$strXML .= “”;
}
return $strXML;
}
?>
Michel acredito que a dificuldade esteja na cláusula SQL, o ideal é verificar no seu SGBD se o retorno da query está correto e só aí colocar a query na aplicação.
Verifique no seu editor sql se os dados retornados estão vindo corretamente. E se a função buildDatasets está formando o xml corretamente.
Fala Rafael.
Estou precisando muito da sua ajuda!
Até hj, não consegui gerar o grafico.
Estou usando o foreach em vez de função porém também não estou tendo sucesso, gostaria que vc me ajudasse. veja o código abaixo.
Tenho uma tabela onde temos equipe, mes, total de medições.
Preciso que mostre o total de medições no mes de cada equipe, por exmplo no mês de janeiro a equipe ADM teria 20 medições, a equipe Leves teria 50 e a equipe de Pesados teria 35.
Isso seria feito num grafico de colunas.
FusionCharts – Array Example using Multi Series Column 3D Chart
<?php
$servidor = "localhost";
$usuario = "root";
$senha = "";
$banco = "plantap";
$con = mysql_connect($servidor, $usuario, $senha);
mysql_select_db ($banco);
$busca=mysql_query("select distinct mes, equipe, count(*) as total from medicao group by mes, equipe ");
while ($dados=mysql_fetch_array($busca))
{
$time[$dados['equipe']][$dados['mes']]=$dados['total'];
}
//Initialize element
$strXML = “”;
//Initialize element – necessary to generate a multi-series chart
$strCategories = “”;
//Initiate elements
foreach($time as $equipe=>$meses){
$strDataCurr = “”;
// echo $equipe;
}
//Iterate through the data
foreach($time as $equipe=>$meses){
foreach($meses as $mes=>$total){
//Append to strCategories
$strCategories .= “”;
// echo $mes;
//Add to both the datasets
$strDataCurr .= “”;
//echo $total;
}
}
//Close element
$strCategories .= “”;
//Close elements
$strDataCurr .= “”;
//Assemble the entire XML now
$strXML .= $strCategories . $strDataCurr . “”;
//Create the chart – MS Column 3D Chart with data contained in strXML
echo renderChart(“../../FusionCharts/StackedColumn3D.swf”, “”, $strXML, “productSales”, 900, 400, false, true);
?>
Michel, cara essa query está correta ? Digo, se você executar essa query no SGBD ela retorna o resultado corretamente ?
Faça um dump apenas das tabelas usadas para gerar o gráfico e me mande juntamente como arquivo php que está tentando gerar o gráfico, também a descrição do problema.
[email protected]
Só que essa semana brother eu to ferrado aqui de trabalho!
Abraço
Olá Rafael !
Primeiro queria agradecer pela ajuda. Li seus posts foram essenciais para mim.
Consegui gerar um gráfico dinâmico com PHP+PostgreSQL+FusionCharts. Ficou Show !
Aê brother, que firmeza!
Fico muito feliz quando alguém volta para escrever que “deu certo”. No geral só escrevem os “erros” mas quando funciona ninguém diz;
Esse tipo de atitude me motiva a manter o blog.
Muito obrigado e todo sucesso para você irmão. Vlw ;D
Ola Rafael, primeiramente gostaria muito de agradecer os seus posts, eles foram de suma importancia para eu conseguir fazer os meus graficos, apenas gostaria de uma ajuda sua. Quando se plota um grafico do tipo Line, passando por parametro FCF_Line.swf, ao criar o grafico, ele coloca o valor de todos os parametros passados no campo set name do XML no eixo X, teria como não mostrar esses valores, já que o valor é mostrado em cada ponto do grafico quando se coloca o mouse encima.
Fala Pedro, cara, tente passar o seguinte parâmetro showValues=’0′, exemplo:
Onde está gerando o cabeçalho do XML
graph xAxisName=’Meses’ yAxisName=’Acessos’ showValues=’0′
Veja http://docs.fusioncharts.com/charts/contents/AttDesc/ToolTip.html
Dê uma explorada nas docs
http://docs.fusioncharts.com/charts/
abs
Obrigado pelo feedback tão rápido, tentei passando o parametro showValues=’0′ e dessa forma ele não exibe os valores nos pontos do gráfico, eu quero é não exibir o valor do set name no eixo X, voce pode esta se perguntanodo pq? Porque o meu valor é uma string grande, quando o gráfico é plotado uma string sobrepoem outra. Aproveitando o reply, sabe como se mexe na escala? É automaticamente de 10 em 10? Não da pra diminuir?
Pedro, esse nível de detalhe você só vai encontrar na documentação do fc. Acho que seria legal você perder um tempinho lá! Infelizmente eu também não tive tempo de testar todas as possibilidades;
Olá Rafael,
Parabéns pelo seu Blog, pois tem muita coisa interessante.
Eu estou precisando fazer alguns gráficos a partir de dados geoespaciais. Os dados geoespaciais são de focos de calor na Amazônia. A intenção é obter gráficos por estados e/ou por municípios dessses dados, eu os tenho em tabela no formato shapefile e os mesmos estão no banco de dados Postgres. Com as informações do seu blog consegui efetuar a conexão, porém não consegui gerar o gráfico mesmo seguindo as orientações suas sobre gerar gráficos com PHP + PostgreSQL + FusionCharts .
Vc poderia me ajudar fornecendo mas algumas informações de como posso proceder para fazer esses gráficos?
Desde já agradeço
Valderli, obrigado pelo comentário;
Nesse caso é preciso que você informe onde está havendo a dificuldade, se exibe alguma mensagem de erro ou até mesmo como está se comportando seu script;
Tente copiar o trecho do código que você montou no pastebin.com e me mande o link aqui no comentário, assim eu consigo dar uma olhada no código.
Não cole o código nos comentários porque geralmente não aparecem.;
Abs
Rafael, obrigado pela atenção.
Consegui encontrar o erro estava na parte que trata sobre:
#Selecionando/contando os usuários por cidade
$queryCid = pg_query(“select * from cidades“);
while($row = pg_fetch_array($queryCid))
{
$idcidade = $row[‘idcidade’];
$nomecidade = $row[‘nomecidade’];
$numCidUsu = pg_num_rows(pg_query(“select * from usuarios where idcidade = $idcidade“));
#Adicionando os dados nas barras ( usuarios a cidade)
$FC->addChartData($numCidUsu,”name=$nomecidade“);
}
Que no meu caso no lugar de cidade eu coloquei os estados e no lugar de usuários eu coloquei os focos de calor. Antes não estava dando certo pq eu não havia selecionado corretamente os “ids” de cada tabela (shapefile).
Eu gostaria de tirar mais uma dúvida. É pq como alguns nomes de estados têm acentos e estes no gráfico aparecem com caracteres diferentes (exemplo: o estado de Rondônia que tem o acento circunflexo. No gráfico fica assim: Rondã”nia. É possível resolver isso?
Obrigado mais uma vez.
Derlli, use o utf8_decode();
Ex:
$uf – utf8_decode( $rows[‘uf’] );
abs
Obrigado Rafael.
Funcionou. Só lembrando que no lugar do sinal – tive que colocar um símbolo de = pra funcionar corretamente.
Valeu..
kkkkkkkkkkk foi falha de digitação, que mancada a minha!
Abs
Rafael queria mais uma ajuda sua.
É o seguinte, no exemplo que vc colocou (corrige-me se eu estiver errado) a função “pg_num_rows” retorna a quantidade de linha para cada “$idcidade”. Eu gostaria de saber como faço para retornar o valor de cada linha referente ao idcidade, ou seja, eu quero que retorne o valor e não a quantidade de linhas com o mesmo valor. Até pq o que pretendo fazer agora é que cada linha apresenta um valor diferente.
Nesse caso como ficaria a consulta sql para o banco de dados PostgreSQL para gerar o gráfico?
Obrigado mais uma vez Rafael.
Valderli, o id da cidade já está sendo retornado na linha:
$idcidade = $row[‘idcidade’];
Basta usa-lo onde desejar, se não vai usar pg_num_rows, poderá remover a linha que contém tal comando;
Rafael,
Ao remover não aparece nada no gráfico
Deixa eu explicar melhor o que eu quero
Seria uma tabela assim:
idcidade nome_cidade usuarios_cidades
1 Angra dos Reis 100
2 Buzios 300
3 Seropédica 500
Apartir dessa tabela que está no bando de dados PostgresSQL gerar uma gráfico mostrando a quantidade de usúarios por cidade
Como ficaria a consulta sql para gerar o gráfico?
Obrigado
Rafael,
Descobri o que estava acontecendo. Era exatamente o que vc falou, porém eu havia esquecido de alterar como por exemplo o $numCidUsu para $idcidade em $FC->addChartData($numCidUsu,”name=$nomecidade“);
Obrigado…..valeu até mais….
Muito interessante o post, parabéns.
Valeu Rafael. Estou começando agora a trabalhar com gráficos e seus post estão me ajudando muito.
Muito obrigado mesmo!
Olá, Rafael. Parabéns pelo post. Consigo criar gráficos com PHP + Fusioncharts perfeitamente, porém, preciso colocar mais de um gráfico na mesma página e não estou conseguindo. Qual é a melhor maneira de fazer isso?
Dá uma olhada nos fontes do exemplo
Boa tarde rafael
preciso gerar um grafico, onde seleciono no banco mysql o registro mais antigo e o mais recente do usuario e ao gerar o grafico uma barra do grafico é o primeiro registro e outra barra o registro mais recente.
Mas todos os exemplos que vi são select sem condicao, teria alguma dica para me ajudar?
Obrigada