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

news2024/11/28 12:37:55

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 = {
  // 绘制chart
  drawChart: 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轴刻度 array
    var 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.coloradmin.cn/o/1172490.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

一个球从100m高度自由落下,每次落地后反弹回原高度的一半,再落下,再反弹。求它在第10次落地时共经过多少米,第10次反弹多高

一.思路分析 这是一个简单的物理题目&#xff0c;解题思路比较明确。程序使用 for 循环来模拟球的下落和反弹过程&#xff0c;通过多次计算得到最终结果&#xff0c;最后使用 printf 函数将结果输出。 定义初始高度 height 和总共经过的米数 distance 的变量&#xff0c;初始化…

【密评】商用密码应用安全性评估从业人员考核题库(十九)

商用密码应用安全性评估从业人员考核题库&#xff08;十九&#xff09; 国密局给的参考题库5000道只是基础题&#xff0c;后续更新完5000还会继续更其他高质量题库&#xff0c;持续学习&#xff0c;共同进步。 4501 判断题 依据《信息系统密码应用高风险判定指引》&#xff0c…

服务器感染了.locked勒索病毒,如何确保数据文件完整恢复?

引言&#xff1a; 网络安全威胁的不断演变使得恶意软件如.locked勒索病毒成为当今数字时代的一大挑战。.locked勒索病毒能够加密您的文件&#xff0c;然后要求支付赎金以解锁它们。本文将深入探讨.locked勒索病毒的特点&#xff0c;以及如何应对感染&#xff0c;以及预防这种类…

数据可视化:动态柱状图

终于来到最后一个数据可视化的文章拿啦~~~ 在这里学习如何绘制动态柱状图 我先整个活 (๑′ᴗ‵๑)&#xff29; Lᵒᵛᵉᵧₒᵤ❤ 什么是pyecharts&#xff1f; 答&#xff1a; Python的Pyecharts软件包。它是一个用于Python数据可视化和图表绘制的库&#xff0c;可用于制作…

安装 2023最新版本的Tableau Desktop 时出现“0x80070643”错误

安装失败的原因&#xff1a; “0x80070643”错误是Microsoft错误。 必需的安装组件无法启动&#xff0c;通常是C库&#xff0c;或者使用了无效的操作系统版本。 通过控制面板——程序与功能可以查看到自己电脑Microsoft Visual C的版本&#xff0c;像我的话是比较低的&…

第四章IDEA操作Maven

文章目录 创建父工程开启自动导入配置Maven信息创建Java模块工程创建 Web 模块工程 在IDEA中执行Maven命令直接执行手动输入 在IDEA中查看某个模块的依赖信息工程导入来自版本控制系统来自工程目录 模块导入情景重现导入 Java 类型模块 导入 Web 类型模块 创建父工程 开启自动导…

【GitHub】Watch、Star、Fork、Follow 有什么区别?

目录 一、前言二、区别1. Watch2. Star3. Fork4. Follow 一、前言 GitHub 是最受欢迎的代码托管平台之一&#xff0c;拥有大量的开源代码可供学习。 Github 中也有类似 “点赞”、“收藏”、“加关注” 的功能。 下面介绍下&#xff0c;GitHub 中 Watch、Star、Fork、Follow 有…

uni-app华为审核被拒,驳回原因:您的应用在运行时,未见向用户告知权限申请的目的

华为审核被拒&#xff1a; 您的应用在运行时&#xff0c;未见向用户告知权限申请的目的&#xff0c;向用户索取(相机存)等权限&#xff0c;不符合华为应用市场审核标准。 <uni-popup ref"perpopup" type"center" :mask-clickfalse><view class&qu…

幂等性(防重复提交)

文章目录 1. 实现原理2.使用示例3. Idempotent注解4. debug过程 主要用途&#xff1a;防止用户快速双击某个按钮&#xff0c;而前端没有禁用&#xff0c;导致发送两次重复请求。 1. 实现原理 幂等性要求参数相同的方法在一定时间内&#xff0c;只能执行一次。本质上是基于red…

Leetcode-509 斐波那契数列

使用循环 class Solution {public int fib(int n) {if(n 0){return 0;}if(n 1){return 1;}int res 0;int pre1 1;int pre2 0;for(int i 2; i < n; i){res pre1 pre2;pre2 pre1;pre1 res;}return res;} }使用HashMap class Solution {private Map<Integer,Int…

E-Office(泛微OA)前台任意文件读取漏洞复现

简介 泛微E-Office是一款企业级的全流程办公自动化软件&#xff0c;它包括协同办公、文档管理、知识管理、工作流管理等多个模块&#xff0c;涵盖了企业日常工作中的各个环节。在该产品前台登录页存在文件读取漏洞。 officeserver.php文件存在任意文件读取漏洞&#xff0c;通…

[100天算法】-有序矩阵中第K小的元素(day 58)

题目描述 给定一个 n x n 矩阵&#xff0c;其中每行和每列元素均按升序排序&#xff0c;找到矩阵中第 k 小的元素。 请注意&#xff0c;它是排序后的第 k 小元素&#xff0c;而不是第 k 个不同的元素。示例&#xff1a;matrix [[ 1, 5, 9],[10, 11, 13],[12, 13, 15] ], k …

如何实现多租户系统

shigen日更文章的博客写手&#xff0c;擅长Java、python、vue、shell等编程语言和各种应用程序、脚本的开发。记录成长&#xff0c;分享认知&#xff0c;留住感动。 不知道为什么&#xff0c;最近老是有一些失眠&#xff0c;凌晨睡&#xff0c;两点半还在醒着。脑子里想着自己生…

手动关闭PS中的TopazStudio2的登录窗口

2021 adobe photoshop Topaz Studio 2 不是使用防火墙出站规则&#xff0c;是手动关闭的解决方案 点击社区-切换用户&#xff0c;登录窗口会出现X&#xff0c;可以手动关闭

VBA根据Excel内容快速创建PPT

示例需求&#xff1a;根据Excel中选中的单元格内容&#xff08;3列&#xff09;如下图所示&#xff0c;在已打卡的PowerPoint文件中创建页面。 新增PPT Slide页面使用第二个模板页面&#xff0c;其中包含两个文本占位符&#xff0c;和一个图片占位符。将Excel选中区域中前两列写…

Nginx 配置详细讲解

Nginx.conf 配置文件分为三部分&#xff0c;分别为main块、events块、http块&#xff08;http块又包含server块和location块&#xff09;&#xff0c;如下图。 第一部分&#xff1a;main块(全局块) main块主要是设置一些影响Nginx服务器整体运行的配置指令&#xff0c;主要包括…

2.8 CSS 伸缩盒模型

1.模型简介 传统布局是指:基于传统盒状模型&#xff0c;主要靠: display 属性 position 属性float 属性。2009年&#xff0c;w3C提出了一种新的盒子模型——Flexible Box(伸缩盒模型&#xff0c;又称:弹性盒子)。它可以轻松的控制:元素分布方式、元素对齐方式、元素视觉顺序..…

0008Java安卓程序设计-ssm基于Android平台的健康管理系统

文章目录 **摘要**目录系统实现开发环境 编程技术交流、源码分享、模板分享、网课教程 &#x1f427;裙&#xff1a;776871563 摘要 首先,论文一开始便是清楚的论述了系统的研究内容。其次,剖析系统需求分析,弄明白“做什么”,分析包括业务分析和业务流程的分析以及用例分析,…

那些看起来高大上的封装函数

什么 ToGray 只支持3通道图像&#xff0c; 让我看看怎么个事 就这么生硬的加了个判断 好家伙 调用了下opencv &#xff0c;通道数都不判断一下

Java多线程面试题:如何在多个子线程中捕获异常并引发主线程异常?

亲爱的小伙伴们&#xff0c;大家好&#xff01;我是你们的小米&#xff0c;今天我要和大家分享一个热门的技术话题——"面试题&#xff1a;多个子线程中&#xff0c;其中一个子线程异常时主线程如何抛出异常并返回&#xff1f;"。这是在面试中经常被问到的问题&#…