基于html5的canvas用javascript写柱状图
来源:互联网 发布:中科大网络大学报名 编辑:程序博客网 时间:2024/05/05 22:35
使用HTML5的<canvas>
代码中共有四种形式的柱状图:
1.纵向的一种颜色的柱状图
2.纵向的多种颜色的柱状图
3.横向的一种颜色的柱状图
4.横向的多种颜色的柱状图
四种都很类似,拿第一个举例:
singleColorBarGraph(beginX,beginY,width,height,dataSet,ctx,x1Adjust,y1Adjust,x2Adjust,y2Adjust,x3Adjust,y3Adjust);传入的参数:
beginX,beginY:柱状图的起始坐标
width,height:柱状图的宽高
dataSet:传入的数据集,多种颜色的和一种颜色的数据集有些小的差别,在接下来的源代码中会看到
ctx:Context对象
x1Adjust,y1Adjust:参考线字符位置调整
x2Adjust,y2Adjust:下标字符位置调整
x3Adjust,y3Adjust:每个量数值字符的位置调整
源代码:
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <title>柱状图</title> <style type="text/css"> body{ background-color: #0be; } canvas{ background-color: white; } </style> <script type="text/javascript"> var dataSet={ 'color':'#0be', 'data':[12,18,29,2,25], 'flag':['Jan','Feb','Mar','Apr','May'] }; var dataSet2={ 'color':['#f00','#0f0','#00f','#ff0','#0ff'], 'data':[12,11,29,2,25], 'flag':['Jan','Feb','Mar','Apr','May'] }; function maxOfArray(data){ var max=0; for(var i in data){ if(max<data[i]) max=data[i]; } if(max%10){ max=(Math.ceil(max/10))*10; } return max; } function rowHeightFunction(data){ var maxData=maxOfArray(data); var maxDataDiv10=maxData/10; if(!(maxDataDiv10%5)){ return [maxData/5,5]; }else if(!(maxDataDiv10%3)){ return [maxData/3,3]; }else { return [maxData/2,2]; } } function singleColorBarGraph(beginX,beginY,width,height,dataSet,ctx,x1Adjust=0,y1Adjust=0,x2Adjust=0,y2Adjust=0,x3Adjust=0,y3Adjust=0){ var i; var barNum=dataSet.data.length;//柱的数量 var barWidth=width/(barNum*2+1);//柱的宽度 var barPos=width/(barNum+1);//柱的位置 var horizontalLineDiff=rowHeightFunction(dataSet.data)[0];//水平线的data差 var horizontalLineNum=rowHeightFunction(dataSet.data)[1];//水平线的数量 var cellPx=height/horizontalLineNum; var pxPerData=height/(horizontalLineDiff*horizontalLineNum); ctx.strokeStyle='rgb(202,202,202)'; ctx.strokeRect(beginX,beginY,width,height); for(i=0;i<horizontalLineNum+1;i++){ var yAxis=(horizontalLineNum-i)*horizontalLineDiff; ctx.moveTo(beginX,beginY+i*cellPx); ctx.lineTo(beginX+width,beginY+i*cellPx); ctx.fillText(yAxis,beginX+x1Adjust,beginY+i*cellPx+y1Adjust);//参考线字符 } for(i=1;i<dataSet.data.length+1;i++){ ctx.fillStyle='#000'; ctx.fillText(dataSet.flag[i-1],beginX+i*barPos+x2Adjust,beginY+height+y2Adjust);//下标字符 ctx.fillText(dataSet.data[i-1],beginX+i*barPos-barWidth/2+x3Adjust,beginY+height-dataSet.data[i-1]*pxPerData+y3Adjust);//每个量对应的值 ctx.fillStyle=dataSet.color; ctx.fillRect(beginX+i*barPos-barWidth/2,beginY+height-dataSet.data[i-1]*pxPerData,barWidth,dataSet.data[i-1]*pxPerData); } ctx.stroke(); } function mulColorBarGraph(beginX,beginY,width,height,dataSet,ctx,x1Adjust=0,y1Adjust=0,x2Adjust=0,y2Adjust=0,x3Adjust=0,y3Adjust=0){ var i; var barNum=dataSet.data.length;//柱的数量 var barWidth=width/(barNum*2+1);//柱的宽度 var barPos=width/(barNum+1);//柱的位置 var horizontalLineDiff=rowHeightFunction(dataSet.data)[0];//水平线的data差 var horizontalLineNum=rowHeightFunction(dataSet.data)[1];//水平线的数量 var cellPx=height/horizontalLineNum; var pxPerData=height/(horizontalLineDiff*horizontalLineNum); ctx.strokeStyle='rgb(202,202,202)'; ctx.strokeRect(beginX,beginY,width,height); for(i=0;i<horizontalLineNum+1;i++){ var yAxis=(horizontalLineNum-i)*horizontalLineDiff; ctx.moveTo(beginX,beginY+i*cellPx); ctx.lineTo(beginX+width,beginY+i*cellPx); ctx.fillText(yAxis,beginX+x1Adjust,beginY+i*cellPx+y1Adjust);//参考线字符 } for(i=1;i<dataSet.data.length+1;i++){ ctx.fillStyle='#000'; ctx.fillText(dataSet.flag[i-1],beginX+i*barPos+x2Adjust,beginY+height+y2Adjust);//下标字符 ctx.fillText(dataSet.data[i-1],beginX+i*barPos-barWidth/2+x3Adjust,beginY+height-dataSet.data[i-1]*pxPerData+y3Adjust);//每个量的字符 ctx.fillStyle=dataSet.color[i-1]; ctx.fillRect(beginX+i*barPos-barWidth/2,beginY+height-dataSet.data[i-1]*pxPerData,barWidth,dataSet.data[i-1]*pxPerData); } ctx.stroke(); } function singleColorBarGraphHorizontal(beginX,beginY,width,height,dataSet,ctx,x1Adjust=0,y1Adjust=0,x2Adjust=0,y2Adjust=0,x3Adjust=0,y3Adjust=0){ var i; var barNum=dataSet.data.length;//柱的数量 var barWidth=height/(barNum+4);//柱的宽度 var barPos=height/(barNum+1);//柱的位置 var VerticalLineDiff=rowHeightFunction(dataSet.data)[0];//竖直线的data差 var VerticalLineNum=rowHeightFunction(dataSet.data)[1];//竖直线的数量 var cellPx=width/VerticalLineNum; var pxPerData=width/(VerticalLineDiff*VerticalLineNum); ctx.strokeStyle='rgb(202,202,202)'; ctx.strokeRect(beginX,beginY,width,height);//绘制矩形框 for(i=0;i<VerticalLineNum+1;i++){//绘制垂直参考线 var xAxis=i*VerticalLineDiff; ctx.moveTo(beginX+i*cellPx,beginY); ctx.lineTo(beginX+i*cellPx,beginY+height); ctx.fillText(xAxis,beginX+i*cellPx+x1Adjust,beginY+height+y1Adjust);//参考线的数值 } for(i=1;i<dataSet.data.length+1;i++){ ctx.fillStyle='#000'; ctx.fillText(dataSet.flag[i-1],beginX+x2Adjust,beginY+i*barPos+y2Adjust);//下标字符 ctx.fillText(dataSet.data[i-1],beginX+dataSet.data[i-1]*pxPerData+x3Adjust,beginY+i*barPos-barWidth/2+y3Adjust);//柱代表的数量 ctx.fillStyle=dataSet.color; ctx.fillRect(beginX,beginY+i*barPos-barWidth/2,dataSet.data[i-1]*pxPerData,barWidth); } ctx.stroke(); } function mulColorBarGraphHorizontal(beginX,beginY,width,height,dataSet,ctx,x1Adjust=0,y1Adjust=0,x2Adjust=0,y2Adjust=0,x3Adjust=0,y3Adjust=0){ var i; var barNum=dataSet.data.length;//柱的数量 var barWidth=height/(barNum+4);//柱的宽度 var barPos=height/(barNum+1);//柱的位置 var VerticalLineDiff=rowHeightFunction(dataSet.data)[0];//竖直线的data差 var VerticalLineNum=rowHeightFunction(dataSet.data)[1];//竖直线的数量 var cellPx=width/VerticalLineNum; var pxPerData=width/(VerticalLineDiff*VerticalLineNum); ctx.strokeStyle='rgb(202,202,202)'; ctx.strokeRect(beginX,beginY,width,height);//绘制矩形框 for(i=0;i<VerticalLineNum+1;i++){//绘制垂直参考线 var xAxis=i*VerticalLineDiff; ctx.moveTo(beginX+i*cellPx,beginY); ctx.lineTo(beginX+i*cellPx,beginY+height); ctx.fillText(xAxis,beginX+i*cellPx+x1Adjust,beginY+height+y1Adjust);//参考线的数值 } for(i=1;i<dataSet.data.length+1;i++){ ctx.fillStyle='#000'; ctx.fillText(dataSet.flag[i-1],beginX+x2Adjust,beginY+i*barPos+y2Adjust);//下标字符 ctx.fillText(dataSet.data[i-1],beginX+dataSet.data[i-1]*pxPerData+x3Adjust,beginY+i*barPos-barWidth/2+y3Adjust);//柱代表的数量 ctx.fillStyle=dataSet.color[i-1]; ctx.fillRect(beginX,beginY+i*barPos-barWidth/2,dataSet.data[i-1]*pxPerData,barWidth); } ctx.stroke(); } </script></head><body><canvas id="myCanvas" width="400" height="400"></canvas><canvas id="myCanvas2" width="400" height="400"></canvas><canvas id="myCanvas3" width="400" height="400"></canvas><canvas id="myCanvas4" width="400" height="400"></canvas><script type="text/javascript"> var ctx=document.getElementById('myCanvas').getContext('2d'); singleColorBarGraph(30,20,350,350,dataSet,ctx,-20,5,-10,11,9,-5); var ctx2=document.getElementById('myCanvas2').getContext('2d'); mulColorBarGraph(30,20,350,350,dataSet2,ctx2,-20,5,-10,11,9,-5); var ctx3=document.getElementById('myCanvas3').getContext('2d'); singleColorBarGraphHorizontal(30,20,350,350,dataSet,ctx3,0,15,-27,3,5,22); var ctx4=document.getElementById('myCanvas4').getContext('2d'); mulColorBarGraphHorizontal(30,20,350,350,dataSet2,ctx4,0,15,-27,3,5,22);</script></body></html>
演示效果:
0 0
- 基于html5的canvas用javascript写柱状图
- 自己写的HTML5 Canvas + Javascript五子棋
- 用canvas画的柱状图
- HTML5 canvas写的七巧板
- 基于HTML5 Canvas的引擎
- 基于HTML5的canvas的温度计 插件
- 让人难以置信的基于 HTML5 Canvas 和 JavaScript 的实验项目
- HTML5 Canvas 基于OO的动画实例
- 基于html5 canvas的进度显示图表
- 基于HTML5 Canvas的按键编码检测器
- 基于HTML5 canvas的jQuery刮刮卡效果
- 基于Html5 Canvas的帧动画生成器
- 基于javascript和canvas(画布)的开源HTML5应用开发框架 - iio Engine
- 基于canvas写一个字的效果
- 基于HTML5 Canvas的刮奖(刮刮卡)小控件(Scratch card based on HTML5 Canvas)
- 用canvas画柱状图和HonrizantolScrollView的结合
- html5的canvas写一个简单的画板程序
- 用JFreeChart实现基于Web的柱状图
- objective-C程序设计学习笔记3--分类和协议
- 如何查看自己的电脑端口被什么程序占用了
- icons 图标
- vijos p1002 过河(离散化dp)
- Android实战技术:Splash的实现
- 基于html5的canvas用javascript写柱状图
- 简单工厂模式——把生产方法封装起来
- 生命周期 Service
- android studio基本界面设置
- 工厂方法模式——办分厂
- 新开一个博客
- 镜像
- C语言概述
- JVM致命错误日志(hs_err_pid.log)解读