需求 :由于工作需要,需要在一张背景图上添加这一张雷达图,之后图片可以在微信中长按保存。所以说我必须生成一张带有雷达图的图片
第一反应是用百度echars雷达图做动态显示,之后截图。考虑到工作量和效率,放弃。
改为pchart 直接生成雷达图图片 然后用imagick拓展贴到背景图上面。由于imagick攻略比较详细,这里不做赘述,而pchart中文文档则比较匮乏,所以简略介绍下。
第一步 在pchart官网下载类库 http://www.pchart.net/download 建议在本地环境调试,因为你需要大量的操作去调试点线的颜色外形。
下一个zip的包就可以了 一般的解压工具就可以解压缩 重点关注三个文件夹 class example fonts
1 . class目录为生成雷达图类库 包含数据处理类 画图类等 因为需求对颜色样式要求很高 所以大概做了一些了解。如果只是简单要一张雷达图可不做了解。
pData.class.php=>处理数据 转化为点线图形 色值需要设置(必须)
pDraw.class.php=>画图类(必须)
pImage.class.php=>图片处理类(必须)
pRadar.class.php=>雷达图类(必须)
其他为非必须引入 当然如果嫌麻烦可以不用管他们是干什么用的 全扔项目里就好
2. fonts目录为字体资源目录
3. example 示例目录
工具包内有index文件,在php环境下打开文件夹,会自动生成图形界面这还是比较人性化的一个设计。
如果只是要一个二维坐标轴 name直接用sandbox直接调试想要的图形就好了 这是一个调试工具。二维的图基本都可以出来
回来说我们的 雷达图 在目录下找到一个跟需求类似的雷达图
然后根据名称找到对应去 example目录下找到对应的文件 复制一份到上层目录下新建一个自己的目录 myexample下 根据直接本地访问调试就好了 大部分需要用到的注释在脚本中注释了
效果:基本每个部分都可调试
<?php
/**
* Created by PhpStorm.
* User: zhangxd
* Date: 2018/2/9
* Time: 15:20
*/
include ("../class/pData.class.php");
include ("../class/pDraw.class.php");
include ("../class/pImage.class.php");
include ("../class/pRadar.class.php");
$one_data = array(1,5,10,20,30);
drow_love_radar($one_data);
function drow_love_radar($one_data, $file_name='radar.png', $type='auto'){
/* 设置颜色 */
$MyData = new pData();
$MyData->addPoints($one_data, "score");
//设置字体描述
//$MyData->setSerieDescription("ScoreB", "Coverage B");
//设置数据线颜色(此处为红绿蓝三元素调色 alpha为透明度)
$data = array("R"=>30,"G"=>220,"B"=>245,"Alpha"=>100);
$MyData->setPalette('score',$data);
/* 设立数据名称 此处设置为空 不做显示名称 但是占位*/
$MyData->addPoints(array("", "", "", "", ""), "score_name");
$MyData->setAbscissa("score_name");
/* 创建画布设置大小 */
$myPicture = new pImage(800, 800, $MyData);
//$myPicture = new pImage(212, 213, $MyData);
/* 画一个背景蒙版 */
$Settings = array("R" => 255, "G" => 151, "B" => 178,"Alpha" => 100);
//$myPicture->drawFilledRectangle(0, 0, 700, 230, $Settings);
//根据起点和重点设置背景图大小
$myPicture->drawFilledRectangle(100, 100, 600, 600, $Settings);
/* 设置默认的字体属性 */
$myPicture->setFontProperties(array("FontName" => "../fonts/Forgotte.ttf", "FontSize" => 10, "R" => 80, "G" => 80, "B" => 80));
/*在数据区域 添加填充颜色(为图添加阴影)*/
// $myPicture->setShadow(TRUE, array("X" => 1, "Y" => 1, "R" => 250, "G" => 255, "B" => 250, "Alpha" => 50));
//$myPicture->setShadow(TRUE, array("X" => 1, "Y" => 1, "R" => 49, "G" => 221, "B" => 243, "Alpha" => 100));
/* Create the pRadar object */
$SplitChart = new pRadar();
//根据起点和重点设置雷达图大小
$myPicture->setGraphArea(200, 200, 500, 500);
$Options = array(
//坐标轴颜色
'AxisR'=>255,
'AxisG'=>0,
'AxisB'=>0,
'AxisAlpha'=>100,
"AxisRotation" => -17, //图形旋转角度
"DrawPoly" => TRUE, //区域阴影 需要调用setShadow方法设置阴影颜色
// "PolyAlpha" => 100, //区域阴影 透明度
'DrawAxisValues' => false, //画坐标轴的值 奇丑
'WriteValues'=>false, //在坐标轴顶点标注数值
'WriteValuesInBubble'=>true, //在顶点气泡中标注
'ValuePadding'=>1, //在顶点气泡中标注 大小
'OuterBubbleRadius'=>0, //顶点气泡颜色
//设置渐变颜色 从里圈到外圈
"BackgroundGradient" => array("StartR" => 255, "StartG" => 151, "StartB" => 178, "StartAlpha" => 100, "EndR" => 255, "EndG" => 255, "EndB" => 255, "EndAlpha" => 100),
'Layout'=>690011,//690011=>尖角雷达图 690012=>圆角雷达图
'SegmentHeight'=> 5,//设置每个坐标格大小
'Segments'=> 3, //设置雷达图显示几个坐标格
'LabelMiddle'=>true,
//标签的一些东西 死丑死丑的 反正我没用
'LabelsBackground'=>true,
'LabelsBGR'=>255,
'LabelsBGG'=>255,
'LabelsBGB'=>255,
'LabelsBGAlpha'=>100,
"LabelPos" => RADAR_LABELS_HORIZONTAL,
'LabelPadding'=>10,//标签距离
'DrawPoints'=>TRUE,//画坐标顶点的小圆点
'PointRadius'=>5,//坐标顶点的小圆点大小
'PointSurrounding'=>500,
'DrawLines'=>true,//画坐标点连接线(首尾点不连接 适用于xy坐标轴)
'LineLoopStart'=>true,//链接首尾的点
"FontName" => "../fonts/pf_arma_five.ttf",//字体文件
"FontSize" => 6,//字体大小
/*下面的调试无结果*/
//设置外 气泡颜色
'OuterBubbleR'=>1,
'OuterBubbleG'=>1,
'OuterBubbleB'=>1,
'OuterBubbleAlpha'=>100,
//设置内 气泡颜色
'InnerBubbleR'=>1,
'InnerBubbleG'=>1,
'InnerBubbleB'=>1,
'InnerBubbleAlpha'=>100,
//设置背景色
'DrawBackground'=>true,
'BackgroundR'=>255,
'BackgroundG'=>255,
'BackgroundB'=>255,
'BackgroundAlpha'=>100,
);
$SplitChart->drawRadar($myPicture, $MyData, $Options);
switch ($type){
case 'auto':
//根据输出环境操作 在命令模式下保存
$myPicture->autoOutput($file_name);
break;
case 'out':
$myPicture->stroke();
break;
case 'save':
$myPicture->Render($file_name);
break;
}
}
友情提示:最好熟悉一下dg库 要不调试起来会很痛苦。
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
pChart是一个开源的图表生成库,主要涉及3个Class:pChart.class, pData.class, pCache.class,可生成20多种简单或复杂的图表,支持PNG,JPG,GIF通用图片格式。数据源可以来自于Database,CSV,当然也可以手写。使用该程序PHP需要开启GD服务,先来看看pChart的工作流程:
主要分为三步:
- * 读取用于生成图表数据(数据库、文件)
- * 设计图表样式(圆角、底色等)
- * 制作标签、题目、图例并生成图表
下面看一个简单的柱状图表:
代码如下:
<?php // Standard inclusions include("pChart/pData.class"); include("pChart/pChart.class"); // Dataset definition $DataSet = new pData; //图表数据 $DataSet->AddPoint(array(1,4,-3,2,-3,3,2,1,0,7,4),"Serie1"); $DataSet->AddPoint(array(3,3,-4,1,-2,2,1,0,-1,6,3),"Serie2"); $DataSet->AddPoint(array(4,1,2,-1,-4,-2,3,2,1,2,2),"Serie3"); $DataSet->AddAllSeries(); $DataSet->SetAbsciseLabelSerie(); //数据图例 $DataSet->SetSerieName("Microsoft","Serie1"); $DataSet->SetSerieName("IBM","Serie2"); $DataSet->SetSerieName("Google","Serie3"); // Initialise the graph $Test = new pChart(700,230); //设置图表尺寸、样式 $Test->setFontProperties("Fonts/tahoma.ttf",8); $Test->setGraphArea(50,30,680,200); $Test->drawFilledRoundedRectangle(7,7,693,223,5,240,240,240); $Test->drawRoundedRectangle(5,5,695,225,5,230,230,230); $Test->drawGraphArea(255,255,255,TRUE); $Test->drawScale($DataSet->GetData(),$DataSet->GetDataDescription(),SCALE_NORMAL,150,150,150,TRUE,0,2,TRUE); $Test->drawGrid(4,TRUE,230,230,230,50); // Draw the 0 line $Test->setFontProperties("Fonts/MankSans.ttf",6); $Test->drawTreshold(0,143,55,72,TRUE,TRUE); // Draw the bar graph //柱状图要使用drawBarGraph() $Test->drawBarGraph($DataSet->GetData(),$DataSet->GetDataDescription(),TRUE,80); // Finish the graph //制作图例、标题、字体等属性 $Test->setFontProperties("Fonts/MankSans.ttf",10); $Test->drawLegend(596,150,$DataSet->GetDataDescription(),255,255,255); $Test->setFontProperties("Fonts/MankSans.ttf",10); $Test->drawTitle(50,22,"Example",50,50,50,585); //生成图表 $imageFile = "example12.png"; $Test->Render($imageFile); echo '<img src="'.$imageFile.'">'; ?>
这个是雷达效果的:
代码:
<?php // Standard inclusions include("pChart/pData.class"); include("pChart/pChart.class"); // Dataset definition $DataSet = new pData; $DataSet->AddPoint(array("Memory","Disk","Network","Slots","CPU"),"Label"); $DataSet->AddPoint(array(6,4,7,4,5),"Serie1"); $DataSet->AddPoint(array(2,3,5,2,4),"Serie2"); $DataSet->AddSerie("Serie1"); $DataSet->AddSerie("Serie2"); $DataSet->SetAbsciseLabelSerie("Label"); $DataSet->SetSerieName("Reference","Serie1"); $DataSet->SetSerieName("Tested computer","Serie2"); // Initialise the graph $Test = new pChart(400,400); $Test->setFontProperties("Fonts/tahoma.ttf",8); $Test->drawFilledRoundedRectangle(7,7,393,393,5,240,240,240); $Test->drawRoundedRectangle(5,5,395,395,5,230,230,230); $Test->setGraphArea(30,30,370,370); $Test->drawFilledRoundedRectangle(30,30,370,370,5,255,255,255); $Test->drawRoundedRectangle(30,30,370,370,5,220,220,220); // Draw the radar graph //要使用drawRadarAxis()生成雷达效果 $Test->drawRadarAxis($DataSet->GetData(),$DataSet->GetDataDescription(),TRUE,20,120,120,120,230,230,230); $Test->drawFilledRadar($DataSet->GetData(),$DataSet->GetDataDescription(),50,20); // Finish the graph $Test->drawLegend(15,15,$DataSet->GetDataDescription(),255,255,255); $Test->setFontProperties("Fonts/tahoma.ttf",10); $Test->drawTitle(0,22,"Example",50,50,50,400); $imageFile = "example8.png"; $Test->Render($imageFile); echo '<img src="'.$imageFile.'">'; ?>
再看几个其他的效果
1,饼图:
2, 双座标曲线图:
3, 层叠柱状图:
4, 多图表:
图表的种类已经相当丰富了,具体图表设置请参考
http://pchart.sourceforge.net/documentation.php?topic=pChart
::源代码下载::
https://blog.csdn.net/ycyangcai/article/details/4437099