PHP - Graficar con php

   
Vista:
Imágen de perfil de siREZ

Graficar con php

Publicado por siREZ (201 intervenciones) el 29/09/2014 16:07:04
Cordial saludo.
tengo una tabla con el registro sistemático y secuencial de 3 valores numericos
temperatura, humedad ambiental y temperatura 2
los datos son tomados por la mañana y en la tarde o noche.
se guarda la fecha (día, mes, año y la hora)

quisiera graficar las 3 curvas en una sola pantalla.

que librería me recomiendan?
Donde la puedo descargar?

gracias por su ayuda.


siREZ
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

Graficar con php

Publicado por Gonzalo (338 intervenciones) el 29/09/2014 17:27:49
hay bastantes clases en google que te pueden ayudar.

si la grafica que vas a hacer es sencilla tu puedes hacerla.

suerte, salu2
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de siREZ

Graficar con php

Publicado por siREZ (201 intervenciones) el 29/09/2014 17:37:46
gracias por tu interés.

estoy haciendo una aplicación en localhost.
a veces no hay acceso a internet, no se si utilizando a google pueda descargar todo lo que necesito para la grafica.

siREZ
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Graficar con php

Publicado por Gonzalo (338 intervenciones) el 29/09/2014 17:47:58
si la grafica es de lineas te puedo ayudar, la clase no es dificil de hacer.

salu2
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de siREZ

Graficar con php

Publicado por siREZ (201 intervenciones) el 29/09/2014 18:17:06
Gracias Gonzalo.

el programa captura temp, humedad, temp2 son valores enteros
graba en la tabla el día, hora y los valores

en el eje x iría el dia y la hora

en el eje y los 3 valores, para que grafique 3 curvas

ejemplo de valores: temp: 23-24-21-30 etc
humedad: 54-78-67-45
temp2 ---> 2 ,5 , -3, 4

osea:
me conecto a la BBDD
extraigo los datos
genero la grafica

esto es lo que me falta.... generarla
he descargado varias librerias, pero al generar la grafica me muestra innumerables errores.


gracias

siREZ
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Graficar con php

Publicado por Gonzalo (338 intervenciones) el 29/09/2014 18:25:21
los datos se capturan cada hora? o cada dia?

dependiendo de la respuesta

que rango de horas necesitas? por ejemplo: las ultimas 24 horas.
que rango de dias? por ejemplo: los ultimos 7 dias

en una grafica los 3? o por separaado?

cuales son los maximos y minimos esperados por cada dato?

Temperatura
Humedad
Temp2

salu2
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Graficar con php

Publicado por Gonzalo (338 intervenciones) el 01/10/2014 00:05:50
a falta de datos me imagine como pudieras llegar a necesitar la grafica

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
<?php
header("content-type: image/jpeg");
 
class GraficarConPhp
{
	var $Blanco,$Negro;
	var $Azul,$Verde,$Cyan,$Rosa,$Rojo,$Amarillo;
 
	var $Color;
 
	var $Alto,$Ancho;
	var $MargenIzquierdo, $MargenDerecho, $MargenInferior, $MargenSuperior;
	var $EjeX = array(0,0,0,0);
	var $EjeY = array(0,0,0,0);
	var $Base,$Altura;
	var $Frecuencia;
 
	var $Calendario;
	var $Maximo;
 
  function __construct()
  {
		$this->Ancho=600;// defines ancho y largo, lo demas se ajusta en forma automatica
		$this->Alto=300;
 
		$Imagen=imagecreate($this->Ancho, $this->Alto );
		imagecolorallocate ($Imagen , 255 , 255 , 0 ); // fondo amarillo, cambialo al que quieras
 
		$this->CalcularDimensiones($Imagen);
 
		$this->DefineColores($Imagen);
		$this->CrearEjesXY($Imagen);
 
		$this->MsSql($Imagen);// aqui es donde se grafican los datos
 
		imagejpeg($Imagen);
		imagedestroy($Imagen);
  }
 
	function CrearEjesXY($Imagen)
	{
		imagesetthickness($Imagen, 2);
		imageline($Imagen,$this->EjeX[0],$this->EjeX[1],$this->EjeX[2],$this->EjeX[3],$this->Negro);
		imageline($Imagen,$this->EjeY[0],$this->EjeY[1],$this->EjeY[2],$this->EjeY[3],$this->Negro);
	}
 
	function DefineColores($Imagen)
	{
		$im = imagecreate(100, 100);
		$this->Negro = imagecolorallocate($Imagen, 0, 0, 0);
		$this->Azul = imagecolorallocate($Imagen, 0, 0, 255);
		$this->Verde = imagecolorallocate($Imagen, 0, 255, 0);
		$this->Cyan = imagecolorallocate($Imagen, 0, 255, 255);
		$this->Rojo = imagecolorallocate($Imagen, 255, 0, 0);
		$this->Rosa = imagecolorallocate($Imagen, 255, 0, 255);
		$this->Amarillo = imagecolorallocate($Imagen, 255, 128, 64);
		$this->Blanco = imagecolorallocate($Imagen, 255, 255, 255);
	}
 
	function CalcularDimensiones($Imagen)
	{//ajusta el area donde se va a imprimir el grafico
		$this->Maximo=50;
 
		$this->MargenIzquierdo=30;
		$this->MargenDerecho=30;
		$this->MargenInferior=30;
		$this->MargenSuperior=30;
 
		$this->Base=$this->Ancho-$this->MargenIzquierdo-$this->MargenDerecho;
		$this->Altura=$this->Alto-$this->MargenSuperior-$this->MargenInferior;
 
		$this->Frecuencia=floor($this->Base/10);
 
		$this->EjeY[0]=$this->MargenIzquierdo;
		$this->EjeY[1]=$this->MargenSuperior;
		$this->EjeY[2]=$this->MargenIzquierdo;
		$this->EjeY[3]=$this->Alto-$this->MargenInferior+20;
 
		$this->EjeX[0]=$this->MargenIzquierdo-20;
		$this->EjeX[1]=$this->Alto-$this->MargenInferior;
		$this->EjeX[2]=$this->Ancho-$this->MargenDerecho;
		$this->EjeX[3]=$this->Alto-$this->MargenInferior;
	}
 
 
	function MsSql($Imagen)
	{
		$Fecha=mktime(0,0,0,date("m"),date("d"),date("Y"));// el dia de hoy
 
		$Fecha-=(6*24*60*60);// los ultimo 6 dias, pero mas abajo lo cancelo a solo los primeros 10 registros
 
		$FechaInicia=date("Ymd",$Fecha);
		$FechaTermina=date("Ymd");
 
 
		$SqlCommand=
		"Select top 10".
		"	convert(varchar(30),fecha,102) as Fecha,".
		"	convert(varchar(30),fecha,114) as hora, ".
		"	temp,".
		"	humedad,".
		"	temp2 ".
		"	from Tabla".
		"	where Fecha between '$FechaInicia' and '$FechaTermina 23:59:59'".
		"	order by convert(varchar(10),fecha,102),convert(varchar(30),fecha,114)";
 
		//die($SqlCommand);
 
		$Sql=mssql_connect("111.222.333.444","Login","Password") or die("Connection error.");
		mssql_select_db("Tabla",$Sql) or die("Com Selection Error.");
		$MsSqlQuery=mssql_query($SqlCommand,$Sql) or die (mssql_error());
 
		$x=0;
 
		//inician los graficos
 
		while($Rs=mssql_fetch_array($MsSqlQuery,MSSQL_ASSOC))
		{
			if($x>0)
			{
				$this->Graficar($Imagen,$temp,$Rs["temp"],$x,$this->Rojo);
				$this->Graficar($Imagen,$humedad,$Rs["humedad"],$x,$this->Azul);
				$this->Graficar($Imagen,$temp2,$Rs["temp2"],$x,$this->Verde);
 
			}
			$temp=$Rs["temp"];
			$humedad=$Rs["humedad"];
			$temp2=$Rs["temp2"];
			$x++;
		}
	}
 
	function Graficar($Imagen,$v1,$v2,$x,$Color)
	{
		$x1=$this->MargenIzquierdo+($this->Frecuencia*($x-1));
		$y1=$this->Altura-floor(($v1*$this->Altura)/$this->Maximo)+$this->MargenSuperior;
 
		$x2=$this->MargenIzquierdo+($this->Frecuencia*$x);
		$y2=$this->Altura-floor(($v2*$this->Altura)/$this->Maximo)+$this->MargenSuperior;
 
		//die("x=$x, $x1,$y1,$x2,$y2");
		imageline($Imagen,$x1,$y1,$x2,$y2,$Color);// esta orden es la que genera la linea
	}
 
}
 
$SA=new GraficarConPhp();// y aqui inicia todo.
 
?>

para llamar el grafico solo le mandas la orden http://111.222.333.444/NombreDelArchivo.php

se va a generar solo, pero va a ocupar toda la ventana, si lo quieres importar dentro de una pagina que ya trae texto entonces usa esta orden


<img src="NombreDelArchivo.php" alt="Graficado" width="550px">

cambiale los colores, la frecuencia, ancho de linea, etc etc etc.
segun la frecuencia puedes poner lineas punteadas, etc, ya tu lo manejas como quieras.

espero sea de ayuda, suerte, salu2.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de siREZ

Graficar con php

Publicado por siREZ (201 intervenciones) el 01/10/2014 04:54:44
que bien, muchas gracias.

encontré algo y me ha quedado bien.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
<?php session_start();
 
//Includes
include "../../../../sources/TChart.php";
 
$chart = new TChart(1000,400);
$chart->getAspect()->setView3D(false);
$chart->getHeader()->setText("Temperatura Ambiental (rojo), Humedad Relativa (morado), Temperatura Area Frio (azul)");
 
$chart->getAxes()->getLeft()->setMinimumOffset(30);
$chart->getAxes()->getLeft()->setMaximumOffset(30);
 
$chart->getAxes()->getBottom()->setMinimumOffset(30);
$chart->getAxes()->getBottom()->setMaximumOffset(30);
 
$line1=new Line($chart->getChart());
$data = Array(32,24,25,30,28,33,35,32,26,25,39);
$line1->addArray($data);
 
$line2=new Line($chart->getChart());
$line2->addXY(0,4);
$line2->addXY(1,2);
$line2->addXY(2,-2);
$line2->addXY(3,0);
$line2->addXY(4,2);
$line2->addXY(5,-2);
$line2->addXY(6,3);
$line2->addXY(7,2);
$line2->addXY(8,-2);
$line2->addXY(9,0);
$line2->addXY(10,-4);
 
/* You can also use one of the following methods , in the case you want to 
specify a text or color for each point :

$line2->addXYColor(x,y,color)
$line2->addXYText(x,y,text)
$line2->addXYTextColor(x,y,text,color)
*/
 
 
$line3=new Line($chart->getChart());
$data = Array(53,57,39,55,50,56,45,48,57,39);
$line3->addArray($data);
 
foreach ($chart->getSeries() as $serie) {
  $pointer = $serie->getPointer();
  $pointer->setVisible(true);
  $pointer->getPen()->setVisible(false);
  $pointer->setHorizSize(3);
  $pointer->setVertSize(3);
 
  $marks = $serie->getMarks();
  $marks->setVisible(true);
  $marks->setArrowLength(5);
  $marks->getArrow()->setVisible(false);
  $marks->setTransparent(true);
}
 
$line1->getPointer()->setStyle(PointerStyle::$CIRCLE);
$line2->getPointer()->setStyle(PointerStyle::$TRIANGLE);
 
$line2->getLinePen()->setStyle(DashStyle::$DASH);
 
$chart->render("chart1.png");
$rand=rand();$usuario=$_SESSION['usuario'];
print '<font face="Verdana" size="2">'.$usuario.'<p>';
print '<img src="chart1.png?rand='.$rand.'">';
?>
 
 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
  <title>Temperatura y Humedad</title>
  <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-15" />
</head>
<body>
</body>
</html>

voy a probar tu solución a ver con cual me quedo.

gracias.

siREZ
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Graficar con php

Publicado por Gonzalo (338 intervenciones) el 01/10/2014 16:58:52
Exelente!.

es una pena que no pueda anexar imagenes con IE, la verdad me gustaria mostrarte esa clase trabajando en vivo.

(esta opcion no esta disponible en IE 10 o inferiores, recomendamos utilizar chrome, firefox o opera, lastima)

suerte, salu2.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de xve

Graficar con php

Publicado por xve (5520 intervenciones) el 01/10/2014 19:48:02
No dispones de ningún otro navegador?

Si no puedes, también puedes probar el firefox portable... http://portableapps.com/apps/internet/firefox_portable
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Graficar con php

Publicado por Gonzalo (338 intervenciones) el 01/10/2014 20:04:11
no firefox, no facebook, no twitter, no hotmail, no gmail, etc etc etc.

para que me entiendan mejor

la gerencia tiene una pantalla gigante en la pared detras del escritorio que dice 'NO!'. (alegoria)

no me han bloqueado el acceso a internet porque es con lo que trabajo.

pero si puedo les mando una imagen desde la casa.

salu2
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de siREZ

Graficar con php

Publicado por siREZ (201 intervenciones) el 01/10/2014 21:13:21
Gonzalo.

tu script me trabaja perfecto. gracias.

en el localhost donde monté mi aplicación trabaja con chrom.
les funcionó bien. Creo que no la voy a cambiar.

siREZ
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Graficar con php

Publicado por Gonzalo (338 intervenciones) el 01/10/2014 22:14:27
exelente!.

con algunas modificaciones lo puedes hacer como columnas, 3d, piramides, cinta, etc.

salu2
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Graficar con php

Publicado por Gonzalo (338 intervenciones) el 02/10/2014 01:02:02
graficos v2.0, esta en vivo en este momento (o sea que funciona), ustedes le agregan el titulo y los tags, no tiene mucho chiste.

la versrion 1 obtiene los datos directamente de la base de datos, en la version 2 los deben pasar por array.
no se si tiene limite, hagan pruebas a ver como sale, en este caso es una matriz de 4x5.

para ser honestos tiene un detalle en la ultima columna de la derecha, en graficas de lineas esa columna no se ocupa, es solo cuestion de condicionar la variable Frecuencia para que si es de lineas lo divida entre el numero de arrays-1 y con eso se arregla, pero voy de salida del trabajo no me diio tiempo de terminar esa parte.

otro detalle es que la matriz numerica debe ser perfecta, mismas columnas x cada renglon, si no es perfecta ... quien sabe que va a hacer, revisenlo.

y si es que se lo preguntan ... si, esta grafica es para unos reportes en web para mi trabajo, asi que si funciona.

<?php
require("Class/Graficas.Class");

var $Titulo;
var $Tags;
var $Datos;
var $Colores;

$Datos=array(array(290,170,123,142),array(531,442,564,783),array(-190,833,95,104),array(421,303,116,1250),array(150,-2,137,146));// este array es el que genera la grafica

$Graficas = new Graficas(
700,
400,
'Lineas',
$Datos
);// pasa los datos al constructor y de ahi la clase hace todo.

?>

y esta es la clase

<?php

class Graficas
{
var $Maximo,$Minimo,$Columnas;
var $Color,$sColor;

var $Base,$Altura,$Alto;
var $Imagen;
var $Frecuencia; // calcula la separacion entre las lineas punteadas

function __construct(
$Base,
$Altura,
$TipoGrafico,
$Datos
)
{

$this->Imagen=imagecreate($Base, $Altura);
imagecolorallocate($this->Imagen , 255 , 255 , 255 ); // fondo blanco, cambialo al que quieras

$this->DefineColores();
$this->MaximosYMinimos($Datos);
$this->CalcularDimensionesXY($Base, $Altura,$Datos);

switch($TipoGrafico)
{
case 1:
$this->GraficarColumnas();
break;
case 2:
$this->GraficarColumnas3d();
default:
$this->GraficarLineas($Datos);
break;
}

imagejpeg($this->Imagen);
imagedestroy($this->Imagen);
}

function DefineColores()
{
$this->Color["Negro"] = imagecolorallocate($this->Imagen, 0, 0, 0);
$this->Color["Azul"] = imagecolorallocate($this->Imagen, 0, 0, 255);
$this->Color["Verde"] = imagecolorallocate($this->Imagen, 0, 255, 0);
$this->Color["Cyan"] = imagecolorallocate($this->Imagen, 0, 255, 255);
$this->Color["Rojo"] = imagecolorallocate($this->Imagen, 255, 0, 0);
$this->Color["Rosa"] = imagecolorallocate($this->Imagen, 255, 0, 255); //o los colores que quieran
$this->Color["Amarillo"] = imagecolorallocate($this->Imagen, 255, 128, 64);
$this->Color["Blanco"] = imagecolorallocate($this->Imagen, 255, 255, 255);
}


function Cuenta(&$Maximo,&$Minimo,&$Columnas,$Datos)
{
if(is_array($Datos))
{
$Columnas=count($Datos);
foreach($Datos as $a)
{
$this->Cuenta($Maximo,$Minimo,$Columnas,$a);
}
}else
{
if($Maximo<$Datos)
{
$Maximo=$Datos;
}
if($Minimo>$Datos)
{
$Minimo=$Datos;
}
}
}

function MaximosYMinimos($Datos)
{
$this->Maximo=0;
$this->Minimo=0;
$this->Columnas=0;

$this->Cuenta($this->Maximo,$this->Minimo,$this->Columnas,$Datos);
}

function Color()
{
$Ok="";// no se ni porque puse esta linea, si quieren borrenla
switch($this->sColor)
{
case "Negro":
$this->sColor="Azul";
break;
case "Azul":
$this->sColor="Verde";
break;
case "Verde":
$this->sColor="Cyan";
break;
case "Cyan":
$this->sColor="Rojo";
break;
case "Rojo":
$this->sColor="Rosa";
break;
case "Rosa":
$this->sColor="Amarillo";
break;
case "Amarillo":
$this->sColor="Negro";
break;
default:
$this->sColor="Negro";
}

return $this->sColor;
}

function CalcularDimensionesXY($Ancho, $Alto,$Datos)
{
$this->MargenIzquierdo=30;
$this->MargenDerecho=30;
$this->MargenInferior=30;
$this->MargenSuperior=30;

$this->Base=$Ancho-$this->MargenIzquierdo-$this->MargenDerecho;
$this->Altura=$Alto-$this->MargenSuperior-$this->MargenInferior;

$this->Alto=(($this->Maximo*$this->Altura)/($this->Maximo-$this->Minimo));

$this->Frecuencia=floor($this->Base/$this->Columnas);

imagesetthickness($this->Imagen, 2);

imageline(
$this->Imagen,
$this->MargenIzquierdo,
$this->MargenSuperior,
$this->MargenIzquierdo,
$Alto-$this->MargenInferior+20,
$this->Color["Negro"]);

imageline(
$this->Imagen,
$this->MargenIzquierdo-20,
floor($this->MargenSuperior+(($this->Maximo*$this->Altura)/($this->Maximo-$this->Minimo))),
$Ancho-$this->MargenDerecho,
floor($this->MargenSuperior+(($this->Maximo*$this->Altura)/($this->Maximo-$this->Minimo))),
$this->Color["Negro"]);

imagesetthickness($this->Imagen, 1);

for($i=0;$i<=count($Datos);$i++)
{
imagedashedline($this->Imagen,$this->MargenIzquierdo+($i*$this->Frecuencia),$this->MargenSuperior,$this->MargenIzquierdo+($i*$this->Frecuencia),$Alto-$this->MargenInferior+20,$this->Color["Negro"]);
}
}

function Linea(&$c,&$Tmp,$Datos)
{
if(is_array($Datos))
{
$c=0;
$Tmp=0;
foreach($Datos as $D)
{
$this->Linea($c,$Tmp,$D);
}
}else
{
if($c==0)
{
$this->Color();
}else
{
imageline(
$this->Imagen,
$this->MargenIzquierdo+(($c-1)*$this->Frecuencia),
floor($this->MargenSuperior+$this->Alto-(($Tmp*$this->Altura)/($this->Maximo-$this->Minimo))),
$this->MargenIzquierdo+(($c)*$this->Frecuencia),
floor($this->MargenSuperior+$this->Alto-(($Datos*$this->Altura)/($this->Maximo-$this->Minimo))),
$this->Color[$this->sColor]);
}
$Tmp=$Datos;
$c++;
}
}

function GraficarLineas($Datos)
{
$c=0;
$Tmp=0;
$this->Linea($c,$Tmp,$Datos);
}

function GraficarColumnas()
{// si lo quieren en columnas, aqui las agregan
}

function GraficarColumnas3d()
{//si lo quieren en columnas en 3d aqui las agregan
}


}

?>

y eso es todo, asi de facil.

si le hacen mejoras avisenme.

espero les ayude, suerte, salu2.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar