gd动态曲线 php_php中用GD绘制折线图

1 ClassChart{2 private $image; //定义图像

3 private $title; //定义标题

4 private $ydata; //定义Y轴数据

5 private $xdata; //定义X轴数据

6 private $seriesName; //定义每个系列数据的名称

7 private $color; //定义条形图颜色

8 private $bgcolor; //定义图片背景颜色

9 private $width; //定义图片的宽

10 private $height; //定义图片的长

11

12 /*

13 * 构造函数14 * String title 图片标题15 * Array xdata 索引数组,X轴数据16 * Array ydata 索引数组,数字数组,Y轴数据17 * Array series_name 索引数组,数据系列名称18 */

19 function __construct($title,$xdata,$ydata,$seriesName) {20 $this->title = $title;21 $this->xdata = $xdata;22 $this->ydata = $ydata;23 $this->seriesName = $seriesName;24 $this->color = array('#058DC7', '#50B432', '#ED561B', '#DDDF00', '#24CBE5', '#64E572', '#FF9655', '#FFF263', '#6AF9C4');25 }26

27 /*

28 * 公有方法,设置条形图的颜色29 * Array color 颜色数组,元素取值为'#058DC7'这种形式30 */

31 function setBarColor($color){32 $this->color = $color;33 }34 /*

35 * 绘制折线图36 */

37 public functionpaintLineChart() {38 $ydataNum = $this->arrayNum($this->ydata); //取得数据分组的个数

39 $max = $this->arrayMax($this->ydata); //取得所有呈现数据的最大值

40 $max = ($max > 100)? $max : 100;41 $multi = $max/100; //如果最大数据是大于100的则进行缩小处理

42 $barHeightMulti = 2.2; //条形高缩放的比例

43 $lineWidth = 50;44 $chartLeft = (1+strlen($max))*12; //设置图片左边的margin

45

46 $lineY = 250; //初始化条形图的Y的坐标47 // 设置图片的宽、高48 //$this->width = $lineWidth*count($this->xdata) + $chartLeft - $lineWidth/1.6;

49

50 $margin = 10; //小矩形描述右边margin

51 $recWidth = 20; //小矩形的宽

52 $recHeight = 15; //小矩形的高

53 $space = 20; //小矩形与条形图的间距

54 $tmpWidth = 0;55 //设置图片的宽、高

56 $lineChartWidth = $lineWidth*count($this->xdata) + $chartLeft - $lineWidth/1.6;57 //两个系列数据以上的加上小矩形的宽

58 if($ydataNum > 1) {59 $tmpWidth = $this->arrayLengthMax($this->seriesName)*10*4/3 + $space + $recWidth + + $margin;60 }61 $this->width = $lineChartWidth + $tmpWidth;62

63 $this->height = 300;64 $this->image = imagecreatetruecolor($this->width ,$this->height); //准备画布

65 $this->bgcolor = imagecolorallocate($this->image,255,255,255); //图片的背景颜色66

67 // 设置条形图的颜色

68 $color = array();69 foreach($this->color as $col) {70 $col = substr($col,1,strlen($col)-1);71 $red = hexdec(substr($col,0,2));72 $green = hexdec(substr($col,2,2));73 $blue = hexdec(substr($col,4,2));74 $color[] = imagecolorallocate($this->image ,$red, $green, $blue);75 }76

77 //设置线段的颜色、字体的颜色、字体的路径

78 $lineColor = imagecolorallocate($this->image ,0xcc,0xcc,0xcc);79 $fontColor = imagecolorallocate($this->image, 0x95,0x8f,0x8f);80 $fontPath = 'font/simsun.ttc';81

82 imagefill($this->image,0,0,$this->bgcolor); //绘画背景83

84 // 绘画图的分短线与左右边线

85 for($i = 0; $i < 6; $i++) {86 imageline($this->image,$chartLeft-10,$lineY-$barHeightMulti*$max/5/$multi*$i,$lineChartWidth,$lineY-$barHeightMulti*$max/5/$multi*$i,$lineColor);87 imagestring($this->image,4,5,$lineY-$barHeightMulti*$max/5/$multi*$i-8,floor($max/5*$i),$fontColor);88 }89 imageline($this->image,$chartLeft-10,30,$chartLeft-10,$lineY,$lineColor);90 imageline($this->image,$lineChartWidth-1,30,$lineChartWidth-1,$lineY,$lineColor);91 $style = array($lineColor,$lineColor,$lineColor,$lineColor,$lineColor,$this->bgcolor,$this->bgcolor,$this->bgcolor,$this->bgcolor,$this->bgcolor);92 imagesetstyle($this->image,$style);93

94 //绘制折线图的分隔线(虚线)

95 foreach($this->xdata as $key => $val) {96 $lineX = $chartLeft + 3 + $lineWidth*$key;97 imageline($this->image,$lineX,30,$lineX,$lineY,IMG_COLOR_STYLED);98 }99

100 //绘画图的折线

101 foreach($this->ydata as $key => $val) {102 if($ydataNum == 1) {103 //一个系列数据时

104 if($key == count($this->ydata) - 1 ) break;105 $lineX = $chartLeft + 3 + $lineWidth*$key;106 $lineY2 = $lineY-$barHeightMulti*($this->ydata[$key+1])/$multi;107

108 //画折线

109 if($key == count($this->ydata) - 2) {110 imagefilledellipse($this->image,$lineX+$lineWidth,$lineY2,10,10,$color[0]);111 }112 imageline($this->image,$lineX,$lineY-$barHeightMulti*$val/$multi,$lineX+$lineWidth,$lineY2,$color[0]);113 imagefilledellipse($this->image,$lineX,$lineY-$barHeightMulti*$val/$multi,10,10,$color[0]);114 }elseif($ydataNum > 1) {115 //多个系列的数据时

116 foreach($val as $ckey => $cval) {117

118 if($ckey == count($val) - 1 ) break;119 $lineX = $chartLeft + 3 + $lineWidth*$ckey;120 $lineY2 = $lineY-$barHeightMulti*($val[$ckey+1])/$multi;121 //画折线

122 if($ckey == count($val) - 2) {123 imagefilledellipse($this->image,$lineX+$lineWidth,$lineY2,10,10,$color[$key%count($this->color)]);124 }125 imageline($this->image,$lineX,$lineY-$barHeightMulti*$cval/$multi,$lineX+$lineWidth,$lineY2,$color[$key%count($this->color)]);126 imagefilledellipse($this->image,$lineX,$lineY-$barHeightMulti*$cval/$multi,10,10,$color[$key%count($this->color)]);127 }128 }129

130 }131

132 //绘画条形图的x坐标的值

133 foreach($this->xdata as $key => $val) {134 $lineX = $chartLeft + $lineWidth*$key + $lineWidth/3 - 20;135 imagettftext($this->image,10,-65,$lineX,$lineY+15,$fontColor,$fontPath,$this->xdata[$key]);136 }137

138 //两个系列数据以上时绘制小矩形及之后文字说明

139 if($ydataNum > 1) {140 $x1 = $lineChartWidth + $space;141 $y1 = 20;142 foreach($this->seriesName as $key => $val) {143 imagefilledrectangle($this->image,$x1,$y1,$x1+$recWidth,$y1+$recHeight,$color[$key%count($this->color)]);144 imagettftext($this->image,10,0,$x1+$recWidth+5,$y1+$recHeight-2,$fontColor,$fontPath,$this->seriesName[$key]);145 $y1 += $recHeight + 10;146 }147 }148

149 //绘画标题

150 $titleStart = ($this->width - 5.5*strlen($this->title))/2;151 imagettftext($this->image,11,0,$titleStart,20,$fontColor,$fontPath,$this->title);152

153 //输出图片

154 header("Content-Type:image/png");155 imagepng ( $this->image );156 }157

158

159 /*

160 * 私有方法,当数组为二元数组时,统计数组的长度161 * Array arr 要做统计的数组162 */

163 private function arrayNum($arr) {164 $num = 0;165 if(is_array($arr)) {166 $num++;167 for($i = 0; $i < count($arr); $i++){168 if(is_array($arr[$i])) {169 $num = count($arr);170 break;171 }172 }173 }174 return $num;175 }176

177 /*

178 * 私有方法,计算数组的深度179 * Array arr 数组180 */

181 private function arrayDepth($arr) {182 $num = 0;183 if(is_array($arr)) {184 $num++;185 for($i = 0; $i < count($arr); $i++){186 if(is_array($arr[$i])) {187 $num += $this->arrayDepth($arr[$i]);188 break;189 }190 }191 }192 return $num;193 }194

195 /*

196 * 私有方法,找到一组中的最大值197 * Array arr 数字数组198 */

199 private function arrayMax($arr) {200 $depth = $this->arrayDepth($arr);201 $max = 0;202 if($depth == 1) {203 rsort($arr);204 $max = $arr[0];205 }elseif($depth > 1) {206 foreach($arr as $val) {207 if(is_array($val)) {208 if($this->arrayMax($val) > $max) {209 $max = $this->arrayMax($val);210 }211 }else{212 if($val > $max){213 $max = $val;214 }215 }216 }217 }218 return $max;219 }220

221 /*

222 * 私有方法,求数组的平均值223 * Array arr 数字数组224 */

225 function arrayAver($arr) {226 $aver = array();227 foreach($arr as $val) {228 if(is_array($val)) {229 $aver = array_merge($aver,$val);230 }else{231 $aver[] = $val;232 }233 }234 return array_sum($aver)/count($aver);235 }236

237 /*

238 * 私有方法,求数组中元素长度最大的值239 * Array arr 字符串数组,必须是汉字240 */

241 private function arrayLengthMax($arr) {242 $length = 0;243 foreach($arr as $val) {244 $length = strlen($val) > $length ? strlen($val) : $length;245 }246 return $length/3;247 }248

249 //析构函数

250 function__destruct(){251 imagedestroy($this->image);252 }253 }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/409919.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Nginx网站用户认证

一、Nginx网站用户认证 用户认证&#xff1a;用户访问网页时需要输入一个用户名和密码才能打开网页。 nginx的默认网页时安装目录下的html/index.html&#xff0c;配置文件在安装目录下的conf目录中的nginx.conf 无用户认证网页 修改配置文件/usr/local/nginx/conf/nginx.conf(…

STL源码剖析学习二:空间配置器(allocator)

STL源码剖析学习二&#xff1a;空间配置器&#xff08;allocator&#xff09; 标准接口&#xff1a;vlaue_typepointerconst_pointerreferenceconst_referencesize_typedifference_typerebindallocator()--default constructorallocator(const allocator<U>&--copy c…

[html] iframe如何自动调整高度?

[html] iframe如何自动调整高度&#xff1f; 未跨域时&#xff0c;在iframe中利用他的父窗口对象将本页面的滚动高度设置给iframe的height 跨域时&#xff0c;在iframe中将自己的的滚动高设置在本页面内的一个隐藏于父页面不跨域的iframe的hash值&#xff0c; 在隐藏的iframe中…

python selenium 处理弹窗_python+selenium 抓取弹出对话框信息

抓取弹出对话框信息&#xff0c;困挠了我很久&#xff0c;我百度了很久&#xff0c;一直没有找到我想要的内容。最近学习到了。 有两种方法&#xff1a; 1、driver.switch_to.alert.text 2、result EC.alert_is_present()(driver).text 这个要导入from selenium.webdriver.sup…

Nginx基于域名的虚拟主机

一、基于域名的虚拟主机 修改配置文件/usr/local/nginx/conf/nginx.conf 创建新的虚拟主机的根目录和默认网页index.html 重新加载nginx的配置文件 查看两个虚拟主机 因为这两个域名是随便写的&#xff0c;所以需要修改windows系统的hosts文件&#xff0c;让电脑能够解析www.a.…

【100题】第三十四 实现一个队列

一&#xff0c;题目&#xff1a; 生产者消费者线程演示 一个生产者线程将int类型的数入列&#xff0c;一个消费者线程将int类型的数出列 二&#xff0c;分析&#xff1a; 这一个&#xff0c;为操作系统上的一个经典例子&#xff0c;以下是july给出的解答 …

[html] 如何禁止web端的页面缩放?

[html] 如何禁止web端的页面缩放&#xff1f; <meta name"viewport" content"widthdevice-width, initial-scale1,user-scalable0">个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很酷。欢迎大家…

centos安装后两个启动项、_Windows安装Centos7双系统后Windows启动项消失

方法一&#xff1a;在Centos7下root登陆编辑 /boot/grub2/grub.cfgvim /boot/grub2/grub.cfg在第一行添加menuentry "Windows10" {insmod ntfsset root(hd0,)chainloader }其中(hd0, 1)的1代表你的windows10安装所在的盘修改完毕后保存并退出然后设置Windows10为默认…

如何给定两个gps坐标 算出航向角_机器人开发如何配置ROS中的TF变换关系?

当我们进行机器人开发时&#xff0c;常常需要面对TF坐标转换&#xff0c;本文以 Autolabor Pro1 与思岚激光雷达为例&#xff0c;介绍ROS TF的使用。Autolabor Pro1是什么&#xff1f;Autolabor Pro1是一款室内外通用机器人移动底盘。该平台上可集成激光雷达、摄像头、GPS等传感…

Tomcat架构与原理

Tomcat架构与原理 架构图 原理 ①、用户点击网页内容&#xff0c;请求被发送到本机端口8080&#xff0c;被在那里监听的Coyote HTTP/1.1 Connector获得。 ②、Connector把该请求交给它所在的Service的Engine来处理&#xff0c;并等待Engine的回应。 ③、Engine获得请求localhos…

[html] 微软雅黑是有版权的,在页面中使用font-family:Microsoft YaHei会不会有版权问题呢?

[html] 微软雅黑是有版权的&#xff0c;在页面中使用font-family:Microsoft YaHei会不会有版权问题呢&#xff1f; font-family: Microsoft YaHei的写法&#xff0c;个人、商用都不会有版权问题&#xff0c;可以放心使用&#xff01;但是如果是通过font-face引用微软雅黑的话&…

aodv路由协议分析

1 AODV 报文格式 AODV 有三种基本的协议报文类型&#xff1a;RREQ 报文、RREP 报文和RRER 报文。 1.1 RREQ 报文 a. 对RREQ 的处理 接收到RREQ 的结点做如下处理&#xff1a; &#xff08;1&#xff09;创建一个表项&#xff0c;先不分配有效序列号&#xff0c;用于记录反向路径…

rfid射频前端的主要组成部分有_第4章 RFID的射频前端(simple).ppt

(1)阅读器天线电路 * Microchip 公司的13.56 MHz应答器(无源射频卡)MCRF355和MCRF360芯片的天线电路 无源应答器的天线电路多采用并联谐振回路 * 并联谐振回路 在研究并联谐振回路时&#xff0c;采用恒流源(信号源内阻很大)分析比较方便。 并联谐振 谐振条件 - 实际中线圈的电…

c语言转换为python语言_python和c语言

广告关闭 腾讯云11.11云上盛惠 &#xff0c;精选热门产品助力上云&#xff0c;云服务器首年88元起&#xff0c;买的越多返的越多&#xff0c;最高返5000元&#xff01; c语言是编译型语言&#xff0c;经过编译后&#xff0c;生成机器码&#xff0c;然后再运行&#xff0c;执行速…

Tomcat安装与使用

Tomcat安装与使用 Tomcat是JAVA语言编写的&#xff0c;需要jdk环境。jdk从Oracle官网下载&#xff0c;不过要求登录后才能下载。 Tomcat的主配置文件&#xff1a;安装路径下的 conf/server.xml。 Tomcat默认监听8080端口。 下载&安装jdk #卸载或升级自带的java环境。 #查找…

COJ1196(Staginner 去爬山)

题目大意&#xff1a;给定一个n*m的只含0和1的矩阵&#xff0c;从矩阵的最后一行中的某个1出发&#xff0c;每步只能走到相邻的且是1的格子中&#xff0c;求能达到的最大高度&#xff08;最小行数&#xff09;。 这题直接DFS即可&#xff0c;复杂度为O(N*M)。 View Code 1 #in…

[html] 对一个元素设置浮动后,它的特征是什么?

[html] 对一个元素设置浮动后&#xff0c;它的特征是什么&#xff1f; 浮动元素脱离正常的文档流浮动元素后的内联元素&#xff0c;将围绕在浮动元素周围浮动元素会造成父元素的高度坍塌个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但…

python网格划分_在python中创建一个2d网格

我真的很喜欢编程……但这是我的问题&#xff1a;我不能发布图像,但我想要的图是一个“冠”(两个半径为a的同心圆)我的意思是,在数学上讲这很容易定义,但我怎么能用python程序呢&#xff1f;我想到了这样的事情&#xff1a;def Fm1(X, Y):r r sqrt(1.*X**21.*Y**2)cos 1.*X/r…

python 三维地球_用python生成地球运动的动态模拟动态图

python作为一门简单易学且应用范围极广的语言有着其他语言无法比拟的优势&#xff0c;通过python可以实现各种各样的功能&#xff0c;例如我们可以利用python matplotlib的绘图库实现各种动态模拟仿真&#xff0c;在科学实验中有着极大的应用价值。下列是通过python实现地球公转…

xmlhttprequest level 2

http://caniuse.com/xhr2转载于:https://www.cnblogs.com/fullhouse/archive/2012/04/24/2468892.html