Welcome 微信登录

首页 / 网页编程 / PHP / 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");/* * @param type line/other 趋势图/柱形图 默认趋势图 * @param txt 1/other 显示/不显示 提示文字 默认不显示 * @param lang hk/cn 繁体中文/简体中文 默认繁体 * @param id int 股票编号 必填 * @param min int 最小时间 默认无 * @param max int 最大时间 默认无 */$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 = "where stock_no = ".$id;//最小时间if (isset($_GET["min"])) {$wheres .= " and `created` >= ".(int)$_GET["min"];}//最大时间if (isset($_GET["max"])) {$wheres .= " and `created` <= ".(int)$_GET["max"];}$wheres .= " order by created";$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 ($results as $keys => $values) :$line2[] = $values["current_price"];$bar[] = $values["volume"];//只显示整点的标签if ($keys % 4 == 0) {$times[] = $values["created"];} else {$times[] = VOID;}endforeach;$l2counts = count($line2);$myData = new pData();//如果是线型图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 = "SELECT MIN(`current_price`) xiao, MAX(`current_price`) da FROM $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 = new pImage(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 = new pImage(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 ($bar as $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) . "
");?>