原生js实现折线图(canvas)

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>折线图</title>
    <style>
        #canvas{
            border:1px solid #ccc;
        }
    </style>
</head>
<body>
        <canvas id="canvas"></canvas>
</body>
<script>
        // 画布大小
        var canvasWidth='800';
        var canvasHeight='500';
        // 三个点坐标
        var x0=50,y0=50;
        var x1=50,y1=450;
        var x2=700,y2=450;
        // 纵轴文字最大值,递增值
        var verticalMaxNum=60
        var verticalStep=10
        // 横轴
        var week=[5,20,49,32,13,12,29]
        var weekMonth=['周一','周二','周三','周四','周五','周六','周日']
        // 柱状图宽度,柱状图间隔
        var histogramWidth=60
        var histogramInterval=90
        // 柱状图左边距离
        var histogramLeft=20


        draw()
        
        function draw() {
            var canvas = document.getElementById('canvas'),
            context= canvas.getContext('2d')
            canvas.width=canvasWidth;
            canvas.height=canvasHeight;
            context.beginPath();
            context.moveTo(x1,y1);
            context.lineTo(x0,y0-10);
            context.moveTo(x1,y1);
            context.lineTo(x2,y2);
            context.stroke();

            // 纵坐标
            var verticalStepNum=Math.floor(verticalMaxNum/verticalStep) 
            console.log(verticalStepNum);
            var realStep=(y1-y0)/verticalStepNum
            var vNum=0
            context.beginPath();
            for(let i=y1;i>=y0-10;i-=realStep) {
                // 纵坐标字
                context.font = '20px Palatino'
                context.textAlign='right'
                context.textBaseline='middle'
                context.fillText(vNum,x0-10,i)
                vNum+=verticalStep
                // 虚线
                if(i>=0) {
                    context.strokeStyle='#999'
                    context.setLineDash([2,2]);
                    context.moveTo(x0,i);
                    context.lineTo(x2,i);
                    context.stroke();
                }
            }

            // 横坐标
            var xheng=histogramLeft+x1
            var weekReal=[]
            for(let i=0;i<week.length;i++) {
                weekReal.push(week[i]/verticalMaxNum*(y1-y0))
            }
            var index=0
            context.beginPath();
            context.lineWidth = 2;  // 设置线宽为 2 像素  
            context.lineCap = 'round';  // 设置线端为圆角  
            context.strokeStyle = 'black';  // 设置颜色为黑色 
            var prePointX=0
            var prePointY=0
            for(let i=0;i<week.length;i++) {
                // 每个循环随机一个颜色 
                var r=Math.floor(Math.random()*255)
                var g=Math.floor(Math.random()*255)
                var b=Math.floor(Math.random()*255)
                context.fillStyle=`rgba(${r},${g},${b},1)`

                // 横坐标文字
                context.font = '20px Palatino'
                context.textAlign='center'
                context.textBaseline='bottom'
                context.fillText(week[index],xheng+histogramWidth/2,y1-weekReal[i])

                // 横坐标数值
                context.textAlign='center'
                context.textBaseline='hanging'
                context.fillText(weekMonth[index],xheng+histogramWidth/2,y1)

                // 在拐点位置绘制圆
                context.beginPath();
                context.arc(xheng+histogramWidth/2,y1-weekReal[i], 5, 0, Math.PI * 2);
                context.fill();

                // 绘制线段
                if(i==0) {
                    prePointX=xheng+histogramWidth/2
                    prePointY=y1-weekReal[i]
                }else {
                    context.beginPath();
                    context.moveTo(prePointX,prePointY);
                    context.lineTo(xheng+histogramWidth/2,y1-weekReal[i])
                    context.stroke();
                    prePointX=xheng+histogramWidth/2
                    prePointY=y1-weekReal[i]
                }
                xheng+=histogramInterval
                index++
            }
            context.stroke();
        }


</script>
</html>

有问题,请指出,谢谢 !

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
要在 Canvas 中绘制折线图,可以按照以下步骤进行: 1. 准备数据:折线图需要一组数据来表示不同时间或条件下的数值。你可以自己编写一些数据,或者使用现成的数据。 2. 设置 Canvas:在 HTML 中创建一个 Canvas 元素,并设置其宽度和高度。你也可以设置其样式和其他属性。 3. 绘制坐标轴:折线图通常包括 x 轴和 y 轴,需要在 Canvas 中绘制这些坐标轴。可以使用 Canvas 的线条绘制方法绘制直线。 4. 绘制数据点:将数据点绘制在 Canvas 上。可以使用 Canvas 的圆形绘制方法绘制数据点。 5. 绘制折线:将数据点之间的连线绘制在 Canvas 上,形成一条折线。可以使用 Canvas 的线条绘制方法绘制折线。 以下是一个简单的绘制折线图的示例代码: ```html <canvas id="myCanvas" width="500" height="300"></canvas> <script> var canvas = document.getElementById("myCanvas"); var ctx = canvas.getContext("2d"); // 准备数据 var data = [5, 10, 8, 15, 20, 12]; // 绘制 x 轴和 y 轴 ctx.beginPath(); ctx.moveTo(50, 250); ctx.lineTo(450, 250); ctx.moveTo(50, 250); ctx.lineTo(50, 50); ctx.stroke(); // 绘制数据点 for (var i = 0; i < data.length; i++) { ctx.beginPath(); ctx.arc(50 + i * 70, 250 - data[i] * 10, 5, 0, Math.PI * 2); ctx.fill(); } // 绘制折线 ctx.beginPath(); ctx.moveTo(50, 250 - data[0] * 10); for (var i = 1; i < data.length; i++) { ctx.lineTo(50 + i * 70, 250 - data[i] * 10); } ctx.stroke(); </script> ``` 在这个示例中,我们准备了一组数据,绘制了 x 轴和 y 轴,绘制了数据点,最后绘制了折线。你可以根据需要修改数据和绘图参数来绘制自己的折线图

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值