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"); ?>