PHP实现股票趋势图和柱形图

前端技术 2023/09/09 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) . \"\\n\");
?>

本文地址:https://www.stayed.cn/item/25253

转载请注明出处。

本站部分内容来源于网络,如侵犯到您的权益,请 联系我

我的博客

人生若只如初见,何事秋风悲画扇。