用canvas做柱状图

news2024/10/7 12:20:40

在这里插入图片描述

<!DOCTYPE HTML>
<html>

<head lang="en">
    <meta charset="UTF-8">
    <title>Canvans绘制统计图</title>
    <style>
        body {
            text-align: center;
        }

        canvas {
            background: #ddd;
        }
    </style>
</head>

<body>
    <h1>Canvans绘制坐标系</h1>
    <canvas id="canvas" width="800" height="600">
        您的浏览器不支持Canvas标签!
    </canvas>
    <script>
        // var ctx = canvas.getContext('2d');
        //获取绘图工具
        var ctx = ctx || document.querySelector('canvas').getContext('2d');
        //获取画布大小
        var canvasWidth = ctx.canvas.width;
        var canvasHeight = ctx.canvas.height;
        console.log(canvasWidth, "canvasWidth")
        console.log(canvasHeight, "canvasHeight")
        const xAxis = ['黑布林大李子', '郭老师猕猴桃', '北京红富士', '吐鲁番葡萄', '新疆哈密瓜', '大鸭梨'];
        const yAxis = [600, 325, 185, 869, 566, 456];
        const cSpace = 10; // 间隔
        // 获取最大值;
        var arr = JSON.parse(JSON.stringify(yAxis)).sort((a, b) => {
            if (a - b > 0) {
                return 1;
            } else if (a - b < 0) {
                return -1;
            };
        })
        const maxValue = arr[arr.length - 1];

        const oneVal = Math.ceil(maxValue / 10);

        function Coordinate() {

            // 绘制x轴
            ctx.beginPath();
            ctx.moveTo(50, canvasHeight - 50);
            ctx.lineTo(canvasWidth - 50, canvasHeight - 50);
            ctx.lineTo(canvasWidth - 80, canvasHeight - 80);
            ctx.moveTo(canvasWidth - 80, canvasHeight - 20);
            ctx.lineTo(canvasWidth - 50, canvasHeight - 50);

            ctx.lineWidth = 1; // 线条宽度
            //ctx.lineJoin = 'miter';  //线的连接处出现尖角
            ctx.lineJoin = 'round';    //线的连接处出现圆角
            //ctx.lineJoin = 'bevel';  //线的连接处出现方角
            ctx.strokeStyle = '#000'; // 颜色
            ctx.stroke();

            //绘制Y轴
            ctx.beginPath();
            ctx.moveTo(50, canvasHeight - 50);
            ctx.lineTo(50, 50);
            ctx.lineTo(50 - 30, 80);
            ctx.moveTo(50, 50);
            ctx.lineTo(50 + 30, 80);

            ctx.strokeStyle = '#000'; // 颜色
            ctx.stroke();

            // 标y轴刻度尺
            setYAxis();
            // 标x轴刻度尺,并画柱状体
            setXAxis();
        }
        Coordinate();
        function getRad(degree) {
            return degree / 180 * Math.PI;
        }

        function setYAxis() {
            // 标y轴刻度尺
            var markerVal;
            var yMarker;
            for (var i = 0; i <= 10; i++) {
                markerVal = i*oneVal;
                ctx.restore();
                yMarker = Math.ceil((canvasHeight - 150) * (1 -(markerVal / maxValue))) + 100;
                ctx.fillText(markerVal, 30, yMarker, cSpace); // 文字

                // 画线
                if (i > 0) {
                    drawLine({axis: 'y', y:yMarker});
                }
            }
        }
        function setXAxis() {
            // 1.标x轴刻度尺
            var xyMark;
            var markerVal = (canvasWidth - 200) / xAxis.length;
            for (var i = 0; i <= xAxis.length - 1; i++) {
                xMarker = Math.ceil(i * markerVal) + markerVal;
                if (i === 0) {
                    xMarker = xMarker + 20;
                }
                ctx.font = "30px Arial";
                // ctx.restore(); // 返回上一次保存前
                ctx.textAlign="center";
                ctx.fillText(xAxis[i], xMarker, canvasHeight - 20, 40); // 文字
                
                // 画线
                drawLine({axis: 'x', x:xMarker});

                // 2.画柱状体
                xyMark = Math.ceil((canvasHeight - 150) * (yAxis[i] / maxValue)) + 50; // 高度
                ctx.fillText(yAxis[i], xMarker, canvasHeight - xyMark - 5); // 文字
                ctx.beginPath();
                ctx.rect( xMarker - 20, canvasHeight - 50, markerVal - 50, -xyMark + 50 );
                ctx.fillStyle = "green";
                ctx.fill();
                ctx.closePath();
            }
        }
        // 画线的方法
        function drawLine(obj) {
            ctx.beginPath();
            if (obj.axis === 'y') {
                ctx.moveTo(50, obj.y);
                ctx.lineTo(53, obj.y);
            } else {
                ctx.moveTo(obj.x, canvasHeight - 50);
                ctx.lineTo(obj.x, canvasHeight - 55);
            }
            ctx.stroke();
            ctx.closePath();
        }
    </script>
</body>

</html>

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

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

相关文章

为什么磁盘被写保护怎么解除?这篇文章告诉你

磁盘被写保护是指磁盘无法写入或修改数据&#xff0c;这可能会使您的计算机或存储设备无法正常工作。当发现磁盘被写保护时&#xff0c;我们应该怎么做呢&#xff1f;磁盘被写保护怎么解除&#xff1f;这篇文章将带大家了解一下磁盘被写保护的原因和对应的解除方法吧。 ▌为什…

mac使用VsCode远程连接服务器总是自动断开并要求输入密码的解决办法

在mac中使用vscode远程连接服务器&#xff0c;时常会出现自动断开并要求重新输入服务器密码的问题&#xff0c;接下来让我们来解决它&#xff1a; 1、首先&#xff0c;在本地创建公钥&#xff1a; ssh-keygen 这条命令执行之后&#xff0c;出现提示直接回车即可&#xff1b;直…

C语言练习题Day2

今天继续分享C语言刷题练习 一、选择题 1、以下程序段的输出结果是&#xff08; &#xff09; #include<stdio.h> int main() { char s[] "\\123456\123456\t"; printf("%d\n", strlen(s)); return 0; }A: 12 B: 13 C: 16 D: 以上都不对 这题考的…

monorepo更新组件报错,提示“无法加载文件 C:\Program Files\nodejs\pnpm.ps1,因为在此系统上禁止运行脚本”

解决方法&#xff1a; 第一步&#xff1a;管理员身份运行 window.powershell&#xff0c; win x打开powerShell命令框&#xff0c;进入到对应项目路径。 第二步&#xff1a;执行&#xff1a;get-ExecutionPolicy&#xff0c;显示Restricted&#xff0c;表示状态是禁止的; 第…

Win11 电脑的 Win + E 快捷键失效

报的错误信息如下&#xff1a; 该文件没有与之关联的应用来执行该操作。请安装应用&#xff0c;若已经安装应用&#xff0c;请在”默认应用设置"页面中创建关联。 报错原因&#xff1a;系统注册表被改写了导致的出错 解决办法&#xff1a; 1、首先&#xff0c;按键盘上的…

k3s在线快速安装部署

中文文档&#xff1a;快速入门指南 | K3s 一、k3s父节点安装 设置主机唯一名称 hostnamectl set-hostname 192.168.56.105 开放k3s所需端口 6443 51820 和 51821 在线安装主节点 curl -sfL https://rancher-mirror.rancher.cn/k3s/k3s-install.sh | INSTALL_K3S_MIRRORcn…

36. 国庆期间每个品类的商品的收藏量和购买量

文章目录 题目需求思路一实现一题目来源 题目需求 从订单明细表&#xff08;order_detail&#xff09;和收藏信息表&#xff08;favor_info&#xff09;统计2021国庆期间&#xff0c;每个商品总收藏量和购买量。 期望结果如下&#xff08;截取部分&#xff09;&#xff1a; …

WordPress导航主题源码

源码说明&#xff1a; V2.0406 添加搜索自动索引百度热搜关键词 添加首页tab标签模式加载方式切换(ajax加载和普通加载)(首页设置) 修复tab标签ajax加载模式会显示未审核的网址的bug 小屏幕热搜采用水平滚动 优化子主题支持 添加文章分页 添加解决WordPress 429的服务(…

基于HarmonyOS ArkUI实现七夕壁纸轮播

七夕情人节&#xff0c;为了Ta&#xff0c;你打算用什么方式表达爱&#xff1f;是包包、鲜花、美酒、巧克力&#xff0c;还是一封充满爱意的短信&#xff1f;作为程序员&#xff0c;以代码之名&#xff0c;表达爱。本节将演示如何在基于HarmonyOS ArkUI的SwiperController、Ima…

HCIP-HCS华为私有云的使用

1、概述 HCS&#xff08;HuaweiCoudStack&#xff09;华为私有云&#xff1a;6.3 之前叫FusionSphere OpenStack&#xff0c;6.3.1 版本开始叫FusionCloud&#xff0c;6.5.1 版本开始叫HuaweiCloud Stack (HCS)华为私有云软件。 开源openstack&#xff0c;发放云主机的流程&am…

优思学院|偏态分布的平均值和中位数为何会不相等?

在六西格玛课堂中&#xff0c;有同学提出了一个问题&#xff0c;就是偏态分布的平均值和中位数为何会不相等&#xff1f;要回答这类问题&#xff0c;我们必需要先明白平均值和中位数的定义和计算原理&#xff0c;再了解他们在分布中的特性&#xff0c;以形象化的方法来解释。今…

【Java 中级】一文精通 Spring MVC - 转换器(五)

&#x1f449;博主介绍&#xff1a; 博主从事应用安全和大数据领域&#xff0c;有8年研发经验&#xff0c;5年面试官经验&#xff0c;Java技术专家&#xff0c;WEB架构师&#xff0c;阿里云专家博主&#xff0c;华为云云享专家&#xff0c;51CTO 专家博主 ⛪️ 个人社区&#x…

day 27 json pyecharts模块

JSON是一种轻量型的数据交互格式&#xff0c;可以按照JSON指定的格式去组织封装数据。 JSON本质上是一个带有特定格式的字符串。 主要功能&#xff1a;json就是一种在各个编程语言流通的数据格式&#xff0c;负责不同编程语言中的数据传递和交互&#xff0c;类似于国际通用语…

【德哥说库系列】-Oracle 19C RAC 应用RU19补丁

&#x1f4e2;&#x1f4e2;&#x1f4e2;&#x1f4e3;&#x1f4e3;&#x1f4e3; 哈喽&#xff01;大家好&#xff0c;我是【IT邦德】&#xff0c;江湖人称jeames007&#xff0c;10余年DBA及大数据工作经验 一位上进心十足的【大数据领域博主】&#xff01;&#x1f61c;&am…

Linux目录结构与文件管理 (02)(四)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 目录 前言 一、查看文件内容 二、创建文件 三、删除文件 四、 移动文件 五、复制文件 六、编辑文件内容 总结 前言 今天是在昨天的基础上继续学习&#xff0c;主要…

1. 卷积原理

① 卷积核不停的在原图上进行滑动&#xff0c;对应元素相乘再相加。 ② 下图为每次滑动移动1格&#xff0c;然后再利用原图与卷积核上的数值进行计算得到缩略图矩阵的数据&#xff0c;如下图右所示。 import torch import torch.nn.functional as Finput torch.tensor([[1, 2…

麒麟系统开启root账户及自动登陆

1.首先我们通过“开始菜单t”快捷键打开命令行页面&#xff0c;然后我们通过 cd /usr/share/lightdm/lightdm.conf.d/进入对应系统目录。之后我们通过ls命令查看目录中的文件&#xff0c;找到95-ukui-greeter.conf这个文件。 2.之后我们通过命令 sudo vim 95-ukui-greeter.c…

RHEL7 重置 root 用户密码

文章目录 前言重置步骤 前言 重置 root 密码是红帽考题之一&#xff0c;在现实运维工作当中&#xff0c;难免会遇到忘记 root 密码的情况&#xff0c;因此尽管重置密码的步骤很简单&#xff0c;但做个记录方便以后查阅也是好的 ~~ 重置步骤 Step1&#xff1a;重启操作系统&am…

飞腾平台芯片测试固件(SFW)和开机启动log

一、说两句 最近公司飞腾产品越来越多了&#xff0c;FT-2000/4的D2000的X100的&#xff0c;最近又新出了E2000。越来越多新来的小孩儿开始加入到飞腾的调测试中&#xff0c;那么在他们实际的调试中会遇到很多的问题。在固件启动阶段有的板卡会有一些异常&#xff0c;有时我们需…

Nginx配置文件详解

Nginx配置文件详解 1、Nginx配置文件1.1主配置文件详解1.2子配置文件 2、全局配置部分2.1修改启动的工作进程数&#xff08;worker process) 优化2.2cpu与worker process绑定2.3 PID 路径修改2.4 修改工作进程的优先级2.5调试工作进程打开的文件的个数2.6关闭master-worker工作…