canvas实现折线图

这篇博客介绍了如何使用HTML5的canvas元素来实现折线图的绘制。主要分为两种情况,一是处理少于7个点的数据,二是处理大于等于7个点的数据。关键在于数据处理、极点确定、点的位置计算以及画布初始化、描线、标注和标点等步骤。博客提供了完整的代码实现。
摘要由CSDN通过智能技术生成

效果图如下:
这里写图片描述这里写图片描述

一.思路

折线的实现可以分为两种情况:
1.少于七个点
对于少于7个点的情况,主要是描点,画线,标注三部分
2.大于等于七个点
对于大于等于七个点的情况,主要是画线,标注极点

二.实现要点

最重要的是每个点位置的确定

<1>对数据进行处理
首先对数据进行处理
A.将空数组填充一定的内容

var noData= chartEntity.originArr.length==0?true:false;
//小于7的时候是7天数据,补全后面数据
var originArr2=[];
if(noData){
    originArr2=[50,50,50,50,50,50,50];
}else{
    originArr2=chartEntity.originArr.concat();
}

B.将少于7个点的数据补充为7个点,补充值为原数组最后一个数据

//补充数据
while(originArr2.length < 7){
    originArr2.push(chartEntity.originArr[chartEntity.originArr.length-1]);
}

<2>极点的确定
因为是以最低点,最高点定边界,所以首先要先确定极点的值以及极点之间的差值

var canScale=window.devicePixelRatio;
//获得数组最大值
var maxWeight= chartEntity.originArr.length == 0 ? originArr2[0]:Math.max.apply(null, chartEntity.originArr);
//获得数组最大值的下标
var maxWeightIndex=chartEntity.originArr.lastIndexOf(maxWeight);
//获得数组最小值
var minWeight= chartEntity.originArr.length == 0 ? originArr2[0]:Math.min.apply(null, chartEntity.originArr);
//获得数组最小值的下标
var minWeightIndex=chartEntity.originArr.lastIndexOf(minWeight);
//获得最大值最小值差值
var weightDef= maxWeight-minWeight;

<3>各个点位置的确定

//最大值最小值一样
if(weightDef == 0){
    weightDef = 1;
    dateIsSame=true;
}

//初始坐标数据处理
for(var i=0;i<originArr2.length;i++){
    hPercentArr[i] = (maxWeight-originArr2[i])/weightDef*chartEntity.waveHeight*canScale+minHeight;
    wPercentArr[i] = dateArr[i]*($("#"+chartEntity.chartID).width()-15)*canScale+15;
    console.info(hPercentArr[i]+"||"+wPercentArr[i]);
}
var diffWidth=(wPercentArr[1]-wPercentArr[0])/canScale;

<4>初始化画布

//画布初始化
var canvas=document.getElementById(chartEntity.chartID);
var context=canvas.getContext("2d");
canvas.width=$("#"+chartEntity.chartID).width()*canScale;
canvas.height=$("#"+chartEntity.chartID).height()*canScale;

<5>描线,标注

//画线
for(var i=0;i<originArr2.length;i++){
   
    if(dateIsSame){
        $("#"+chartEntity.chartID).css("marginTop","1.75rem");
    }
    context.lineTo(wPercentArr[i],hPercentArr[i]);
    if(i < chartEntity.originArr.length){
        if(dateIsSame){
            $("#"+chartEntity.chartNumID).append("<div class='weightNum-item' style='position:absolute;top:"+(hPercentArr[i]/canScale-fontSize+0.75*fontSize)+"px;left:"+(wPercentArr[i]/canScale-13)+"px;'>"+chartEntity.originArr[i]+"</div>");
        }else{
            $("#"+chartEntity.chartNumID).append("<div class='weightNum-item' style='position:absolute;top:"+(hPercentArr[i]/canScale-1.5*fontSize+0.75*fontSize)+"px;left:"+(wPercentArr[i]/canScale-16)+"px;'>"+chartEntity.originArr[i]+"</div>");
        }
    }
}
if(chartEntity
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值