buenas noches:
tengo el siguiente inconveniente. debo realizar las clases con sus respectivos metodos en php para que se grafique un arreglo de datos en forma de pie o torta y en forma de lineas, ya tengo hechas ambas clases y me muestran en el navegador las imagenes que se crearon, mi problema es que solo me grafican el ultimo dato del arreglo.
soy nueva en php y he hecho todo lo que he encontrado en la web pero no he logrado resolver el problema, ademas que en la web se encuentran son codigos para llamar librerias y en mi caso solo puedo usar las funciones del GD de php5.
<?php
class grafico_barras
{
private $image;
private $alto;
private $ancho;
private $titulo;
private $nombre_x;
private $nombre_y;
private $rango_ancho;
private $rango_alto;
private $color_texto;
private $color_cuadr;
private $max_x = 1;
private $min_x = 0;
private $max_y = 1;
private $min_y = 0;
private $margen_x = 60;
private $margen_y = 50;
private $cont = 0;
private $barra_ancho = 0.2;
private $color_fondo = array(255, 255, 255);
private $color = array(
array(255, 0, 0), array(128, 0, 128), array(0, 128, 0), array(0, 64, 128), array(0, 128, 40), array(128, 81, 0), array(0, 0, 255), array(128, 0, 68), array(0, 51, 128), array(102, 128, 0), array(87, 0, 128), array(0, 128, 61), array(128, 75, 0), array(69, 0, 128), array(0, 128, 31), array(128, 88, 0), array(65, 0, 128), array(255, 255, 0), array(17, 128, 0), array(0, 89, 128)
);
function dibujar($serie)
{
$this->image = imagecreate($this->ancho, $this->alto);
$this->tras_color($this->color_fondo);
$this->calcRango($serie);
$this->cuadricula();
Foreach($serie as $x=>$y)
{
$this->barras($x, $y);
}
putenv('GDFONTPATH=' . realpath('.'));
$fuente = 'Absolut_Pro_Bold_Italic_reduced.ttf';
$this->color_texto = imagecolorallocate($this->image, 0, 0, 0);
imagefttext($this->image, 12, 90, (($this->margen_x)/2), (((($this->alto)/2)-20)), $this->color_texto, $fuente, $this->nombre_y);
imagefttext($this->image, 15, 0, (($this->ancho/3)+strlen($this->titulo)), ($this->margen_y/2), $this->color_texto, $fuente, $this->titulo);
imagefttext($this->image, 12, 0, (($this->ancho/2)-strlen($this->nombre_x)), ($this->alto-($this->margen_y/2)), $this->color_texto, $fuente, $this->nombre_x);
header("content-type: image/png");
imagepng($this->image);
imagedestroy($this->image);
exit;
}
function tras_color($rgb = null)
{
if($rgb == null)
{
$rgb = $this->color[$this->cont];
$this->cont = ($this->cont) < 19 ? ($this->cont+1) : 0;
}
return imagecolorallocate($this->image, $rgb[0], $rgb[1], $rgb[2]);
}
function CalcRango($serie)
{
foreach($serie as $x=>$y)
{
if($x >= $this->max_x) $this->max_x = $x;
if($x < $this->min_x) $this->min_x = $x;
if($y >= $this->max_y) $this->max_y = $y;
if($y < $this->min_y) $this->min_y = $y;
}
$this->rango_ancho = $this->max_x-$this->min_x;
$this->rango_alto = $this->max_y-$this->min_y;
}
function cuadricula($tamano = 20)
{
$y = $this->min_y - $tamano;
while($y < ($this->max_y + $tamano))
{
$y0 = $this->translateCoordY($y);
$this->color_cuadr = imagecolorallocate($this->image, 191, 191, 191);
imageline($this->image, 0, $y0, $this->ancho, $y0, $this->color_cuadr);
$y += $tamano;
}
}
function barras($x, $y)
{
$p = Array
(
($x-$this->barra_ancho/2), $y,
($x+$this->barra_ancho/2), $y,
($x+$this->barra_ancho/2), 0,
($x-$this->barra_ancho/2), 0
);
$r = $this->translatePoly($p);
imagefilledpolygon($this->image, $r, sizeof($r)/2, $this->tras_color());
}
function translateCoordX($x)
{
return round($this->margen_x+($this->ancho-2*$this->margen_x)*($x-$this->min_x)/$this->rango_ancho);
}
function translateCoordY($y)
{
return round($this->margen_y-($this->alto-2*$this->margen_y)*($y-$this->max_y)/$this->rango_alto);
}
function translatePoly($p)
{
$r = Array();
for($i=0; $i<sizeof($p); $i+=2)
{
$r[] = $this->translateCoordX($p[$i]);
$r[] = $this->translateCoordY($p[$i+1]);
}
return $r;
}
function setTitulo($valor1)
{
$this->titulo = $valor1;
}
function setNombre_x($valor2)
{
$this->nombre_x = $valor2;
}
function setAlto($valor3)
{
$this->alto = $valor3;
}
function setAncho($valor4)
{
$this->ancho = $valor4;
}
function setNombre_y($valor5)
{
$this->nombre_y = $valor5;
}
}
$grafico_barras = new grafico_barras();
$grafico_barras->setTitulo ("Grafia de Barras");
$grafico_barras->setNombre_x ("Meses");
$grafico_barras->setNombre_y ("Ventas en Miles de Pesos");
$grafico_barras->setAlto (600);
$grafico_barras->setAncho (500);
$grafico_barras->dibujar(array(1, 20, 3, 40, 5, 60, 7, 80, 9, 100));
?>
agradezco de antemano toda la ayuda que me puedan brindar.
saludos
Linda.
tengo el siguiente inconveniente. debo realizar las clases con sus respectivos metodos en php para que se grafique un arreglo de datos en forma de pie o torta y en forma de lineas, ya tengo hechas ambas clases y me muestran en el navegador las imagenes que se crearon, mi problema es que solo me grafican el ultimo dato del arreglo.
soy nueva en php y he hecho todo lo que he encontrado en la web pero no he logrado resolver el problema, ademas que en la web se encuentran son codigos para llamar librerias y en mi caso solo puedo usar las funciones del GD de php5.
<?php
class grafico_barras
{
private $image;
private $alto;
private $ancho;
private $titulo;
private $nombre_x;
private $nombre_y;
private $rango_ancho;
private $rango_alto;
private $color_texto;
private $color_cuadr;
private $max_x = 1;
private $min_x = 0;
private $max_y = 1;
private $min_y = 0;
private $margen_x = 60;
private $margen_y = 50;
private $cont = 0;
private $barra_ancho = 0.2;
private $color_fondo = array(255, 255, 255);
private $color = array(
array(255, 0, 0), array(128, 0, 128), array(0, 128, 0), array(0, 64, 128), array(0, 128, 40), array(128, 81, 0), array(0, 0, 255), array(128, 0, 68), array(0, 51, 128), array(102, 128, 0), array(87, 0, 128), array(0, 128, 61), array(128, 75, 0), array(69, 0, 128), array(0, 128, 31), array(128, 88, 0), array(65, 0, 128), array(255, 255, 0), array(17, 128, 0), array(0, 89, 128)
);
function dibujar($serie)
{
$this->image = imagecreate($this->ancho, $this->alto);
$this->tras_color($this->color_fondo);
$this->calcRango($serie);
$this->cuadricula();
Foreach($serie as $x=>$y)
{
$this->barras($x, $y);
}
putenv('GDFONTPATH=' . realpath('.'));
$fuente = 'Absolut_Pro_Bold_Italic_reduced.ttf';
$this->color_texto = imagecolorallocate($this->image, 0, 0, 0);
imagefttext($this->image, 12, 90, (($this->margen_x)/2), (((($this->alto)/2)-20)), $this->color_texto, $fuente, $this->nombre_y);
imagefttext($this->image, 15, 0, (($this->ancho/3)+strlen($this->titulo)), ($this->margen_y/2), $this->color_texto, $fuente, $this->titulo);
imagefttext($this->image, 12, 0, (($this->ancho/2)-strlen($this->nombre_x)), ($this->alto-($this->margen_y/2)), $this->color_texto, $fuente, $this->nombre_x);
header("content-type: image/png");
imagepng($this->image);
imagedestroy($this->image);
exit;
}
function tras_color($rgb = null)
{
if($rgb == null)
{
$rgb = $this->color[$this->cont];
$this->cont = ($this->cont) < 19 ? ($this->cont+1) : 0;
}
return imagecolorallocate($this->image, $rgb[0], $rgb[1], $rgb[2]);
}
function CalcRango($serie)
{
foreach($serie as $x=>$y)
{
if($x >= $this->max_x) $this->max_x = $x;
if($x < $this->min_x) $this->min_x = $x;
if($y >= $this->max_y) $this->max_y = $y;
if($y < $this->min_y) $this->min_y = $y;
}
$this->rango_ancho = $this->max_x-$this->min_x;
$this->rango_alto = $this->max_y-$this->min_y;
}
function cuadricula($tamano = 20)
{
$y = $this->min_y - $tamano;
while($y < ($this->max_y + $tamano))
{
$y0 = $this->translateCoordY($y);
$this->color_cuadr = imagecolorallocate($this->image, 191, 191, 191);
imageline($this->image, 0, $y0, $this->ancho, $y0, $this->color_cuadr);
$y += $tamano;
}
}
function barras($x, $y)
{
$p = Array
(
($x-$this->barra_ancho/2), $y,
($x+$this->barra_ancho/2), $y,
($x+$this->barra_ancho/2), 0,
($x-$this->barra_ancho/2), 0
);
$r = $this->translatePoly($p);
imagefilledpolygon($this->image, $r, sizeof($r)/2, $this->tras_color());
}
function translateCoordX($x)
{
return round($this->margen_x+($this->ancho-2*$this->margen_x)*($x-$this->min_x)/$this->rango_ancho);
}
function translateCoordY($y)
{
return round($this->margen_y-($this->alto-2*$this->margen_y)*($y-$this->max_y)/$this->rango_alto);
}
function translatePoly($p)
{
$r = Array();
for($i=0; $i<sizeof($p); $i+=2)
{
$r[] = $this->translateCoordX($p[$i]);
$r[] = $this->translateCoordY($p[$i+1]);
}
return $r;
}
function setTitulo($valor1)
{
$this->titulo = $valor1;
}
function setNombre_x($valor2)
{
$this->nombre_x = $valor2;
}
function setAlto($valor3)
{
$this->alto = $valor3;
}
function setAncho($valor4)
{
$this->ancho = $valor4;
}
function setNombre_y($valor5)
{
$this->nombre_y = $valor5;
}
}
$grafico_barras = new grafico_barras();
$grafico_barras->setTitulo ("Grafia de Barras");
$grafico_barras->setNombre_x ("Meses");
$grafico_barras->setNombre_y ("Ventas en Miles de Pesos");
$grafico_barras->setAlto (600);
$grafico_barras->setAncho (500);
$grafico_barras->dibujar(array(1, 20, 3, 40, 5, 60, 7, 80, 9, 100));
?>
agradezco de antemano toda la ayuda que me puedan brindar.
saludos
Linda.