Canvas 实现进度条展示统计数据示例

canvas可以画柱状图,如下就是一个例子,主要用到了lineWidth,beginPath,lineCap等知识点。

效果图

在这里插入图片描述

源代码

<!DOCTYPE Html>
<html>
<head><title>Line Chart Demo</title><meta http-equiv="Content-Type" content="text/html;charset=UTF-8"/>
</head>
<body><header>预约挂号人数(<span id="hosUnitDiv"></span></header><canvas id="canvas2">您的浏览器不支持canvas,请换高版本的浏览器!</canvas><script type="text/javascript" >/*进度条图*/
var progressChart = {// 绘制chartdrawChart: function(canvas2, data, padding, marginRight, ygap, bgLineColor, scaleColor) {this.canID2 = document.getElementById("canvas2");this.content2 = this.canID2.getContext("2d");// this.canID2.width = 400;var canRealWidth = this.canID2.width - marginRight; // 图像真实的宽度 (距离右边canvas有一定的距离var dataMax = this.getArrayMax(data);  // 数据中最大的值var unit = this.getUnitByDataMax(dataMax); // 单位var xlimt = this.getXLimtByNewData(dataMax / (unit.number)); // x轴刻度 arrayvar xgap = (canRealWidth - padding) / (xlimt.length - 1); // x轴刻度间距var newData = this.getNewDataByUnit(data, unit.number);var ymove = 5; // 整图y轴,向下移动 解决0的时候,显示不全问题this.canID2.height = ygap * (data.length) + ymove * 4;// 绘制x轴刻度for(var i=0; i<xlimt.length; i++) {// console.log(i*xgap + padding);this.content2.fillStyle = scaleColor;// this.content2.textAlign = "left";// if语句解决最后一个刻度,靠图像右端对齐问题if(i === xlimt.length -1) {this.content2.fillText(xlimt[i],i*xgap + padding - 16, ygap*data.length + ygap);} else {this.content2.fillText(xlimt[i],i*xgap + padding, ygap*data.length + ygap);}}for(var i=0; i<data.length; i++) {// 画横线this.content2.lineWidth=8;this.content2.strokeStyle=bgLineColor;// 笔触颜色this.content2.beginPath();this.content2.moveTo(padding, ygap*i + ymove);this.content2.lineTo(canRealWidth, ygap*i + ymove);this.content2.lineCap = 'round';this.content2.stroke();this.content2.closePath();// y轴刻度this.content2.fillStyle = scaleColor;this.content2.textAlign = "left";//y轴文字靠右写// this.content2.textBaseline = "middle";//文字的中心线的调整this.content2.font = '12px PingFang HK';  this.content2.fillText(data[i].y, 0, ygap*i + 10);// 画真实数据线/* 画有渐变色线 */this.content2.beginPath();var linear_gradient = this.content2.createLinearGradient(0,0, canRealWidth,50);linear_gradient.addColorStop(0, '#5c80cd');linear_gradient.addColorStop(1, '#ac92d3');this.content2.strokeStyle = linear_gradient;this.content2.lineJoin = 'round';this.content2.lineWidth = 8;this.content2.strokeRect(padding, ygap*i + ymove, newData[i].x * (canRealWidth - padding) / xlimt[xlimt.length - 1], 0);}return unit;},// 根据x轴最大的数据 判断单位 params: 原始数据中最大的值getUnitByDataMax: function(maxData) {if(maxData > 1000 && maxData <= 10000) {return unit = {text: '百人', number: 100};} else if(maxData > 10000) {return unit = {text: '千人', number: 1000};}},// 获取x轴刻度 params:原始数据通过单位处理后的数据 的最大值getXLimtByNewData: function(handleByUnitNewdataMax) {if (handleByUnitNewdataMax > 0 && handleByUnitNewdataMax <= 50) {return xlimt = [0, 10, 20, 30, 40, 50];} else {return xlimt = [0, 20, 40, 60 ,80, 100];}},// 根据单位处理原始数据,获取到新的数据getNewDataByUnit: function(data, unit) {var canvas2NewData = [];// var canvas2NewData = canvas2Data.map(function(item) {//   item.x = item.x /unit;// }); ??? 为什么map不可以for (var i = 0; i < canvas2Data.length; i++) {canvas2NewData[i] = {y: canvas2Data[i].y, x:canvas2Data[i].x / unit};};return canvas2NewData;},// 获取x轴 最大值 getArrayMax: function(array) {return array.reduce(function(prev, next) {if (prev.x > next.x) { return prev.x;} else {return next.x};});}
}</script><script>/*进度条图*/var canvas2Data = [{x:520, y:'1月'},{x:1000, y:'2月'},{x:600, y:'3月'},{x:2100, y:'4月'},{x:3400, y:'5月'},{x:3600, y:'6月'},{x:4000, y:'7月'},{x:6000, y:'8月'},{x:7000, y:'9月'},{x:9000, y:'10月'}];var hosUnit = progressChart.drawChart(canvas2, canvas2Data, 30, 10, 13, '#bcc0c7', '#fff');document.getElementById('hosUnitDiv').innerText = hosUnit.text;  </script>
</body>
</html>

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

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

相关文章

腾讯云服务器CVM详细介绍_优缺点亲自整理

腾讯云服务器CVM提供安全可靠的弹性计算服务&#xff0c;腾讯云明星级云服务器&#xff0c;弹性计算实时扩展或缩减计算资源&#xff0c;支持包年包月、按量计费和竞价实例计费模式&#xff0c;CVM提供多种CPU、内存、硬盘和带宽可以灵活调整的实例规格&#xff0c;提供9个9的数…

腾讯云CVM服务器操作系统镜像大全

腾讯云CVM服务器的公共镜像是由腾讯云官方提供的镜像&#xff0c;公共镜像包含基础操作系统和腾讯云提供的初始化组件&#xff0c;公共镜像分为Windows和Linux两大类操作系统&#xff0c;如TencentOS Server、Windows Server、OpenCloudOS、CentOS Stream、CentOS、Ubuntu、Deb…

【Java】类和对象

类和对象 类&#xff1a;类是描述一个对象的&#xff1b; 对象&#xff1a;对象是类产生的实体&#xff1b; 类 一般一个文件中只定义一个类&#xff1b; 类的组成&#xff1a; 成员变量&#xff08;也叫做属性、字段&#xff09;&#xff1a;定义在方法的外部&#xff0c;类…

【算法练习Day39】单词拆分多重背包的介绍

​&#x1f4dd;个人主页&#xff1a;Sherry的成长之路 &#x1f3e0;学习社区&#xff1a;Sherry的成长之路&#xff08;个人社区&#xff09; &#x1f4d6;专栏链接&#xff1a;练题 &#x1f3af;长路漫漫浩浩&#xff0c;万事皆有期待 文章目录 单词拆分多重背包总结&…

【iOS】知乎日报前三周总结

这几天一直在进行知乎日报的仿写&#xff0c;仿写过程中积累了许多实用的开发经验&#xff0c;并对MVC有了更深的了解&#xff0c;特撰此篇作以总结 目录 第一周将网络请求封装在一个单例类Manager中SDWebImage库的简单使用运用时间戳处理当前时间自定义NavigationBar 第二周在…

轻量封装WebGPU渲染系统示例<12>- 基础3D对象实体(源码)

当前示例源码github地址: https://github.com/vilyLei/voxwebgpu/blob/main/src/voxgpu/sample/PrimitiveEntityTest.ts 此示例渲染系统实现的特性: 1. 用户态与系统态隔离。 细节请见&#xff1a;引擎系统设计思路 - 用户态与系统态隔离-CSDN博客 2. 高频调用与低频调用隔…

基于STM32设计的室内环境监测系统(华为云IOT)_2023

一、设计需求 基于STM32+华为云物联网平台设计一个室内环境监测系统,以STM32系列单片机为主控器件,采集室内温湿度、空气质量、光照强度等环境参数,将采集的数据结果在本地通过LCD屏幕显示,同时上传到华为云平台并将上传的数据在Android移动端能够实时显示、查看。 【1…

小程序制作(超详解!!!)第十二节 循环求和计算器

1.index.wxml <view class"box"><view class"title">利用循环语句求和</view><view><input placeholder"请输入起点数值" type"number" bindblur"starNum"></input><!--一旦失去交…

个人服务器到期,项目下线,新的开始

告别旧服务器 2023.11.06服务器到期&#xff0c;所有项目正式下线 时间真的过的很快&#xff0c;从开始踏入编程的大门&#xff0c;到现在不知不觉已经陆续经手了两台服务器了&#xff0c;目前这台服务器是一年前的阿里云活动白嫖的嘿嘿嘿&#xff0c;该服务器上目前运行的项…

C++初阶-类和对象(中)2

类和对象&#xff08;中&#xff09;2 一、赋值运算符重载运算符重载赋值运算符重载前置和后置重载 二、日期类的实现三、const成员四、取地址及const取地址操作符重载 一、赋值运算符重载 运算符重载 C为了增强代码的可读性引入了运算符重载&#xff0c;运算符重载是具有特殊…

python 机器学习 常用函数

一 np.random.randint "randint" 是 "random integer" 的缩写&#xff0c;表示生成随机整数。 np.random.randint 是 NumPy 库中的一个函数&#xff0c;用于生成随机整数。以下是该函数的一般语法&#xff1a; np.random.randint(low, high, size)其中…

开发一款直播弹幕游戏需要多少钱?

开发一款直播弹幕游戏需要多少钱&#xff1f;有好多朋友在咨询过弹幕游戏的开发价格后&#xff0c;都会比较吃惊&#xff0c;一款体量这么小的游戏为什么动辄就要几万块甚至十几万&#xff1f; 我来给你们说分析一下原因&#xff0c;这种游戏如果脱离开直播间&#xff0c;可以…