php pChart 绘制雷达图(模拟支付宝芝麻评分图)
阅读(2398)
2019-09-30
雷达图是以从同一点开始的轴上表示的三个或更多个定量变量的二维图表的形式显示多变量数据的图形方法。多用于让用户直观看到数值的侧重点。
在php中有个开源的 pChart 图表生成库,可生成20多种简单或复杂的图表。
下面来个简单的模拟支付宝芝麻信用那个雷达图demo,通过五项评的芝麻分,你可以看到你的芝麻分的侧重点。
先看效果:
第一步:下载开源pChart
官方网站:http://www.pchart.net
当前版本:pChart2.1.4.zip
下载地址:http://www.pchart.net/release/pChart2.1.4.zip
class目录:直接解压,引入class文件夹的类库就可以使用了,方便快捷。
fonts目录:如需需要支持中文的,可以用自己的字体。
examples目录:官方demo示例。
index.php文件:把解压包放到php环境下直接访问就可以查看,导航polar and radars就是雷达图。
第二步:拷贝官方demo小改
/* 极地和雷达图 */ //引入 pChart 库 include("../class/pData.class.php"); include("../class/pDraw.class.php"); include("../class/pRadar.class.php"); include("../class/pImage.class.php"); //图像大小 $width = 500; $height = 500; //绘制位置 $x = 100; $y = 100; //分数 $scores = array( "身份特质"=>5, "履约能力"=>4, "信用历史"=>5.5, "人脉关系"=>4, "行为偏好"=>3.5 ); //创建并赋值 pData 对象 $MyData = new pData(); $MyData->addPoints(array_values($scores), "Score"); $MyData->setSerieDescription("Score", "Application A"); $MyData->setPalette("Score", array("R" => 0, "G" => 180, "B" => 138)); //定义 absissa $MyData->addPoints(array_keys($scores), "Labels"); $MyData->setAbscissa("Labels", array("R" => 10, "G" => 170, "B" => 133)); //创建 pChart 对象 $myPicture = new pImage($width, $height, $MyData); //设置默认字体属性(这里我使用开源的字体:思源黑体) $myPicture->setFontProperties(array("FontName" => "../fonts/SOURCEHANSANSCN-MEDIUM.OTF", "FontSize" => 10, "R" => 80, "G" => 80, "B" => 80)); //创建 pRadar 对象 $SplitChart = new pRadar(); //绘制雷达图 $myPicture->setGraphArea($x, $y, $width-$x, $height-$y); //设置雷达图区域位开始位置和结束位置 $Options = array( "Layout" => RADAR_LAYOUT_STAR, //雷达布局 RADAR_LAYOUT_STAR=>尖角雷达图,RADAR_LAYOUT_CIRCLE=>圆角雷达图 "LabelPos" => RADAR_LABELS_HORIZONTAL, //类型标签 RADAR_LABELS_HORIZONTAL=>水平,RADAR_LABELS_ROTATED=>旋转 "BackgroundGradient" => array( //背景梯度渐变 "StartR" => 246, "StartG" => 246, "StartB" => 246, "StartAlpha" => 100, "EndR" => 246, "EndG" => 246, "EndB" => 246, "EndAlpha" => 100 ), 'AxisR' => 225, 'AxisG' => 225, 'AxisB' => 225, 'AxisAlpha' => 100, 'AxisRotation' => -90, //旋转轴(角度) 'DrawAxisValues' => false, //画坐标轴的值 'DrawPoly' => true, //区域阴影 "ValueFontSize" => 8, //在坐标轴顶点标注数值字体大小 'WriteValues' => false, //在坐标轴顶点标注数值 'WriteValuesInBubble' => false, //在顶点气泡中标注 'ValuePadding' => 0, //在顶点气泡中标注大小 'OuterBubbleRadius' => 0, //顶点气泡颜色 'DrawPoints' => false, //画坐标顶点的小圆点 'PointRadius' => 5, //坐标顶点的小圆点大小 'DrawLines' => true, //画坐标点连接线(首尾点不连接 适用于xy坐标轴) 'LineLoopStart' => true, //链接首尾的点 'SegmentHeight' => 2, //设置每个坐标格大小 'Segments' => 3, //设置雷达图显示几个坐标格 ); $SplitChart->drawRadar($myPicture, $MyData, $Options); //渲染图片(选择最佳方式) $myPicture->autoOutput("pictures/example.radar.values.png");
以上代码直接运行即可输出雷达图
附录:
autoOutput方法是直接输出图片的,来看下源码:
有两种输出模式:一种走的是cli命令模式,另一种web页面直接输出。
/* Automatic output method based on the calling interface */ function autoOutput($FileName="output.png") { if (php_sapi_name() == "cli") $this->Render($FileName); else $this->Stroke(); } /* Render the picture to a file */ function render($FileName) { if ( $this->TransparentBackground ) { imagealphablending($this->Picture,false); imagesavealpha($this->Picture,true); } imagepng($this->Picture,$FileName); } /* Render the picture to a web browser stream */ function stroke($BrowserExpire=FALSE) { if ( $this->TransparentBackground ) { imagealphablending($this->Picture,false); imagesavealpha($this->Picture,true); } if ( $BrowserExpire ) { header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); header("Cache-Control: no-cache"); header("Pragma: no-cache"); } header('Content-type: image/png'); imagepng($this->Picture); }
如需其他操作、图像处理、添加效果、水印等可以直接对 $myPicture 操作和相应的转换。
1、注释掉:$myPicture->autoOutput("pictures/example.radar.values.png");
2、自定义获取image对象
//渲染图片(选择最佳方式) //$myPicture->autoOutput("pictures/example.radar.values.png"); //转换雷达图 if($myPicture->TransparentBackground){ imagealphablending($myPicture->Picture,false); imagesavealpha($myPicture->Picture,true); } ob_start(); imagepng($myPicture->Picture); $image_data = ob_get_contents(); ob_end_clean(); //输出 //header("Content-Type:image/png"); //echo $image_data; //现在可以为所欲为了。
原创文章,转载请注明出处:https://www.weizhixi.com/article/95.html