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.rhkb.cn/news/181116.html

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

相关文章

前端框架Vue学习 ——(三)Vue生命周期

生命周期&#xff1a;指一个对象从创建到销毁的整个过程。 生命周期的八个阶段&#xff1a;每触发一个生命周期事件&#xff0c;会自动执行一个生命周期方法&#xff08;钩子&#xff09; mounted&#xff1a;挂载完成&#xff0c;Vue 初始化成功&#xff0c;HTML 页面渲染成功…

leetcode-887-鸡蛋掉落(包含最大值最小化,最小值最大化的二分优化+滚动数组的原理)

这里写目录标题 题意解题KNN复杂度DP解法思想&#xff08;超时&#xff09;上述方法的优化 &#xff08;最大值最小化二分优化&#xff09;完整代码 逆向思维的DP&#xff08;ksqrt(n)复杂度&#xff09;代码空间优化&#xff08;滚动数组&#xff09;代码 题意 链接&#xff…

qt6:无法使用setFontColor

问题描述 跟着C开发指南视频学习&#xff0c;但是发现无论是直接使用ui设计&#xff0c;还是纯代码都无法实现变更字体颜色的功能。图中显示&#xff0c;点击颜色控件后&#xff0c;文本框的文字加粗、下划线、斜体等才能设置&#xff0c;但是无法变更颜色。 此文提醒qt sty…

vi vim 末尾编辑按GA 在最后一行下方新增一行编辑按Go

vim 快速跳到文件末尾 在最后一行下方新增一行 移到末尾,并且进入文本录入模式 GA (大写G大写A) 在一般模式(刚进入的模式,esc模式) GA 或 Shift ga 先 G 或 shiftg 到最后一行 然后 A 或 shifta 到本行末尾 并且进入文本录入模式 在最后一行下方新增一行 (光标换行,文字不…

蓝桥杯官网填空题(方格填数)

题目描述 本题为填空题&#xff0c;只需要算出结果后&#xff0c;在代码中使用输出语句将所填结果输出即可。 在 2 行 5 列的格子中填入 1 到 10 的数字。 要求&#xff1a; 相邻的格子中的数&#xff0c;右边的大于左边的&#xff0c;下边的大于上边的。 如下图所示的 …

“一键批量拆分HTML文本,高效整理文件,提升工作效率“

您是否曾经被大量的HTML文本文件困扰&#xff0c;难以找到所需的特定信息&#xff1f;现在&#xff0c;我们向您推荐一款强大的工具&#xff0c;它能够一键拆分HTML文本&#xff0c;让您轻松实现文件整理&#xff0c;提高工作效率&#xff01; 首先&#xff0c;在首助编辑高手…

CANoe新建XML自动化Test Modules

文章目录 1.打开Test Modules2.新建Environment3.新建XML Test Modules4.新建.can文件5.打开XML Test Modules6.新建xml脚本并保存7.编译8.在.can文件写个测试用例9.修改报告格式为HTML10.运行查看报告后面介绍的文章会重复用到这部分,这里单独介绍下,后面不做重复介绍。 1.…

python-在系统托盘显示CPU使用率和内存使用率

一、添加轮子 1.添加托盘区图标库 infi.systray from infi.systray import SysTrayIcon 2.添加图像处理库 Pillow from PIL import Image, ImageDraw, ImageFont 3.添加 psutil 来获取CPU、内存信息 import psutil 二、完整代码 from infi.systray import SysTrayIcon …

使用vue3+vite+elctron构建小项目介绍Electron进程间通信

进程间通信 (IPC) 是在 Electron 中构建功能丰富的桌面应用程序的关键部分之一。 由于主进程和渲染器进程在 Electron 的进程模型具有不同的职责&#xff0c;因此 IPC 是执行许多常见任务的唯一方法&#xff0c;例如从 UI 调用原生 API 或从原生菜单触发 Web 内容的更改。 在 …

如何写复盘报告

复盘报告在it公司中是为了在出现事情后&#xff0c;我们更好的回顾事情的前因后果&#xff0c;定位问题&#xff0c;指定解决措施&#xff0c;并且宣导&#xff0c;让这类事情减少发生的概率。那复盘报告一般怎样写合适呢&#xff1f;下来我们就看看&#xff0c; 一、一般会先…

标签识别中的数据泄露:关键分析

一、介绍 在数据驱动的决策时代&#xff0c;收集、处理和分析数据的过程在从医疗保健到金融&#xff0c;从营销到研究的各个领域都发挥着举足轻重的作用。数据分析的基本步骤之一是正确识别数据集中的标签或类别。然而&#xff0c;这项看似简单的任务可能充满挑战&#xff0c;尤…

zip文件解压缩命令全

zip文件解压缩命令全 入门Zip 用法选项示例语法形式和选项基本语法压缩目录将文件添加到现有压缩文件解压缩文件将 zip 文件解压缩到指定目录列出 zip 文件中的内容将 zip 文件加密将 zip 文件解密将 zip 文件中的文件转成 UTF-8 编码Zip 压缩示例创建新的 zip 压缩文件将文件添…

web前端——HTML+CSS实现奥运五环

web前端——HTMLCSS实现奥运五环 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</titl…

Mac安装DBeaver

目录 一、DBeaver Mac版软件简介 二、下载地址 三、DBeaver连接失败报错 3.1 问题描述 3.2 连接失败问题解决 一、DBeaver Mac版软件简介 DBeaver Mac版是一款专门为开发人员和数据库管理员设计的免费开源通用数据库工具。软件的易用性是它的宗旨&#xff0c;是经过精心设计…

2023 年最值得推荐的 10 款 iPhone 数据恢复软件

iPhone 从来都不是一个简单的打电话电话。它就像一台微型电脑&#xff0c;让我们互相联系、拍照、拍视频、发邮件、看文档、看书。然而&#xff0c;随着它成为日常生活的必需品&#xff0c;我们总是容易因各种原因丢失数据&#xff0c;如删除、恢复出厂设置、iOS 错误、文件同步…

单片机温湿度-光照-DHT11-烟雾气体检测控制系统-proteus仿真-源程序

一、系统方案 本设计采用52单片机作为主控器&#xff0c;液晶1602显示&#xff0c;DHT11温湿度&#xff0c;光照、烟雾气体检测&#xff0c;按键设置报警阀值&#xff0c;蜂鸣器报警。 二、硬件设计 原理图如下&#xff1a; 三、单片机软件设计 1、首先是系统初始化 // // …

C/C++输出字符菱形 2021年3月电子学会青少年软件编程(C/C++)等级考试一级真题答案解析

目录 C/C输出字符菱形 一、题目要求 1、编程实现 2、输入输出 二、算法分析 三、程序编写 四、程序说明 五、运行结果 六、考点分析 C/C输出字符菱形 2021年3月 C/C编程等级考试一级编程题 一、题目要求 1、编程实现 给定一个字符&#xff0c;用它构造一个对角线长…

循环语句--JAVA

循环语句 for循环结构 范例 执行流程 while循环结构 格式 范例 流程 for和while的区别 条件控制语句所控制的自增变量,在for循环结束后,就不可以继续使用了 条件控制语句所控制的自增变量,在while循环结束后,还可以继续使用了 数据类型 基本数据类型 char byte boolean …

register_parameter和register_buffer 详解

在参考yolo系列代码或其他开源代码&#xff0c;经常看到register_buffer和 register_parameter的使用&#xff0c;接下来将详细对他们进行介绍。 1. 前沿 在搭建网络时&#xff0c;我们 自定义的参数&#xff0c;往往不会保存到模型权重文件中&#xff0c;或者成为模型可学习…

操作系统复习(2)进程管理

一、概述 1.1程序的顺序执行 一个具有独立功能的程序独占CPU运行&#xff0c;直至得到最终结果的过程称为程序的顺序执行。 程序的并发执行所表现出的特性说明两个问题 ⑴ 程序和计算机执行程序的活动不再一一对应 ⑵ 并发程序间存在相互制约关系&#xff08;要求共享信息&…