当前位置: 首页 > web >正文

01-通过纯js理解数据驱动图表概念

现有1组一维数组数据:

const data = [720, 320, 531, 120, 230, 387, 258]

通过forEach循环该data,根据数据值,循环出对应长度的 rect 标签,计算好横纵坐标的位置,并在最后将各个 rect标签 append 到 svg 标签中。如图所示,在浏览器中的坐标原点在左上角,向右为x轴正方向,向下为y轴正方向,由于不需要考虑y轴的反向计算,横向柱图的生成会比竖向柱图的生成更加简单。

竖向柱图的生成思路如下: 

data.forEach((d, i) => {const rectTag = document.createElementNS('http://www.w3.org/2000/svg', 'rect')rectTag.setAttribute('x', (i * (barWidth + barPad)))rectTag.setAttribute('y', (maxHeight - d / maxValue * maxHeight) + 24)rectTag.setAttribute('width', barWidth)rectTag.setAttribute('height', (d / maxValue * maxHeight))todaySvg.append(rectTag)
})

【完整代码】

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title>
</head><body><main><h1>Chart</h1><svg width="900" height="200"></svg></main><script text="script">const data = [720, 320, 531, 120, 230, 387, 258]const todaySvg = document.querySelector('svg')const barWidth = 24const barPad = 12const maxHeight = 112const maxValue = Math.max(...data)data.forEach((d, i) => {const rectTag = document.createElementNS('http://www.w3.org/2000/svg', 'rect')rectTag.setAttribute('x', (i * (barWidth + barPad)))rectTag.setAttribute('y', (maxHeight - d / maxValue * maxHeight) + 24)rectTag.setAttribute('width', barWidth)rectTag.setAttribute('height', (d / maxValue * maxHeight))todaySvg.append(rectTag)})</script></body></html>

【注】先理解好如何通过数组的forEach来生成不同的svg元素(将图表的思路重心放在data上),能够更好地理解D3.js的原理及其使用。

http://www.xdnf.cn/news/7711.html

相关文章:

  • window 显示驱动开发-GDI 硬件加速
  • 活到老学到老-Spring参数校验注解Validated /Valid
  • 实战:基于Pangolin Scrape API,如何高效稳定采集亚马逊BSR数据并破解反爬虫?
  • Nuxt.js一个基于 Vue.js 的通用应用框架
  • 使用引用的原因 和 运算符重载的必要性
  • Ubuntu20.04安装ROS Neotic
  • AI应用交付厂商F5打造六大解决方案,助用户应对复杂挑战
  • NX750HSA20美光固态闪存HSA36NC027
  • LLM驱动的未来软件工程范式与架构策略
  • 鸿蒙开发——7.ArkUI进阶:@BuilderParam装饰器的核心用法与实战解析
  • 算法题(151):保卫花园
  • Vue video播放视频流
  • Vue 3 响应式 Ref 全解析:从基础到高阶应用
  • 监控易一体化运维:采集集群管理,构建稳健运维基石
  • Linux | 开机自启动设置多场景实现
  • 在QT中栅格布局里套非栅格布局的布局会出现父布局缩放子布局不跟随的问题
  • 深入解析FramePack:高效视频帧打包技术原理与实践
  • 前端单点登录
  • DNA与蛋白相互作用检测技术ChIP-qPCR
  • 系统思考:团队策略辅导
  • 软考软件评测师——基于风险的测试技术
  • 破解 PCB 制造四大痛点:MOM 系统构建智能工厂新范式
  • 【Java微服务组件】异步通信P1—消息队列基本概念
  • RocketMQ 顺序消息实现原理详解
  • 小米便签源码部署流程
  • 前端mjs和js文件区别,mjs和cjs区别---.es.js和.mjs的区别
  • Oracle Apps R12——报表入门:如何定义一个Concurrent Program(请求)
  • 【Auto-dl ssh隧道,TensorBoard】
  • 矩阵的秩(Rank)
  • 【Vue篇】组件的武林绝学:状态风暴下的乾坤挪移术