利用canvas绘制折线图的一种方法

论坛 期权论坛 脚本     
匿名技术用户   2020-12-22 11:36   26   0

利用canvas绘制折线图

效果:


思路:

1)给出来的数值和横坐标数据整体是没有规律的,分别将它们保存在数组numsdatas中。并

2)只有两个坐标线,定义一个函数drawBorder绘制这两条线;

3)考虑到折线是四段,这里定义一个函数drawLine绘制折线,用一个for循环循环4次,每次循环从(numsX,numsY)绘制到(numsNX,numsNY

4)再定义一个函数drawBlock来绘制横坐标数值,折线上的菱形和数值,以及横坐标。

注意:

1)考虑到横坐标数值跟画布的实际像素值不能对应,因此要将实际数值等比例转化为像素值再应用;

2)在绘制横坐标时,横坐标点数比纵坐标少一个,需要进行一次判断;

3)这里绘制菱形和其他绘制放在同一个函数里,所以不能用平移坐标和旋转矩形的方法。

代码如下:

<canvas id="can1" width="800" height="600"></canvas>
 <script type="text/javascript">
   var can1 = document.getElementById("can1");
   var ctx = can1.getContext("2d");
   nums = [268,1236,1273,1545,1988];
   datas = ["11.1-11.2","11.3-11.9","11.10-11.16","11.17-11.23","11.24-11.30"];
   //画出坐标线
   function drawBorder(){
    ctx.beginPath();
    ctx.moveTo(100,50);
    ctx.lineTo(100,550);
    ctx.moveTo(100,550);
    ctx.lineTo(600,550);
    ctx.closePath();
    ctx.stroke();
   }
   //画出折线
   function drawLine(){
    for (i = 0;i < nums.length-1;i ++){
     //起始坐标
     var numsY = 550-nums[i]/500*100;
     var numsX = i*100+150;
     //终止坐标
     var numsNY = 550-nums[i+1]/500*100;
     var numsNX = (i+1)*100+150;
     ctx.beginPath();
     ctx.moveTo(numsX,numsY);
     ctx.lineTo(numsNX,numsNY);
     ctx.lineWidth = 6;
     ctx.strokeStyle = "#80aa33";
     ctx.closePath();
     ctx.stroke();
    }
   }
   //绘制折线点的菱形和数值,横坐标值,纵坐标值
   function drawBlock(){
    for (i = 0;i <= nums.length;i ++){
     var numsY = 550-nums[i]/500*100;
     var numsX = i*100+150;
     ctx.beginPath();
     // 画出折线上的方块
     ctx.moveTo(numsX-4,numsY);
     ctx.lineTo(numsX,numsY-4);
     ctx.lineTo(numsX+4,numsY);
     ctx.lineTo(numsX,numsY+4);
     ctx.fill();
     ctx.font = "15px scans-serif";
     ctx.fillStyle = "black";
     //折线上的点值
     var text = ctx.measureText(nums[i]);
     ctx.fillText(nums[i],numsX-text.width,numsY-10);
     //绘制纵坐标
     var colText = ctx.measureText((nums.length-i)*500);
     ctx.fillText((nums.length-i)*500,90-colText.width,i*100+55);
     //绘制横坐标并判断
     if (i < 5){
      var rowText = ctx.measureText(datas[i]);
      ctx.fillText(datas[i],numsX-rowText.width/2,570);
     }else if(i == 5) {
      return;
     }
     ctx.closePath();
     ctx.stroke();
    }
   }
   drawBorder();
   drawLine();
   drawBlock();
 </script>


分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:7942463
帖子:1588486
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP