PHP实现股票趋势图和柱形图
基于强大的pchart类库。
<?php
/*
*股票趋势图和柱形图
*@author:Skiychan<developer@zzzzy.com>
*@created:02/05/2015
*/
include"libs/pData.class.php";
include"libs/pDraw.class.php";
include"libs/pImage.class.php";
include"database.php";
include"libs/convert.php";
date_default_timezone_set('Asia/Shanghai');
/*
*@paramtypeline/other趋势图/柱形图默认趋势图
*@paramtxt1/other显示/不显示提示文字默认不显示
*@paramlanghk/cn繁体中文/简体中文默认繁体
*@paramidint股票编号必填
*@paramminint最小时间默认无
*@parammaxint最大时间默认无
*/
$type=isset($_GET['type'])?$_GET['type']:'line';
$showtxt=(isset($_GET['txt'])&&($_GET['txt']==1))?true:false;
//设置语言
if(isset($_GET['lang'])){
$lang=$_GET['lang']=='cn'?'cn':'hk';
}else{
$lang='hk';
}
$desc_tip=array(
'hk'=>array(
'line'=>array("昨日收盤價","股價"),
'bar'=>"總成交量:"
),
'cn'=>array(
'line'=>array("昨日收盘价","股价"),
'bar'=>"总成交量:"
)
);
$id=isset($_GET['id'])?(int)$_GET['id']:1;//股票编码
//条件
$wheres="wherestock_no=".$id;
//最小时间
if(isset($_GET['min'])){
$wheres.="and`created`>=".(int)$_GET['min'];
}
//最大时间
if(isset($_GET['max'])){
$wheres.="and`created`<=".(int)$_GET['max'];
}
$wheres.="orderbycreated";
$sth=$dbh->prepare("SELECT*FROM$tb_name".$wheres);
$sth->execute();
$results=$sth->fetchAll(PDO::FETCH_ASSOC);
if($lang=='hk'){
$ttf_path="fonts/zh_hk.ttc";
}else{
$ttf_path="fonts/zh_cn.ttf";
}
//初始化
$line2=array();//股价
$bar=array();//成交量
$times=array();//时间
foreach($resultsas$keys=>$values):
$line2[]=$values['current_price'];
$bar[]=$values['volume'];
//只显示整点的标签
if($keys%4==0){
$times[]=$values['created'];
}else{
$times[]=VOID;
}
endforeach;
$l2counts=count($line2);
$myData=newpData();
//如果是线型图
if($type=="line"){
//取股票名称
$stock_sth=$dbh->prepare("SELECT`name`FROM`tbl_stock`WHERE`code`={$id}");
$stock_sth->execute();
$stock_info=$stock_sth->fetch(PDO::FETCH_ASSOC);
$func_name="zhconversion_".$lang;
//$stock_name=$func_name($stock_info['name']);
$stock_name="某某公司";
//取出最值
$sql="SELECTMIN(`current_price`)xiao,MAX(`current_price`)daFROM$tb_name$wheres";
foreach($dbh->query($sql,PDO::FETCH_ASSOC)as$row){
$bottom=(int)$row['xiao']-2;
$top=(int)$row['da']+2;
}
//昨日收盘价
$l1s=array();
for($i=1;$i<=$l2counts;$i++){
$l1s[]=130;
}
$myData->addPoints($l1s,"Line1");
$myData->addPoints($line2,"Line2");
$myData->setPalette("Line1",array("R"=>51,"G"=>114,"B"=>178));
$myData->setPalette("Line2",array("R"=>0,"G"=>255,"B"=>0));
$myData->setAxisPosition(0,AXIS_POSITION_RIGHT);
$myData->addPoints($times,"Times");
$myData->setSerieDescription("Times","Time");
$myData->setAbscissa("Times");
$myData->setXAxisDisplay(AXIS_FORMAT_TIME,"H:i");
$myPicture=newpImage(480,300,$myData);
//设置默认字体
$myPicture->setFontProperties(array("FontName"=>"fonts/en_us.ttf","FontSize"=>6));
//背景颜色
//$Settings=array("StartR"=>219,"StartG"=>231,"StartB"=>139,"EndR"=>1,"EndG"=>138,"EndB"=>68,"Alpha"=>50);
//$myPicture->drawGradientArea(0,0,480,300,DIRECTION_VERTICAL,$Settings);
//画格子和标签
$myPicture->setGraphArea(10,40,440,260);
$AxisBoundaries=array(0=>array("Min"=>$bottom,"Max"=>$top));
$Settings=array(
"Mode"=>SCALE_MODE_MANUAL,
"GridR"=>200,
"GridG"=>200,
"GridB"=>200,
"XMargin"=>0,
"YMargin"=>0,
//"DrawXLines"=>false,
"GridTicks"=>3,//格子密度
"ManualScale"=>$AxisBoundaries,
);
$myPicture->drawScale($Settings);
//画线
/*
$line_arr=array(
"ForceColor"=>TRUE,
"ForceR"=>0,
"ForceG"=>0,
"ForceB"=>255);
$myPicture->drawLineChart($line_arr);*/
$myPicture->drawLineChart();
//设置Line1为无效,再画底色
$myData->setSerieDrawable("Line1",FALSE);
//画区域底线
$area_arr=array(
"ForceTransparency"=>15,//透明度
);
$myPicture->drawAreaChart($area_arr);
//是否显示文字
if($showtxt){
//标题
$myPicture->drawText(200,30,$stock_name,array("FontName"=>$ttf_path,"FontSize"=>11,"Align"=>TEXT_ALIGN_BOTTOMMIDDLE));
//设置Line1为有效
$myData->setSerieDrawable("Line1",TRUE);
$myData->setSerieDescription("Line1",$desc_tip[$lang]['line'][0]);
$myData->setSerieDescription("Line2",$desc_tip[$lang]['line'][1]);
$myPicture->setFontProperties(array("FontName"=>$ttf_path,"FontSize"=>8));
$tips=array(
"Style"=>LEGEND_NOBORDER,
"Mode"=>LEGEND_HORIZONTAL,
"FontR"=>0,"FontG"=>0,"FontB"=>0,
);
$myPicture->drawLegend(20,26,$tips);
}
//柱形图
}else{
$myData->addPoints($bar,"Bar");
$myData->setPalette("Bar",array("R"=>51,"G"=>114,"B"=>178));//设置柱子的颜色
$myData->addPoints($times,"Times");
$myData->setSerieDescription("Times","Time");
$myData->setAbscissa("Times");
$myData->setXAxisDisplay(AXIS_FORMAT_TIME,"H:i");
$myPicture=newpImage(480,200,$myData);
//设置默认字体
$myPicture->setFontProperties(array("FontName"=>"fonts/en_us.ttf","FontSize"=>6));
$myPicture->Antialias=FALSE;
$myPicture->setGraphArea(50,20,450,180);
//网格及坐标
$scaleSettings=array(
"Mode"=>SCALE_MODE_START0,
"GridR"=>200,
"GridG"=>200,
"GridB"=>200);
$myPicture->drawScale($scaleSettings);
/*
$Palette=array();
for($i=0;$i<=$l2counts;$i++){
$Palette[$i]=array("R"=>74,"G"=>114,"B"=>178,"Alpha"=>100);
}
//$Palette=array("0"=>array("R"=>74,"G"=>114,"B"=>178,"Alpha"=>100));
/*覆盖画板色
$barSetting=array(
"OverrideColors"=>$Palette,
);
$myPicture->drawBarChart($barSetting);
*/
$myPicture->drawBarChart();
//是否显示文字
if($showtxt){
$tips=array(
"Style"=>LEGEND_NOBORDER,
"Mode"=>LEGEND_HORIZONTAL,
"FontR"=>0,"FontG"=>0,"FontB"=>0,
);
$myPicture->setFontProperties(array("FontName"=>$ttf_path,"FontSize"=>9));
$alls=0;//总成交量初始化
foreach($baras$value){
$alls+=$value;
}
$myData->setSerieDescription("Bar",$desc_tip[$lang]['bar'].$alls);
$myPicture->drawLegend(300,9,$tips);
}
}
$myPicture->stroke();
//$myPicture->autoOutput("image.png");
//保存日志
//file_put_contents("log.txt",json_encode($myData)."\n");
?>