'#000000', 'color' => '#000000', 'alpha' => 50); $colors['pep2'] = array('border' => '#ff7f00', 'color' => '#ff0000', 'alpha' => 50); $colors['pep3'] = array('border' => '#ff0000', 'color' => '#00ff00', 'alpha' => 50); $colors['pep4'] = array('border' => '#000000', 'color' => '#0000ff', 'alpha' => 50); */ $rgb_color = array(); foreach($colors as $i => $color) { $rgb['border'] = html2rgb($color['border']); $rgb_color[$i]['border']['R'] = $rgb['border'][0]; $rgb_color[$i]['border']['G'] = $rgb['border'][1]; $rgb_color[$i]['border']['B'] = $rgb['border'][2]; $rgb['color'] = html2rgb($color['color']); $rgb_color[$i]['color']['R'] = $rgb['color'][0]; $rgb_color[$i]['color']['G'] = $rgb['color'][1]; $rgb_color[$i]['color']['B'] = $rgb['color'][2]; $rgb_color[$i]['alpha'] = $color['alpha']; } } } if($graph_type != 'pie3d' && $graph_type != 'pie2d') { $pixels_between_xdata = 25; $max_xdata_display = round($width / $pixels_between_xdata); $ndata = count($data); if($max_xdata_display > $ndata) { $xdata_display = $ndata; } else { $xdata_display = $max_xdata_display; } $step = round($ndata/$xdata_display); $c = 0; foreach($data as $i => $d) { $data_values[] = $d; if (($c % $step) == 0) { $data_keys[] = $i; } else { $data_keys[] = ""; } $c++; } //debugPrint($data_values); } switch($graph_type) { case 'pie3d': case 'pie2d': pch_pie_graph($graph_type, array_values($data), array_keys($data), $width, $height); break; case 'polar': case 'radar': pch_radar_graph($graph_type, $data_values, $data_keys, $width, $height); break; case 'hbar': pch_horizontal_graph($graph_type, $data_keys, $data_values, $width, $height, $xaxisname, $yaxisname); break; case 'progress': pch_progress_graph($graph_type, $data_keys, $data_values, $width, $height, $xaxisname, $yaxisname); break; case 'vbar': pch_bar_graph($graph_type, $data_keys, $data_values, $width, $height, $rgb_color, $xaxisname, $yaxisname); break; case 'area': case 'spline': pch_vertical_graph($graph_type, $data_keys, $data_values, $width, $height, $rgb_color, $xaxisname, $yaxisname, false, $legend); break; case 'threshold': pch_threshold_graph($graph_type, $data_keys, $data_values, $width, $height, $xaxisname, $yaxisname, $title); break; case 'scatter': pch_scatter_graph($data_keys, $data_values, $width, $height, $xaxisname, $yaxisname); break; } function pch_pie_graph ($graph_type, $data_values, $legend_values, $width, $height) { /* CAT:Pie charts */ /* Create and populate the pData object */ $MyData = new pData(); $MyData->addPoints($data_values,"ScoreA"); $MyData->setSerieDescription("ScoreA","Application A"); $legend_values = array('日本語', '九州', '訓読み', '北海道'); /* Define the absissa serie */ $MyData->addPoints($legend_values,"Labels"); $MyData->setAbscissa("Labels"); /* Create the pChart object */ $myPicture = new pImage($width,$height,$MyData,TRUE); /* Set the default font properties */ $myPicture->setFontProperties(array("FontName"=>"../fonts/code.ttf","FontSize"=>8,"R"=>80,"G"=>80,"B"=>80)); /* Create the pPie object */ $PieChart = new pPie($myPicture,$MyData); /* Draw an AA pie chart */ switch($graph_type) { case "pie2d": $PieChart->draw2DPie($width/4,$height/2,array("DataGapAngle"=>0,"DataGapRadius"=>0, "Border"=>FALSE, "BorderR"=>200, "BorderG"=>200, "BorderB"=>200, "Radius"=>$width/4, "ValueR"=>0, "ValueG"=>0, "ValueB"=>0)); break; case "pie3d": $PieChart->draw3DPie($width/4,$height/2,array("DataGapAngle"=>10,"DataGapRadius"=>6, "Border"=>TRUE, "Radius"=>$width/4, "ValueR"=>0, "ValueG"=>0, "ValueB"=>0, "WriteValues"=>FALSE)); break; } /* Write down the legend next to the 2nd chart*/ $PieChart->drawPieLegend($width/1.5,$height/4, array("R"=>255,"G"=>255,"B"=>255)); /* Enable shadow computing */ $myPicture->setShadow(TRUE,array("X"=>3,"Y"=>3,"R"=>0,"G"=>0,"B"=>0,"Alpha"=>10)); /* Render the picture */ $myPicture->stroke(); } function pch_radar_graph ($graph_type, $data_values, $legend_values, $width, $height) { /* CAT:Radar/Polar charts */ /* Create and populate the pData object */ $MyData = new pData(); $MyData->addPoints($data_values,"ScoreA"); $MyData->setSerieDescription("ScoreA","Application A"); /* Define the absissa serie */ $MyData->addPoints($legend_values,"Labels"); $MyData->setAbscissa("Labels"); /* Create the pChart object */ $myPicture = new pImage($width,$height,$MyData,TRUE); /* Set the default font properties */ $myPicture->setFontProperties(array("FontName"=>"../fonts/code.ttf","FontSize"=>8,"R"=>80,"G"=>80,"B"=>80)); /* Create the pRadar object */ $SplitChart = new pRadar(); /* Draw a radar chart */ $myPicture->setGraphArea(20,25,$width-10,$height-10); /* Draw an AA pie chart */ switch($graph_type) { case "radar": $Options = array("SkipLabels"=>0,"LabelPos"=>RADAR_LABELS_HORIZONTAL, "LabelMiddle"=>FALSE,"Layout"=>RADAR_LAYOUT_STAR,"BackgroundGradient"=>array("StartR"=>255,"StartG"=>255,"StartB"=>255,"StartAlpha"=>100,"EndR"=>207,"EndG"=>227,"EndB"=>125,"EndAlpha"=>50), "FontName"=>"../fonts/code.ttf","FontSize"=>6); $SplitChart->drawRadar($myPicture,$MyData,$Options); break; case "polar": $Options = array("Layout"=>RADAR_LAYOUT_CIRCLE,"BackgroundGradient"=>array("StartR"=>255,"StartG"=>255,"StartB"=>255,"StartAlpha"=>100,"EndR"=>207,"EndG"=>227,"EndB"=>125,"EndAlpha"=>50), "FontName"=>"../fonts/code.ttf","FontSize"=>6); $SplitChart->drawRadar($myPicture,$MyData,$Options); break; } /* Render the picture */ $myPicture->stroke(); } /* TOFIX */ function pch_bar_graph ($graph_type, $index, $data, $width, $height, $rgb_color = false, $xaxisname = "", $yaxisname = "", $show_values = false, $show_legend = true) { /* CAT: Vertical Bar Chart */ if(is_array($data[0])) { $data2 = array(); foreach($data as $i =>$values) { $c = 0; foreach($values as $value) { $data2[$index[$c]][$i] = $value; $c++; } } $data = $data2; } else { $data = array($data); } /* Create and populate the pData object */ $MyData = new pData(); foreach($data as $i => $values) { $MyData->addPoints($values,"bar"); if($rgb_color !== false) { $MyData->setPalette($i, array("R" => $rgb_color[$i]['color']["R"], "G" => $rgb_color[$i]['color']["G"], "B" => $rgb_color[$i]['color']["B"], "BorderR" => $rgb_color[$i]['border']["R"], "BorderG" => $rgb_color[$i]['border']["G"], "BorderB" => $rgb_color[$i]['border']["B"], "Alpha" => $rgb_color[$i]['alpha'])); } } $MyData->setAxisName(0,$yaxisname); $MyData->addPoints($index,"Xaxis"); $MyData->setSerieDescription("Xaxis", $xaxisname); $MyData->setAbscissa("Xaxis"); /* Create the pChart object */ $myPicture = new pImage($width,$height,$MyData); /* Turn of Antialiasing */ $myPicture->Antialias = FALSE; /* Add a border to the picture */ //$myPicture->drawRectangle(0,0,$width,$height,array("R"=>0,"G"=>0,"B"=>0)); /* Set the default font */ $myPicture->setFontProperties(array("FontName"=>"../fonts/code.ttf","FontSize"=>10)); /* Define the chart area */ $myPicture->setGraphArea(30,20,$width,$height-100); /* Draw the scale */ // TODO: AvoidTickWhenEmpty = FALSE When the distance between two ticks will be less than 50 px // TODO: AvoidTickWhenEmpty = TRUE When the distance between two ticks will be greater than 50 px $scaleSettings = array("AvoidTickWhenEmpty" => FALSE, "AvoidGridWhenEmpty" => FALSE, "GridR"=>200,"GridG"=>200,"GridB"=>200,"DrawSubTicks"=>TRUE,"CycleBackground"=>TRUE, "Mode"=>SCALE_MODE_START0, "XMargin" => 40, "LabelRotation" => 90); $myPicture->drawScale($scaleSettings); if($show_legend) { /* Write the chart legend */ $myPicture->drawLegend($height/2,$width/1.8,array("Style"=>LEGEND_NOBORDER,"Mode"=>LEGEND_HORIZONTAL)); } /* Turn on shadow computing */ $myPicture->setShadow(TRUE,array("X"=>0,"Y"=>1,"R"=>0,"G"=>0,"B"=>0,"Alpha"=>10)); /* Draw the chart */ $settings = array("ForceTransparency"=>"-1", "Gradient"=>TRUE,"GradientMode"=>GRADIENT_EFFECT_CAN,"DisplayValues"=>$show_values,"DisplayZeroValues"=>FALSE,"DisplayR"=>100,"DisplayG"=>100,"DisplayB"=>100,"DisplayShadow"=>TRUE,"Surrounding"=>5,"AroundZero"=>FALSE); switch($graph_type) { case "vbar": $myPicture->drawBarChart($settings); break; } /* Render the picture */ $myPicture->stroke(); } function pch_vertical_graph ($graph_type, $index, $data, $width, $height, $rgb_color = false, $xaxisname = "", $yaxisname = "", $show_values = false, $legend = array()) { /* CAT:Vertical Charts */ if(!is_array($legend) || empty($legend)) { unset($legend); } /*$legend=array('pep1' => 'pep1','pep2' => 'pep2','pep3' => 'pep3','pep4' => 'pep4'); $data=array(array('pep1' => 1, 'pep2' => 1, 'pep3' => 3, 'pep4' => 3), array('pep1' => 1, 'pep2' => 3, 'pep3' => 1,'pep4' => 4), array('pep1' => 3, 'pep2' => 1, 'pep3' => 1,'pep4' =>1), array('pep1' => 1, 'pep2' =>1, 'pep3' =>1,'pep4' =>0)); $index=array(1,2,3,4); */ if(is_array(reset($data))) { $data2 = array(); foreach($data as $i =>$values) { $c = 0; foreach($values as $i2 => $value) { $data2[$i2][$i] = $value; $c++; } } $data = $data2; } else { $data = array($data); } /* Create and populate the pData object */ $MyData = new pData(); //debugPrint($data); foreach($data as $i => $values) { if(isset($legend)) { $point_id = $legend[$i]; } else { $point_id = $i; } $MyData->addPoints($values,$point_id); if($rgb_color !== false) { $MyData->setPalette($point_id, array("R" => $rgb_color[$i]['color']["R"], "G" => $rgb_color[$i]['color']["G"], "B" => $rgb_color[$i]['color']["B"], "BorderR" => $rgb_color[$i]['border']["R"], "BorderG" => $rgb_color[$i]['border']["G"], "BorderB" => $rgb_color[$i]['border']["B"], "Alpha" => $rgb_color[$i]['alpha'])); } } //$MyData->addPoints($data,"Yaxis"); $MyData->setAxisName(0,$yaxisname); $MyData->addPoints($index,"Xaxis"); $MyData->setSerieDescription("Xaxis", $xaxisname); $MyData->setAbscissa("Xaxis"); /* Create the pChart object */ $myPicture = new pImage($width,$height,$MyData); /* Turn of Antialiasing */ $myPicture->Antialias = FALSE; /* Add a border to the picture */ //$myPicture->drawRectangle(0,0,$width,$height,array("R"=>0,"G"=>0,"B"=>0)); /* Set the default font */ $myPicture->setFontProperties(array("FontName"=>"../fonts/code.ttf","FontSize"=>7)); /* Define the chart area */ $myPicture->setGraphArea(30,20,$width,$height-100); /* Draw the scale */ $scaleSettings = array("GridR"=>200,"GridG"=>200,"GridB"=>200,"DrawSubTicks"=>TRUE,"CycleBackground"=>TRUE, "Mode"=>SCALE_MODE_START0, "XMargin" => 40, "LabelRotation" => 90); $myPicture->drawScale($scaleSettings); if(isset($legend)) { /* Write the chart legend */ $myPicture->drawLegend($height/2,$height-20,array("Style"=>LEGEND_NOBORDER,"Mode"=>LEGEND_HORIZONTAL)); } /* Turn on shadow computing */ //$myPicture->setShadow(TRUE,array("X"=>0,"Y"=>1,"R"=>0,"G"=>0,"B"=>0,"Alpha"=>10)); /* Draw the chart */ $settings = array("ForceTransparency"=>"-1", "Gradient"=>TRUE, "GradientMode"=>GRADIENT_EFFECT_CAN, "DisplayValues"=>$show_values, "DisplayZeroValues"=>FALSE, "DisplayR"=>100, "DisplayZeros"=> FALSE, "DisplayG"=>100,"DisplayB"=>100,"DisplayShadow"=>TRUE,"Surrounding"=>5,"AroundZero"=>FALSE); switch($graph_type) { case "area": $myPicture->drawAreaChart($settings); break; case "line": $myPicture->drawLineChart($settings); break; } /* Render the picture */ $myPicture->stroke(); } function pch_threshold_graph ($graph_type, $index, $data, $width, $height, $xaxisname = "", $yaxisname = "", $title = "", $show_values = false, $show_legend = false) { /* CAT:Threshold Chart */ /* Create and populate the pData object */ $MyData = new pData(); $MyData->addPoints($data,"DEFCA"); $MyData->setAxisName(0,$yaxisname); $MyData->setAxisDisplay(0,AXIS_FORMAT_CURRENCY); $MyData->addPoints($index,"Labels"); $MyData->setSerieDescription("Labels",$xaxisname); $MyData->setAbscissa("Labels"); $MyData->setPalette("DEFCA",array("R"=>55,"G"=>91,"B"=>127)); /* Create the pChart object */ $myPicture = new pImage(700,230,$MyData); $myPicture->drawGradientArea(0,0,700,230,DIRECTION_VERTICAL,array("StartR"=>220,"StartG"=>220,"StartB"=>220,"EndR"=>255,"EndG"=>255,"EndB"=>255,"Alpha"=>100)); $myPicture->drawRectangle(0,0,699,229,array("R"=>200,"G"=>200,"B"=>200)); /* Write the picture title */ $myPicture->setFontProperties(array("FontName"=>"../fonts/code.ttf","FontSize"=>11)); $myPicture->drawText(60,35,$title,array("FontSize"=>20,"Align"=>TEXT_ALIGN_BOTTOMLEFT)); /* Do some cosmetic and draw the chart */ $myPicture->setGraphArea(60,40,670,190); $myPicture->drawFilledRectangle(60,40,670,190,array("R"=>255,"G"=>255,"B"=>255,"Surrounding"=>-200,"Alpha"=>10)); $myPicture->drawScale(array("GridR"=>180,"GridG"=>180,"GridB"=>180, "Mode" => SCALE_MODE_START0)); $myPicture->setShadow(TRUE,array("X"=>2,"Y"=>2,"R"=>0,"G"=>0,"B"=>0,"Alpha"=>10)); $myPicture->setFontProperties(array("FontName"=>"../fonts/code.ttf","FontSize"=>6)); $settings = array("Gradient"=>TRUE,"GradientMode"=>GRADIENT_EFFECT_CAN,"DisplayValues"=>$show_values,"DisplayZeroValues"=>FALSE,"DisplayR"=>100,"DisplayG"=>100,"DisplayB"=>100,"DisplayShadow"=>TRUE,"Surrounding"=>5,"AroundZero"=>FALSE); $myPicture->drawSplineChart($settings); $myPicture->setShadow(FALSE); if($show_legend) { /* Write the chart legend */ $myPicture->drawLegend(643,210,array("Style"=>LEGEND_NOBORDER,"Mode"=>LEGEND_HORIZONTAL)); } /* Render the picture */ $myPicture->stroke(); } function pch_horizontal_graph ($graph_type, $index, $data, $width, $height, $xaxisname = "", $yaxisname = "", $show_values = false, $show_legend = false) { /* CAT:Horizontal Charts */ /* Create and populate the pData object */ $MyData = new pData(); $MyData->addPoints($data,"Xaxis"); $MyData->setAxisName(0,$yaxisname); $MyData->addPoints($index,"Yaxis"); $MyData->setSerieDescription("Yaxis", $xaxisname); $MyData->setAbscissa("Yaxis"); /* Create the pChart object */ $myPicture = new pImage($width,$height,$MyData); $myPicture->drawGradientArea(0,0,$width,500,DIRECTION_VERTICAL,array("StartR"=>240,"StartG"=>240,"StartB"=>240,"EndR"=>180,"EndG"=>180,"EndB"=>180,"Alpha"=>100)); $myPicture->drawGradientArea(0,0,$width,500,DIRECTION_HORIZONTAL,array("StartR"=>240,"StartG"=>240,"StartB"=>240,"EndR"=>180,"EndG"=>180,"EndB"=>180,"Alpha"=>20)); /* Add a border to the picture */ //$myPicture->drawRectangle(0,0,$width,$height,array("R"=>0,"G"=>0,"B"=>0)); /* Set the default font */ $myPicture->setFontProperties(array("FontName"=>"../fonts/code.ttf","FontSize"=>7)); /* Define the chart area */ $myPicture->setGraphArea(75,20,$width,$height); if(count($data) == 1) { $xmargin = 110; } elseif(count($data) == 2) { $xmargin = 70; } else { $xmargin = 45; } /* Draw the scale */ $scaleSettings = array("GridR"=>200,"GridG"=>200,"GridB"=>200,"DrawSubTicks"=>TRUE,"CycleBackground"=>TRUE, "Mode"=>SCALE_MODE_START0, "XMargin" => $xmargin,"Pos"=>SCALE_POS_TOPBOTTOM); $myPicture->drawScale($scaleSettings); if($show_legend) { /* Write the chart legend */ $myPicture->drawLegend(580,12,array("Style"=>LEGEND_NOBORDER,"Mode"=>LEGEND_HORIZONTAL)); } /* Turn on shadow computing */ $myPicture->setShadow(TRUE,array("X"=>0,"Y"=>1,"R"=>0,"G"=>0,"B"=>0,"Alpha"=>10)); /* Draw the chart */ $settings = array("Gradient"=>TRUE,"GradientMode"=>GRADIENT_EFFECT_CAN,"DisplayValues"=>$show_values,"DisplayZeroValues"=>FALSE,"DisplayR"=>100,"DisplayG"=>100,"DisplayB"=>100,"DisplayShadow"=>TRUE,"Surrounding"=>5,"AroundZero"=>FALSE); $settings = array("DisplayPos"=>LABEL_POS_INSIDE,"DisplayValues"=>TRUE,"Rounded"=>TRUE,"Surrounding"=>30); switch($graph_type) { case "hbar": $myPicture->drawBarChart($settings); break; case "area": $myPicture->drawAreaChart($settings); break; case "line": $myPicture->drawLineChart($settings); break; } /* Render the picture */ $myPicture->stroke(); } /* class PchartGraph extends PandoraGraphAbstract { public $palette_path = false; private $graph = NULL; private $dataset = NULL; private $x1; private $x2; private $y1; private $y2; public function load_palette ($palette_path) { $this->palette_path = $palette_path; } public function pie_graph () { // dataset definition $this->dataset = new pData; $this->dataset->AddPoint ($this->data, "Serie1", $this->legend); $this->dataset->AddPoint ($this->legend, "Serie2"); $this->dataset->AddAllSeries (); $this->dataset->SetAbsciseLabelSerie ("Serie2"); // Initialise the graph $this->graph = new pChart ($this->width, $this->height); $this->graph->setFontProperties ($this->fontpath, 8); if ($this->palette_path) { $this->graph->loadColorPalette ($this->palette_path); } $this->add_background (); // Draw the pie chart if ($this->three_dimensions) { $this->graph->drawPieGraph ($this->dataset->GetData (), $this->dataset->GetDataDescription (), $this->width / 2, $this->height / 2 - 15, $this->zoom, PIE_PERCENTAGE_LABEL, 5, 70, 20, 5); } else { $this->graph->drawFlatPieGraph ($this->dataset->GetData (), $this->dataset->GetDataDescription (), $this->width / 2, $this->height / 2, $this->zoom, PIE_PERCENTAGE_LABEL, 5); } if ($this->show_legend) { $this->graph->drawPieLegend (10, 10, $this->dataset->GetData (), $this->dataset->GetDataDescription (), 255, 255, 255); } $this->graph->Stroke (); } public function horizontal_bar_graph () { // dataset definition $this->dataset = new pData; foreach ($this->data as $x => $y) { $this->dataset->AddPoint ($y, "Serie1", $x); } $this->dataset->AddAllSeries (); $this->dataset->SetXAxisFormat ("label"); $this->dataset->SetYAxisFormat ($this->yaxis_format); // Initialise the graph $this->graph = new pChart ($this->width, $this->height); if ($this->palette_path) { $this->graph->loadColorPalette ($this->palette_path); } $this->graph->setFontProperties ($this->fontpath, 8); $this->add_background (); $this->graph->drawGraphArea (255, 255, 255, true); if ($this->show_grid) $this->graph->drawGrid (4, true, 230, 230, 230, 50); // Draw the bar graph $this->graph->setFontProperties ($this->fontpath, 8); $this->graph->setFixedScale (0, max ($this->data)); $this->graph->drawOverlayBarGraphH ($this->dataset->GetData (), $this->dataset->GetDataDescription (), 50); // Finish the graph $this->add_legend (); $this->graph->Stroke (); } public function single_graph () { // Dataset definition $this->dataset = new pData; $this->graph = new pChart ($this->width, $this->height+2); foreach ($this->data as $x => $y) { $this->dataset->AddPoint ($y, "Serie1", $x); } $color = $this->get_rgb_values ($this->graph_color[2]); $this->graph->setColorPalette (0, $color['r'], $color['g'], $color['b']); $this->dataset->AddAllSeries (); if ($this->legend !== false) $this->dataset->SetSerieName ($this->legend[0], "Serie1"); if ($this->palette_path) $this->graph->loadColorPalette ($this->palette_path); $this->graph->setFontProperties ($this->fontpath, 8); // White background $this->graph->drawFilledRoundedRectangle(1,1,$this->width,$this->height,0,254,254,254); $this->add_background (); $this->dataset->SetXAxisFormat ($this->xaxis_format); $this->dataset->SetYAxisFormat ($this->yaxis_format); $this->graph->drawGraphArea (254, 254, 254, true); if ($this->max_value == 0 || $this->max_value == 1) $this->graph->setFixedScale (0, 1, 1); $this->graph->drawScale ($this->dataset->GetData (), $this->dataset->GetDataDescription (), SCALE_START0, 80, 80, 80, $this->show_axis, 0, 0, false, $this->xaxis_interval); if ($this->show_grid) $this->graph->drawGrid (1, false, 200, 200, 200); if ($this->max_value > 0) { // Draw the graph $this->graph->drawFilledLineGraph ($this->dataset->GetData (), $this->dataset->GetDataDescription (), 50, true); } // Finish the graph // $this->add_legend (); $this->add_events (); $this->add_alert_levels (); $this->graph->Stroke (); } public function sparse_graph ($period, $avg_only, $min_value, $max_value, $unit_name, $baseline = 0) { // Dataset definition $this->dataset = new pData; $this->graph = new pChart ($this->width, $this->height+5); $this->graph->setFontProperties ($this->fontpath, 8); $this->legend = array (); if ($avg_only) { foreach ($this->data as $data) { $this->dataset->AddPoint ($data['sum'], "AVG", $data['timestamp_bottom']); } $color = $this->get_rgb_values ($this->graph_color[2]); $this->graph->setColorPalette (0, $color['r'], $color['g'], $color['b']); } else { foreach ($this->data as $data) { $this->dataset->AddPoint ($data['sum'], "AVG", $data['timestamp_bottom']); $this->dataset->AddPoint ($data['min'], "MIN"); $this->dataset->AddPoint ($data['max'], "MAX"); } $this->legend[1] = __("Min"); $this->legend[0] = __("Avg"); $this->legend[2] = __("Max"); $this->dataset->SetSerieName (__("Min"), "MIN"); $this->dataset->SetSerieName (__("Avg"), "AVG"); $this->dataset->SetSerieName (__("Max"), "MAX"); $this->set_colors (); } // Draw baseline if ($baseline == 1) { foreach ($this->data as $data) { $this->dataset->AddPoint ($data['baseline'], "BLINE"); } } $this->dataset->SetXAxisFormat ('datetime'); $this->graph->setDateFormat ("Y"); $this->dataset->SetYAxisFormat ('metric'); $this->dataset->AddAllSeries (); $this->dataset->SetSerieName (__("Avg"), "AVG"); $this->legend[0] = __("Avg"); if ($this->palette_path) { $this->graph->loadColorPalette ($this->palette_path); } // White background $this->graph->drawFilledRoundedRectangle(1,1,$this->width,$this->height+2,0,254,254,254); // Graph border // Now graph border is in the style image attribute //$this->graph->drawRoundedRectangle(1,1,$this->width-1,$this->height+4,5,230,230,230); $this->add_background (); // If graph is small remove blank spaces if ($this->width < MIN_WIDTH || $this->height < MIN_HEIGHT) $this->graph->setGraphArea (5,5,$this->width-5,$this->height-5); $this->graph->drawGraphArea (254, 254, 254, false); $this->xaxis_interval = ($this->xaxis_interval / 7 >= 1) ? ($this->xaxis_interval / 7) : 10; // Remove axis values if graph is small if ($this->width > MIN_WIDTH && $this->height > MIN_HEIGHT){ $this->graph->drawScale ($this->dataset->GetData (), $this->dataset->GetDataDescription (), SCALE_START0, 80, 80, 80, $this->show_axis, 0, 50, false, $this->xaxis_interval); }else{ $this->graph->drawScale ($this->dataset->GetData (), $this->dataset->GetDataDescription (), SCALE_START0, 80, 80, 80, false, 0, 50, false, $this->xaxis_interval); } /// NOTICE: The final "false" is a Pandora modificaton of pChart to avoid showing vertical lines. if ($this->show_grid) $this->graph->drawGrid (1, true, 225, 225, 225, 100, false); // Draw the graph $this->graph->drawFilledLineGraph ($this->dataset->GetData(), $this->dataset->GetDataDescription(), 50, true); // Remove legends if graph is small if ($this->width > MIN_WIDTH && $this->height > MIN_HEIGHT) $this->add_legend (); $this->add_events ("AVG"); $this->add_alert_levels (); $this->graph->Stroke (); } public function vertical_bar_graph () { // dataset definition $this->dataset = new pData; foreach ($this->data as $x => $y) { $this->dataset->AddPoint ($y, "Serie1", $x); } $this->dataset->AddAllSeries (); $this->dataset->SetAbsciseLabelSerie (); $this->dataset->SetXAxisFormat ($this->xaxis_format); $this->dataset->SetYAxisFormat ($this->yaxis_format); // Initialise the graph $this->graph = new pChart ($this->width, $this->height); if ($this->palette_path) { $this->graph->loadColorPalette ($this->palette_path); } $this->graph->setFontProperties ($this->fontpath, 8); $this->add_background (); $this->graph->drawGraphArea (255, 255, 255, true); if ($this->show_grid) $this->graph->drawGrid (4, true, 230, 230, 230, 50); // Draw the bar graph $this->graph->setFontProperties ($this->fontpath, 8); $this->graph->drawScale ($this->dataset->GetData (), $this->dataset->GetDataDescription (), SCALE_START0, 80, 80, 80, $this->show_axis, 0, 0, false, $this->xaxis_interval); $this->graph->drawOverlayBarGraph ($this->dataset->GetData (), $this->dataset->GetDataDescription (), 50); $this->add_events ("Serie1"); $this->add_alert_levels (); // Finish the graph $this->graph->Stroke (); } public function combined_graph ($values, $events, $alerts, $unit_name, $max_value, $stacked) { set_time_limit (0); // Dataset definition $this->dataset = new pData; $this->graph = new pChart ($this->width, $this->height+5); $graph_items = 0; // $previo stores values from last series to made the stacked graph foreach ($this->data as $i => $data) { $graph_items++; $max = 0; $min = 10000000000000; $avg = 0; $count = 0; foreach ($data as $j => $value) { $count ++; $avg += $value; if ($value > $max ) $max = $value; if ($value < $min ) $min = $value; // New code for stacked. Due pchart doesnt not support stacked // area graph, we "made it", adding to a series the values of the // previous one consecutive sum. if ((($stacked == 1) OR ($stacked==3)) AND ($i >0)){ $this->dataset->AddPoint ($value+$previo[$j], $this->legend[$i], $values[$j]['timestamp_bottom']); } else { $this->dataset->AddPoint ($value, $this->legend[$i], $values[$j]['timestamp_bottom']); } if ($i == 0) $previo[$j] = $value; else $previo[$j] = $previo[$j] + $value; } if ($count > 0) $avgdata[$i] = $avg / $count; else $avgdata[$i] = 0; $maxdata[$i] = format_for_graph($max); $mindata[$i] = format_for_graph($min); $avgdata[$i] = format_for_graph($avgdata[$i]); } $i = 0; foreach ($this->legend as $name) { $legend = $name . " (".__("Max"). ":$maxdata[$i], ".__("Min"). ":$mindata[$i], ". __("Avg"). ": $avgdata[$i])"; $this->dataset->setSerieName ($legend, $name); $this->dataset->AddSerie ($name); $i++; } // Set different colors for combined graphs because need to be // very different. $this->graph_color[1] = "#FF0000"; // Red $this->graph_color[2] = "#00FF00"; // Green $this->graph_color[3] = "#0000FF"; // Blue // White background $this->graph->drawFilledRoundedRectangle(1,1,$this->width,$this->height,0,254,254,254); $this->set_colors (); $this->graph->setFontProperties ($this->fontpath, 8); $this->dataset->SetXAxisFormat ('datetime'); $this->dataset->SetYAxisFormat ('metric'); $this->dataset->AddAllSeries (); $this->add_background (); $legend_offset = $this->height - 21 - ($graph_items*15); $this->graph->setGraphArea (35,10,$this->width-10, $legend_offset); $this->graph->drawGraphArea (254, 254, 254, false); // Fixed missing X-labels (6Ago09) $this->xaxis_interval = ($this->xaxis_interval / 7 >= 1) ? ($this->xaxis_interval / 7) : 10; $this->graph->drawScale ($this->dataset->GetData (), $this->dataset->GetDataDescription (), SCALE_START0, 80, 80, 80, $this->show_axis, 0, 50, false, $this->xaxis_interval); $this->graph->drawGrid (1, true, 225, 225, 225, 100, false); // Draw the graph if ($stacked == 1) { // Stacked solid $this->graph->drawScale ($this->dataset->GetData (), $this->dataset->GetDataDescription (), SCALE_START0, 80, 80, 80, $this->show_axis, 0, 0, false, $this->xaxis_interval); $this->graph->drawFilledCubicCurve ($this->dataset->GetData(), $this->dataset->GetDataDescription(), 1, 30, true); } elseif ($stacked == 3) { // Stacked wired $this->graph->drawScale ($this->dataset->GetData (), $this->dataset->GetDataDescription (), SCALE_START0, 80, 80, 80, $this->show_axis, 0, 0, false, $this->xaxis_interval); $this->graph->drawFilledCubicCurve ($this->dataset->GetData(), $this->dataset->GetDataDescription(), 1, 0, true); } else if ($stacked == 2) { // Wired mode $this->graph->drawScale ($this->dataset->GetData (), $this->dataset->GetDataDescription (), SCALE_START0, 80, 80, 80, $this->show_axis, 0, 0, false, $this->xaxis_interval); $this->graph->drawLineGraph ($this->dataset->GetData (), $this->dataset->GetDataDescription ()); } else { // Non-stacked, area overlapped $this->graph->drawScale ($this->dataset->GetData (), $this->dataset->GetDataDescription (), SCALE_START0, 80, 80, 80, $this->show_axis, 0, 0, false, $this->xaxis_interval); $this->graph->drawFilledCubicCurve ($this->dataset->GetData(), $this->dataset->GetDataDescription(), 1, 30, true); } $this->graph->setFontProperties($this->fontpath,7); $this->graph->drawLegend(15,$legend_offset+29,$this->dataset->GetDataDescription(),92,92,92,50,50,50,45,45,45,0); // Legend line separator // $this->graph->drawFilledRoundedRectangle(35, $legend_offset + 30 ,$this->width-35,$legend_offset+30,0,220,220,220); $this->add_events ($this->legend[0]); $this->add_alert_levels (); $this->graph->Stroke (); } public function progress_bar ($value, $color) { set_time_limit (0); // Dataset definition $this->graph = new pChart ($this->width, $this->height); $this->graph->setFontProperties ($this->fontpath, 8); // Round corners defined in global setup global $config; if ($config["round_corner"] != 0) $radius = ($this->height > 18) ? 8 : 0; else $radius = 0; $ratio = (int) $value / 100 * $this->width; // Color stuff $bgcolor = $this->get_rgb_values ($this->background_color); $r = hexdec (substr ($this->background_color, 1, 2)); $g = hexdec (substr ($this->background_color, 3, 2)); $b = hexdec (substr ($this->background_color, 5, 2)); // Actual percentage if (! $this->show_title || $value > 0) { $color = $this->get_rgb_values ($color); $this->graph->drawFilledRoundedRectangle (0, 0, $ratio, $this->height, $radius, $color['r'], $color['g'], $color['b']); } if ($config["round_corner"]) { // Under this value, the rounded rectangle is painted great if ($ratio <= 16) { // Clean a bit of pixels for ($i = 0; $i < 7; $i++) { $this->graph->drawLine (0, $i, 6 - $i, $i, 255, 255, 255); } $end = $this->height - 1; for ($i = 0; $i < 7; $i++) { $this->graph->drawLine (0, $end - $i, 5 - $i, $end - $i, 255, 255, 255); } } } if ($ratio <= 60) { if ($this->show_title) { $this->graph->drawTextBox (0, 0, $this->width, $this->height, $this->title, 0, 0, 0, 0, ALIGN_CENTER, false); } } else { if ($this->show_title) { $this->graph->drawTextBox (0, 0, $this->width, $this->height, $this->title, 0, 255, 255, 255, ALIGN_CENTER, false); } } if ($this->border) { $this->graph->drawRoundedRectangle (0, 0, $this->width - 1, $this->height - 1, $radius, 157, 157, 157); } $this->graph->Stroke (); } // Gets an array with each the components of a RGB string private static function get_rgb_values ($rgb_string) { $color = array ('r' => 0, 'g' => 0, 'b' => 0); $offset = 0; if ($rgb_string[0] == '#') $offset = 1; $color['r'] = hexdec (substr ($rgb_string, $offset, 2)); $color['g'] = hexdec (substr ($rgb_string, $offset + 2, 2)); $color['b'] = hexdec (substr ($rgb_string, $offset + 4, 2)); return $color; } private function add_alert_levels () { if ($this->alert_top !== false) { $this->graph->drawTreshold ($this->alert_top, 57, 96, 255, true, true, 4, "Alert top"); } if ($this->alert_bottom !== false) { $this->graph->drawTreshold ($this->alert_bottom, 7, 96, 255, true, true, 4, "Alert bottom"); } } private function add_events ($serie = "Serie1") { if (! $this->events) return; // Unfortunatelly, the events must be draw manually $first = $this->dataset->Data[0]["Name"]; $len = count ($this->dataset->Data) - 1; $last = $this->dataset->Data[$len]["Name"]; $ylen = $this->y2 - $this->y1; foreach ($this->data as $i => $data) { // Finally, check if there were events if (! $data['events']) continue; if (!isset($this->dataset->Data[$i])) continue; $x1 = (int) ($this->x1 + $i * $this->graph->DivisionWidth); $y1 = (int) ($this->y2 - ($this->dataset->Data[$i][$serie] * $this->graph->DivisionRatio)); $this->graph->drawFilledCircle ($x1, $y1, 1.5, 255, 0, 0); if ($y1 == $this->y2) // Lines in the same dot fails continue; $this->graph->drawDottedLine ($x1 - 1, $y1, $x1 - 1, $this->y2, 5, 255, 150, 150); } } private function add_background () { if ($this->graph == NULL) return; $this->graph->setDateFormat ($this->date_format); $this->x1 = ($this->width > 300) ? 30 : 35; // $this->y1 = ($this->height > 200) ? 25 : 10; $this->x2 = ($this->width > 300) ? $this->width - 15 : $this->width - 15; $this->y2 = ($this->height > 200) ? $this->height - 25 : $this->height - 25; if ($this->max_value > 10000 && $this->show_axis) $this->x1 += 20; $this->graph->drawGraphArea (255, 255, 255, true); $this->graph->setFontProperties ($this->fontpath, 7); $size = $this->graph->getLegendBoxSize ($this->dataset->GetDataDescription ()); // Old resize code for graph area, discard, we need all area in pure mode //if (is_array ($size)) { // while ($size[1] > $this->y1) // $this->y1 += (int) $size[1] / 2; // if ($this->y1 > $this->y2) // $this->y1 = $this->y2; //} if ($this->show_title == 1){ $this->y1=40; } else { $this->y1=10; } // No title for combined if ($this->stacked !== false){ $this->y1=10; } $this->graph->setGraphArea ($this->x1, $this->y1, $this->x2, $this->y2); if ($this->show_title) { $this->graph->setFontProperties ($this->fontpath, 12); $this->graph->drawTextBox (2, 7, $this->width, 20, $this->title, 0, 0, 0, 0, ALIGN_LEFT, false); $this->graph->setFontProperties ($this->fontpath, 9); $this->graph->drawTextBox (0, 10, $this->width, 20, $this->subtitle, 0, 0, 0, 0, ALIGN_CENTER, false); $this->graph->setFontProperties ($this->fontpath, 6); } // This is a tiny watermark if ($this->watermark) { if ($this->show_title){ $this->graph->setFontProperties ($this->fontpath, 7); $this->graph->drawTextBox ($this->width - 8, 40, $this->width - 240, 90, 'PANDORA FMS', 90, 174, 214, 174, ALIGN_BOTTOM_LEFT, false); } else { $this->graph->setFontProperties ($this->fontpath, 7); $this->graph->drawTextBox ($this->width - 8, 50, $this->width - 240, 60, 'PANDORA FMS', 90, 174, 214, 174, ALIGN_BOTTOM_LEFT, false); } } } private function add_legend () { if ((! $this->show_title || $this->legend === false) && ($this->stacked === false)) { return; } // Add legend $this->graph->setFontProperties ($this->fontpath, 6); $size = $this->graph->getLegendBoxSize ($this->dataset->GetDataDescription ()); // No title for combined, so legends goes up if ($this->stacked !== false) $this->graph->drawLegend ( 35, 12, $this->dataset->GetDataDescription (), 245, 245, 245); else $this->graph->drawLegend ( 35, 52, $this->dataset->GetDataDescription (), 245, 245, 245); } private function set_colors () { if ($this->graph == NULL) return; for ($a = 0; $a<9; $a++){ $color = $this->get_rgb_values ($this->graph_color[$a+1]); $this->graph->setColorPalette ($a, $color['r'], $color['g'], $color['b']); } } } */ ?>