700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > PHP生成曲线统计图表示例 直方图等数据

PHP生成曲线统计图表示例 直方图等数据

时间:2019-11-08 18:51:57

相关推荐

PHP生成曲线统计图表示例 直方图等数据

在医疗行业中往往会显示各种数据统计图,现成的第三方插件有不能满足需求的情况下。就需要单独绘制。PHP也可以绘制各种图像图形。下面以血常规直方图为例:

数据源

{"Data": "1,3,5,7,10,13,17,21,25,29,33,37,42,46,50,54,58,62,68,74,80,86,92,97,103,108,112,115,118,119,119,118,115,110,105,99,93,86,80,74,68,62,57,53,49,46,44,42,40,39,38,38,38,38,38,38,38,38,39,39,39,40,40,40,40,41,41,42,42,43,43,44,45,45,46,47,47,48,49,49,50,51,52,53,54,55,56,57,59,61,62,64,66,67,69,70,72,73,74,76,77,78,80,81,82,83,84,85,85,86,86,87,87,88,87,87,86,86,85,84,84,83,82,81,80,79,78,76,75,74,72,71,69,68,66,64,62,60,57,55,52,50,47,45,43,41,39,37,35,33,31,29,27,25,23,21,20,18,17,15,14,12,11,10,9,8,7,6,5,5,5,4,4,3,3,3,3,3,3,3,2,2,2,2,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1","Line": "18,52,73","Range": "400","Title": "WBC"}, {"Data": "1,0,0,0,0,0,0,0,1,3,5,7,9,11,13,15,16,16,16,15,14,14,13,12,11,10,8,7,7,7,8,9,11,13,15,17,19,23,28,34,43,53,66,80,97,117,140,165,194,226,263,305,351,402,458,519,582,648,714,779,843,903,959,1011,1058,1099,1135,1165,1189,1205,1212,1211,1202,1184,1158,1127,1091,1051,1008,962,912,858,801,742,682,623,568,516,468,424,385,348,314,282,252,224,198,174,152,132,115,101,90,80,72,66,60,54,48,43,39,35,31,29,27,25,25,25,25,25,25,26,26,27,28,29,30,31,33,34,35,35,36,37,37,38,39,40,40,41,41,41,42,43,43,44,44,44,43,42,41,39,37,35,32,30,27,24,22,20,18,16,15,14,13,13,12,11,10,10,10,9,9,8,8,7,6,5,4,3,3,3,2,2,2,1,1,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,1,1,2,2,2,3,2,2,2,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,4,7,9,11,12,13","Line": "26,250","Range": "320","Title": "RBC"}, {"Data": "11,14,18,24,31,39,48,57,66,74,81,86,89,92,93,94,93,91,88,85,81,76,71,66,61,56,52,47,43,39,36,34,32,30,29,28,27,26,25,23,22,20,18,17,16,15,15,14,14,14,14,14,14,14,14,13,13,12,11,10,8,7,5,3","Line": "2,48","Range": "40","Title": "PLT"}

封装的代码:

class HistPaiter{private $aspect_ratio = 16/9; // 宽高比private $value_y = []; // 曲线值private $lines = [];private $wgnum; // 网格宽度private $title;private $ranges;private $filename;public function setData($value){$this->value_y = $value["value_y"];$this->lines = $value["lines"];$this->wgnum = $value["wgnum"];$this->title = $value["title"];$this->ranges = $value["range"];$this->filename = $value["filename"];}public function draw($dw,$dh){$top = 20;$bottom = $dh - 15;$left = 5;$right = $dw - 10;// 绘图区域$w = $right - $left;$h = $bottom - $top;if($w > 0 && $h > 0){if(($w / $h) > $this->aspect_ratio){ // 比较宽$w2 = $h * $this->aspect_ratio;$edge = ($w - $w2) / 2.0;$left = $left + $edge;$w = $w2;} else { // 比较高$h2 = $w / $this->aspect_ratio;$edge = ($h - $h2) / 2.0;$top = $top + $edge;$h = $h2;}}header("Content-type:image/png");$pic=imagecreate($dw,$dh);imagecolorallocate($pic,255,255,255);//背景色$color_1=imagecolorallocate($pic,30,144,255); //线条色$color_2=imagecolorallocate($pic,0,0,0); //黑色$color_3=imagecolorallocate($pic,194,194,194);//灰色$color_4=imagecolorallocate($pic,255,0,0); // 红色// 画坐标轴$this->drawCoordinate($pic,$top,$bottom,$left,$right,$color_2);// 画刻度$this->drawScale($pic,$color_2);// 绘制网格线$this->drawGridlines($pic,$w,$bottom,$top,$bottom,$color_2,$color_3);// 画曲线$this->drawData($pic,$w,$h,$top,$bottom,$left,$right,$color_1);// 划分分类线$this->drawLine($pic,$w,$top,$bottom,$left,$color_4);//imagepng($pic, $this->filename.".png");//文件名为GD.pngimagepng($pic);//文件名为GD.pngimagedestroy($pic);}private function drawGridlines($pic,$width,$high,$top,$bottom,$color_2,$color_3){imagesetthickness($pic,1); //网格线宽$y_line_width=floor($width/$this->wgnum); //纵网格线数目$y_line_density=$y_line_width==0 ? 0 :floor($width/$y_line_width); //纵网格线密度$point_zero_y= $high;$allnum = count($this->value_y);$max_num = max($this->value_y);//最大值$min_num = min($this->value_y);//最小值$limit_m=$max_num-$min_num; //极差$max_num_add=$max_num+$limit_m*0.1; //轴最大值$min_num_add=$min_num-$limit_m*0.1; //轴最小值$limit=$max_num_add-$min_num_add; //极差-坐标轴y$y_pxdensity=($max_num_add-$min_num_add)/$high; //y轴密度$x_pxdensity=floor($width/$allnum); //x轴密度$empty_size_x = 5;imagestring($pic,1,$empty_size_x-1,$high+4,"0",$color_2); //零点数轴标记for($i=1;$i <= $y_line_width;$i++){//绘制纵网格线imagesetthickness($pic,1);//网格线宽imageline($pic,$y_line_density*$i+$empty_size_x,$top,$y_line_density*$i+$empty_size_x,$high,$color_3);imagesetthickness($pic,2);//轴点线宽imageline($pic,$y_line_density*$i+$empty_size_x,$point_zero_y-4,$y_line_density*$i+$empty_size_x,$point_zero_y,$color_2);// X坐标值imagestring($pic,1,$this->wgnum*$i+$empty_size_x,$high+4,sprintf("%.2f",($this->ranges/$y_line_width)*$i),$color_2); //数轴标记}$x_line_width=floor($bottom/50); //横网格线数目$x_line_density = 42; //横网格线密度//绘制横网格线imagestring($pic,1,0,$high-3,round($min_num_add,1),$color_2); //零点数轴标记for($i=1;$i <= $x_line_width;$i++){imagesetthickness($pic,1); //网格线宽imageline($pic,0+$empty_size_x,$high-$x_line_density*$i,$width,$high-$x_line_density*$i,$color_3);imagesetthickness($pic,2); //轴点线宽imageline($pic,0+$empty_size_x,$high-$x_line_density*$i,3+$empty_size_x,$high-$x_line_density*$i,$color_2);imagestring($pic,1,5,$high-$x_line_density*$i-10,round($limit/$x_line_width*$i+$min_num_add,1),$color_2); //数轴标记}}// 画分类线private function drawLine($pic,$w,$top,$bottom,$left,$color_4){//绘制虚线$bg = imagecolorallocate($pic, 204, 204, 204);$style = array($color_4, $color_4, $color_4, $color_4, $color_4, $bg, $bg, $bg, $bg);imagesetstyle($pic, $style);$scale = 1.0 * $w / count($this->value_y);for ($i = 0; $i < count($this->lines); $i++) {if($this->lines[$i] > 0){$offset = $scale * $this->lines[$i];imageline($pic,$left+$offset,$top,$left+$offset,$bottom,IMG_COLOR_STYLED);}}}// 画曲线private function drawData($pic,$w,$h,$top,$bottom,$left,$right,$color_1){// 找最大值$max = max($this->value_y);// 尺度转换$w_scale = 1.0 * $w / count($this->value_y);$h_scale = 1.0 * $h / $max;$points = [];for ($i = 0; $i < count($this->value_y); $i++) {$points[$i]["x"] = $left + $i * $w_scale;$points[$i]["y"] = $bottom - $this->value_y[$i] * $h_scale;}//产生折线$point_x=0;$j=0;imagesetthickness($pic,1); //线条粗细while($j+1 < count($this->value_y)){imageline($pic,$points[$j]["x"],$points[$j]["y"],$points[$j+1]["x"],$points[$j+1]["y"],$color_1);$j++;}}// 画刻度private function drawScale($pic,$color_2){imagestring($pic,5,150,30,$this->title,$color_2);}//绘制坐标private function drawCoordinate($pic,$top,$bottom,$left,$right,$color_2){imagesetthickness($pic,2); //轴线宽imageline($pic,$left,$bottom,$right,$bottom,$color_2); // Ximageline($pic,$left,$bottom,$left,$top,$color_2); // Y}}

调用方法 :

$hp = new HistPaiter();$hp->setData(["value_y" => explode(",","1,3,5,7,10,13,17,21,25,29,33,37,42,46,50,54,58,62,68,74,80,86,92,97,103,108,112,115,118,119,119,118,115,110,105,99,93,86,80,74,68,62,57,53,49,46,44,42,40,39,38,38,38,38,38,38,38,38,39,39,39,40,40,40,40,41,41,42,42,43,43,44,45,45,46,47,47,48,49,49,50,51,52,53,54,55,56,57,59,61,62,64,66,67,69,70,72,73,74,76,77,78,80,81,82,83,84,85,85,86,86,87,87,88,87,87,86,86,85,84,84,83,82,81,80,79,78,76,75,74,72,71,69,68,66,64,62,60,57,55,52,50,47,45,43,41,39,37,35,33,31,29,27,25,23,21,20,18,17,15,14,12,11,10,9,8,7,6,5,5,5,4,4,3,3,3,3,3,3,3,2,2,2,2,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1"),"lines"=> explode(",","18,52,73"),"wgnum" => 50, // 网格宽度"range"=> 400, //最大范围"title"=> "WBC","filename" => "WBC"]);$hp->draw(350,350);

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。