背景

目前团队在可视化图表这里采用的Echarts来展示数据, 类似也是用第三方组件库提供的API,但在有的时候还是满足不了业务百变的需求。

预研目标

• 使用D3技术实现可视化功能

简介

D3是一个js可视化工具库,功能非常强大,就像给你一张纸和一枝笔,随心所欲,想怎么画就怎么画,非常符合任性的我们。它借助html、svg以及css,可以把我们抽象的数据,形象鲜活的呈现出来。

D3与Echarts的对比

d3.js

echarts

功能

3D角度画图表

可视化图表库(以图表出发)

区别

  • 太底层,学习成本较大
  • 兼容到IE9以上以及所有的主流浏览器
  • D3通过svg来绘制图形
  • 可以自定义事件
  • 封装好的方法直接调用
  • 兼容到ie6以及以上的所有主流浏览器
  • echarts通过canvas来绘制图形
  • 封装好的,直接用,不能修改

工作机制

Svg

  • 不依赖分辨率
  • 基于xml绘制图形,可以操作dom
  • 支持事件处理器
  • 复杂度高,会减慢页面的渲染速度

Canvas

  • 依赖分辨率
  • 基于js绘制图形
  • 不支持事件处理器
  • 能以png或者jpg的格式保存图片

业务场景

交互类(鼠标、键盘、触屏事件操作)

展示数据

灵活性

灵活度高,被评为"限制作品水平的只会是想象力而不再是技术"

方法封装,必须依赖官方提供的图表类型

学习成本

任何一款工具型产品,在产品设计时都遇到“自由度”和“简便性”两者间的权衡与取舍,而往往这两者很难兼得。
echarts 使用简单而自由度差, d3 自由度好而学习门槛高。

官方学习参考资料:

https://github.com/d3/d3/wiki/API–%E4%B8%AD%E6%96%87%E6%89%8B%E5%86%8C

为了理解关于 D3 的基本概念,我们从github找到示例,然后对照API了解相关功能,而后就行复杂业务的开发。

简易买一本书来同步学习,先尝试实现简单的图形,如果可以的话最好了解一下函数式编程的curry与compose思想。慕课网入门视频地址:https://www.imooc.com/learn/103

学习之后,完成了几个简易图表的开发,源码地址:https://github.com/monkey01127/d3-demo

实现类似功能代码如下(同为柱形图):

D3代码示例:

<!DOCTYPE html>
<html><head><meta charset="UTF-8" content=""><title>for test</title><style type="text/css">#container {width: 500px;height: 250px;background: #eee;}path {fill: none;stroke-width: 1;stroke: #468284;}.tick line {stroke-width: 1;stroke: black;}</style></head><body><div id="container"></div><script type="text/javascript" src="d3.js"></script><script src="https://cdn.bootcdn.net/ajax/libs/lodash.js/4.17.20/lodash.js"></script><script>var svgW = 500,svgH = 250,margin = {left: 50,top: 30,right: 20,bottom: 20},g_width = svgW - margin.left - margin.right,g_height = svgH - margin.top - margin.bottom;var svg = d3.select('#container').append('svg').attr('width', svgW).attr('height', svgH);var g = d3.select('svg').append('g').attr('transform', `translate(${margin.left}, ${margin.top})`);var data = [1, 3, 5, 7, 8, 4, 3, 7]// 一个线性比例尺var scale_x = d3.scale.linear()// 定义域: 坐标系下的值(输入范围).domain([0, data.length - 1])// 值域,就是映射到svg画布上的值 (输出范围).range([0, g_width]);// 一个线性比例尺var scale_y = d3.scale.linear().domain([0, d3.max(data)]).range([g_height, 0]);// 线形图表// var line_generator = d3.svg.line()//  面积型图表var area_generator = d3.svg.area().x(function(d, i) {return scale_x(i);})// .y(function(d) {//   return scale_y(d);// }).y0(g_height).y1(function(d) {return scale_y(d);}).interpolate('cardinal');g.append('path')// .attr('d', line_generator(data));.attr('d', area_generator(data)).style('fill', 'steelblue');// 创建一个新的轴生成器var x_axis = d3.svg.axis().scale(scale_x);y_axis = d3.svg.axis().scale(scale_y).orient('left');g.append('g').call(x_axis).attr('transform', `translate(0, ${g_height})`);g.append('g').call(y_axis).append('text').text('Price($)').attr('transform', `rotate(-90)`).attr('text-anchor', 'end').attr('dy', '1em')// .attr('transform', `translate(0, ${g_width})`);</script></body>
</html>

echarts

// 按需引入
const echarts = require('echarts/lib/echarts');
require('echarts/lib/component/grid');
require('echarts/lib/chart/line');
var chartDom = document.getElementById('main');
var myChart = echarts.init(chartDom);
var option;
option = {xAxis: {type: 'category',boundaryGap: false,data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']},yAxis: {type: 'value'},series: [{smooth: true,data: [820, 932, 901, 934, 1290, 1330, 1320],type: 'line',areaStyle: {}}]
};
option && myChart.setOption(option);

D3适用场景

• 灵活性高、交互多的业务图表(框架不能实现图表)

难点

• 知识涉及底层,需要花费一定的时间,进行基础知识的学习

结论:

d3完全可以引入团队技术栈,在图表灵活性上加以提高。

D3.js的技术预研相关推荐

  1. 基于CKEditor网页富文本编辑工具转PDF文件的技术预研分析报告

    目  录 基于CKEditor网页富文本编辑工具转PDF文件的技术预研分析报告 1 1. 预研背景 4 2. 预研目的和意义 4 3. 预研目标 4 4. 预研技术概述 4 5. 预研技术实现 7 5 ...

  2. 附录H-2 技术预研报告

    目 录 0. 文档介绍 4 摘要 4 读者对象 4 参考文档 4 术语与缩写解释 4 背景介绍 5 技术预研目标 5 技术预研取得的工作成果 5 技术A的研究报告 5 技术B的研究报告 5 文档介绍 ...

  3. 技术人文|声音捐赠,一场PBL式技术预研实验

    你有没有想过,在不能说话的情况下该如何向不识字的摊主点不加香菜的二两毛细(拉面)? "用手比划?"  "画在纸上?"  "找别人帮忙?" 这 ...

  4. 微信小程序开发技术预研分析报告

    预研背景 本次预研是对微信小程序使用流程及开发技术的研究. 预研目的和意义 本次预研在于了解小程序具体语法.接口功能.具体实现方式等. 预研目标 通过微信小程序的技术研究可实现自主完成小程序的功能开发 ...

  5. 南京华为技术预研面试经历

    按照约定,下班就直奔新街口的长发银座,不过想找到能上到7楼的电梯还真是有点困难,绕着转了一圈,很失败的先上了B座电梯,发现7楼的按钮按不了,最后才登上了A座电梯,到达了7楼.一出电梯门,偌大的几个华为 ...

  6. HTML5视频监控技术预研

    原文 https://blog.gmem.cc/research-on-html5-video-surveillance 引言 安防类项目中通常都有视频监控方面的需求.视频监控客户端主要是Native ...

  7. iOS热修复(热更新)技术预研

    热修复简介 对于iOS应用而言,app store的审核周期可能通常维持在1-2个星期.倘若一个线上的应用出现了一些bug,甚至是致命的崩溃,这时候假如按照苹果的套路乖乖重新发布一个版本,然后静静等待 ...

  8. charshow技术预研

    既然确定了要做什么,现在就开始预言技术难点了: 准备在QT上面去实现这个软件:但由于对于QT还不是特别的熟悉,不能等着将QT都学会了再去做,只能缺什么补什么了: 提出一些问题,想想怎么解决: 1 希望 ...

  9. JDBC技术预研选型依据【转】

    2019独角兽企业重金招聘Python工程师标准>>> http://songwie.com/articlelist/44 mycat分布式mysql中间件(mysql中间件研究) ...

最新文章

  1. pytest+allure环境别人电脑运行正常,自己运行不正常几种情况
  2. 螳螂捕蝉黄雀在后!地下黑客论坛免费远控木马被曝“后门”
  3. python软件是干什么用的-python中的django是做什么的
  4. 鸿蒙系统替代安卓,华为鸿蒙2.0可以替代安卓吗,华为鸿蒙2.0优势在哪
  5. 【TensorFlow-windows】keras接口——利用tensorflow的方法加载数据
  6. Hangfire使用ApplicationInsigts监控
  7. 使用熔断器设计模式保护软件
  8. kaggle实战—泰坦尼克(三、数据重构)
  9. Java render用法_SpringMVC ModelAndView的用法使用详解
  10. 【Elasticsearch】我们如何在 5 天内在同一个 Elasticsearch 集群中重新索引 360 亿份文档
  11. Android大学课件SQLite3 数据库操作
  12. dbentry访问带密码的Access
  13. html5注册页面样式,HTML5一款小清新风格的登录/注册表单界面模板
  14. python人脸考勤系统_python人脸考勤系统Python3多进程 multiprocessing 模块实例详解
  15. 向量空间的基和维数例题_向量空间的基与维数.ppt
  16. swagger主页访问,返回报错500
  17. Android HAL层
  18. 电子警察位置【收藏】
  19. Flink中的CEP(一)
  20. 2021-02-25 复利

热门文章

  1. 能安装Chrome扩展和油猴脚本的手机浏览器
  2. 第四届橙瓜网络文学奖网文之王,烽火戏诸侯舍我其谁?
  3. Android开发:如何实现收发短信
  4. Robot Framework RIDE工具闪退处理
  5. 用HTML+js实现求圆的面积和周长
  6. WM_INITDIALOG与WM_CREATE消息的区别
  7. C#可以编辑的ListView
  8. ICCV2021 | TransFER:使用Transformer学习关系感知的面部表情表征
  9. 如何进行系统的架构设计?
  10. 多维数组存储的两种方式