1  function drawBar(data) {
 2      var barGraph = document.querySelector("#bar-graph");
 3      var graphWidth = 700;
 4      var graphHeight = 300;
 5      const graphPadding = 25;
 6      //轴的宽高
 7      const axisWidth = graphWidth - graphPadding;
 8      const axisHeigt = graphHeight - graphPadding;
 9      //柱的间隔
10      const barGap = 12;
11      //单个数据柱子的宽
12      const barWidth = ((axisWidth - graphPadding - barGap * 13) / 12) / data.length;
13      //每根柱子的颜色
14      const barColor = ["#27a1ea", "#9cdc82", "#ff9f69", "#d660a8", "#6370de", "#32d3eb", "#d4ec59", "#feb64d", "#b55cbd"];
15      //轴的颜色
16      const axisColor = "#000";
17      //最大值
18      var dataMax = 0;
19      //柱状图数据sale
20      var newData = [];
21
22      //设置html的svg的宽度和高度
23      barGraph.setAttribute("width", graphWidth);
24      barGraph.setAttribute("height", graphHeight);
25      //找到最大值
26      for (let i = 0; i < data.length; i++) {
27          if (typeof data[0] != "number") {
28              let temp = Math.max(...data[i].sale);//es6扩展运算符 将数组转为序列。
29              if (temp > dataMax) {
30                  dataMax = temp;
31              }
32              newData.push(data[i].sale);
33          } else {
34              dataMax = Math.max(...data);
35              newData.push(data[i]);
36          }
37      }
38      //数据和像素的折算
39      var rate = dataMax / (axisHeigt - graphPadding);
40      //绘制坐标轴
41      let barHtml = [];
42      //先纵轴再横轴注意SVG画线模板间隔
43      barHtml.push("<line x1=" + graphPadding + " y1=0" + " x2=" + graphPadding + " y2=" + axisHeigt + " stroke=" + axisColor + " stroke-width='2'/>");
44      barHtml.push("<line x1=" + graphPadding + " y1=" + axisHeigt + " x2=" + axisWidth + " y2=" + axisHeigt + " stroke=" + axisColor + " stroke-width='2'/>");
45      //绘制柱状图(需要X,Y,宽度,高度)(高度=数值/rate)
46      for (let i = 0; i < newData.length; i++) {
47          for (let j = 0; j < newData[i].length; j++) {
48              let num = parseInt(newData[i][j]);
49              let barBlock = data.length * barWidth;
50
51              let x = graphPadding + (j + 1) * barGap + i * barWidth + j * barBlock;
52              barHtml.push("<rect width=" + barWidth + " height=" + (num / rate) + " x=" + x + " y=" + (axisHeigt - num / rate) + " fill=" + barColor[i] + " />");
53          }
54      }
55      barGraph.innerHTML = barHtml.join(""); //join("")拼成字符串无间隔 join()默认为逗号,
56  }

今天终于将SVG生成柱状图的代码给完成了,过程中定位比较重要,包括坐标轴的X,Y点,和长度宽度,都需要要好好设计一下。

其中viewbox属性比较有趣,学习了,贴出鑫旭大神的解说,非常清晰。http://www.zhangxinxu.com/wordpress/?p=4323

在编写代码时,记得哪个数组对应哪些数据,实在忘记可用console.log进行打印查看,方便定位

for循环中的i记得要声明!!

循环拼写html时,记得对应好SVG的标签格式,留出适当的空格才正确!

拼接最后的html时,用join(“”),中间不用放任何内容,便可连接html,不能使用join(),否则默认为逗号连接。

转载于:https://www.cnblogs.com/Joe-and-Joan/p/10211393.html

小任务之使用SVG画柱状图~相关推荐

  1. python横向柱状图-python画柱状图--不同颜色并显示数值的方法

    用python画柱状图容易,但是如何对不同柱子使用不同颜色呢?同时在柱子顶端显示精确数值? 主要用的方法为: atplotlib.pyplot.bar(left, height, width=0.8, ...

  2. [html] 使用svg画一个微信的logo

    [html] 使用svg画一个微信的logo <svg xmlns="http://www.w3.org/2000/svg" version="1.1"& ...

  3. python画柱形图显示数值_python画柱状图--不同颜色并显示数值的方法

    用python画柱状图容易,但是如何对不同柱子使用不同颜色呢?同时在柱子顶端显示精确数值? 主要用的方法为: atplotlib.pyplot.bar(left, height, width=0.8, ...

  4. d3.js画柱状图超详细教程

    d3.js画柱状图超详细教程 完整代码下载链接:https://download.csdn.net/download/qq5q13638/85248934,直接用这个文件夹内打开即可. 下面是完整教程 ...

  5. SVG画扇形,可以改变数量、扇形角度、扇形方向

    效果图有点low,忍一忍吧 最近做项目,需求是在地图上实现一个基站,虽然基站是由扇形组成的2D图标(就像一个风扇) 来个图吧: 但是有个要求 用户可以配置任意多个扇形,任意角度大小,任意方向的扇形,后 ...

  6. 原生微信小程序圆形倒计时svg组件

    #写在最前# 微信小程序不支持svg标签,需要把svg转成base64用background属性展示,缺点是执行倒计的时候,圆形轨道无法做动画,只能很生硬的展示每一帧:优点时非常清晰,不会有锯齿. # ...

  7. 使用python画柱状图(matplotlib.pyplot)-- 你想要的设置这张图基本都包括

    本人写论文时画的图,总结一下方法: 安心看下去,你应该就可以画出一个好看的柱状图,基本上需要的设置都有哦!!! 目录 1 首先引入画图所需要的包Matplotlib 2 Matplotlib Pypl ...

  8. Python -Pandas 如何画柱状图?

    摘要:本文主要是讲一下用python如何画柱状图(频率直方图),老规矩,先看看我们最终实现的效果. .可以看到,横轴是某个属性的取值,而纵轴是出现是频数. 本图来自于以下的数据集: --------- ...

  9. svg画半圆详解(L指令、M指令、A指令)

    svg画半圆 了解画半圆的各个指令 L指令 M指令 A指令 画整半圆 推荐:svg画整圆详解 推荐:svg的text标签字体.颜色.样式.大小.居中详解 接到需求,要求做出一个这样的活动转盘,,,,, ...

  10. python(matplotlib)画柱状图(1)

    写在前面的话 当当当,又要总结画图了,现在写博客都有一种美妆博主在写美妆心得的介绍.biubiu- 今天要记录的内容就是我们的python 画柱状图. 画柱状图一般我觉得就是数据可以被枚举的有限的,并 ...

最新文章

  1. 时间卷积网络(TCN)在 NLP 多领域发光,RNN 或将没落
  2. 初步估算轴直径2017-12-13
  3. hprose出现500: Internal Server Error
  4. bugku—— 代码审计 做题记录
  5. 如何自动完成登录 SAP BTP workflow(工作流) 管理应用 Launchpad 所需的设置
  6. python与access选哪个_从Python连接到Access
  7. powerdns与nginx结合实现以域名和IP方式访问web服务器80端口时分别跳转到不同页面...
  8. Linux基础命令---mpstat显示CPU使用情况
  9. 进阶第十一课 Python模块之random
  10. SoapUI、Jmeter、Postman三种接口测试工具的比较分析
  11. struct vsf_sysutil_statbuf
  12. PS安装失败解决方法
  13. 用O(lgn)时间求出两个已排序数组的中位数
  14. 2022全国职业技能大赛大数据技术与应用赛项赛题环境准备
  15. 论文阅读及代码学习-Directed Acyclic Graph Network for Conversational Emotion Recognition
  16. 用Html5制作 汤姆猫 小游戏
  17. 使用pandas批量重命名(指定Excel中的对应列)
  18. 怎么隐藏CAD文件里的图层?
  19. 电工实验室基本生存技能 第一季第三集
  20. 问题1084:搭数字Ⅰ

热门文章

  1. Unity MRTK RadialView
  2. 十七、Oracle学习笔记:视图操作和表复制
  3. 访问HDFS报错:org.apache.hadoop.security.AccessControlException: Permission denied
  4. PHP REDIS 使用长连接多数据库存储到最后一个数据库中的问题解决
  5. Postman API 开发的协作平台
  6. Redis 常见问题 与 常见错误
  7. XStream 解析 XML 深入剖析
  8. 阶段5 3.微服务项目【学成在线】_day04 页面静态化_05-freemarker基础-List指令
  9. 设计模式------建造者模式
  10. ApiDoc 一键生成注释