一、Echarts是如何画图的

在ECharts 5没有出现之前,ECharts官方的首页还不是现在的简约风格。打开后映入眼帘的是一个很有科技感的视频,作为一个前端小白来讲,哇,前端还能这么秀?相信很多人都会有这样的想法,因为没有深入了解过大前端的小白们大都无法将数组、对象和眼前这个直观的图表联系起来。但是如果仔细研究后会发现,ECharts的原理其实也没有那么难。

整个ECharts库都是以canvas为基础的!canvas是一个可以在页面上固定的画图区域建立坐标系,然后通过JavaScript脚本在坐标系中绘制圆、盒、文字等。比如下面这段代码:

<canvas id="canvasArea" width="300" height="300"></canvas>
canvas {border: 1px solid black;
}
function draw(){var canvas = document.getElementById('canvasArea');var ctx = canvas.getContext("2d");ctx.fillStyle = "rgb(200,0,0)";ctx.fillRect (10, 10, 55, 50);ctx.fillStyle = "rgba(0, 0, 200, 0.5)";ctx.fillRect (30, 30, 55, 50);
}
draw();

这是一段简单的canvas代码,用来生成两个矩形,在浏览器中显示的结果如下:

上图中黑色边框圈起来的区域便是画图区域。利用坐标和宽窄,canvas便会自动帮助我们生成我们想要图案。

理解清楚这一步以后,就可以理解ECharts究竟做了什么了:Echarts拿到数据后,通过一系列的计算,算出canvas绘制图案时所需要的数据(坐标、高度、宽度等);最终通过canvas,绘制出各色图表。

Created with Raphaël 2.2.0 原始数据 ECharts中的算法计算canvas绘制图表时需要的数据 canvas通过数据绘制图表 最终显示在浏览器中的图表

二、组件化——让开发者定制图表的解决方案

为了能满足用户的需求,ECharts对个色图表的组成也做了研究,并将其称之为组件。ECharts中的组件包括xAxis(直角坐标系 X 轴)、yAxis(直角坐标系 Y 轴)、grid(直角坐标系底板)、angleAxis(极坐标系角度轴)、radiusAxis(极坐标系半径轴)、polar(极坐标系底板)、geo(地理坐标系)、dataZoom(数据区缩放组件)、visualMap(视觉映射组件)、tooltip(提示框组件)、toolbox(工具栏组件)、series(系列)等等等等,几乎是满足了所有图表的需求。
为了更直观的展示这些组件是如何完善图表的,官方教程中给出了这样的一张图:

可以看到ECharts对整个图表中的各个部分都做了拆分,组件化为使用者提供了更多的选择,让ECharts在高度封装的前提下,又能满足开发者们的自定义需要。

三、ECharts如何了解你的想法

当然,ECharts有了非常好的解决方案,但也需要一种简洁的方法来了解开发者的想法,降低学习成本是一个优秀框架的前提,过高的学习成本会阻碍一个优秀框架的进步。万幸的是ECharts解决了这个问题。

仔细研究上面canvas确定绘图区域的方法,会发现canvas是结合DOM来选定绘图区域来最终确定坐标系的,这样做的好处的,可以通过CSS来控制最终图表的位置,绘图区域的调整和修改最终也不会影响到绘图的结果。ECharts在选取绘制区域上也使用了这一种方法:

<body><!-- 为 ECharts 准备一个具备大小(宽高)的 DOM --><div id="main" style="width: 600px;height:400px;"></div>
</body>
// 基于准备好的dom,初始化echarts实例
var myChart = echarts.init(document.getElementById('main'));

上面中通过dom确定了接下来的绘图区域。无论后续绘图区域的位置及宽高如何变化,ECharts都会基于该元素绘制图表。

确定在哪绘图后,ECharts需要了解开发者需要怎样的图表,基于组件化的设计,ECharts规定了开发者需要通过一个简单的option对象,来配置图表中的各个组件,例如官方文档中的简单例子:

<!DOCTYPE html>
<html>
<head><meta charset="utf-8"><title>ECharts</title><!-- 引入 echarts.js --><script src="echarts.min.js"></script>
</head>
<body><!-- 为ECharts准备一个具备大小(宽高)的Dom --><div id="main" style="width: 600px;height:400px;"></div><script type="text/javascript">// 基于准备好的dom,初始化echarts实例var myChart = echarts.init(document.getElementById('main'));// 指定图表的配置项和数据var option = {title: {text: 'ECharts 入门示例'},tooltip: {},legend: {data:['销量']},xAxis: {data: ["衬衫","羊毛衫","雪纺衫","裤子","高跟鞋","袜子"]},yAxis: {},series: [{name: '销量',type: 'bar',data: [5, 20, 36, 10, 10, 20]}]};// 使用刚指定的配置项和数据显示图表。myChart.setOption(option);</script>
</body>
</html>


可以看出option对象中的属性最终都以组件的方式展示在了图表中:title属性被展示为图表的标题,legend属性被渲染成为图表的图例,xAxis属性被渲染成X轴,series属性被渲染成了柱状图(series是ECharts中的一个基础概念,它指一组数值以及他们映射成的图,后面的文章中会有介绍)。

四、ECharts真正的魅力

理解完上面的内容,会发现ECharts的语法真的非常简单,熟练运用后,制作图表或许比一点一点的调整CSS更容易,但这只是一个开始。

在我看来,ECharts真正的魅力在于除了绘图,它会帮你完成很多看似无关紧要的细节,比如动画效果:

除了这种初次加载时的动画,还包括一些数据加载中的动画效果,你会惊讶的发现这些效果不仅仅作用在核心图上,整个图表的组件都会跟随动画进行变动:

这些用心的小细节会让页面的使用者更加舒心。当然ECharts除了这些还有很多惊艳的地方,小到组件上的一些小细节,大到绘制3D图表等,也难怪它的运用范围如此广泛。

五、不安于现状的ECharts

ECharts本身已经十分优秀了,项目覆盖率也非常的广,但是ECharts 5又一次创造了变革。抛开数据层面的进步不说,使用svg渲染代替canvas渲染就已经让人十分乘醉。

先对比一下在浏览器中放大250%后两种渲染方式的区别,先看canvas下渲染的:

发现了什么?放大250%后,图表已经已经完全虚化。再看看svg下渲染的结果:

看出差距了吗?svg完全解决了虚化的问题,真的是强迫症工程师的福音。

我们再看看两种渲染结果在最终的html文档中的表现,先看canvas的:

看出来了吗?canvas最终在html里面只有一个标签,即容器标签,所有的操作都是在JavaScript脚本中进行的,再看看svg的:

svg渲染后,图中的每一个元素都会以标签的形式展现在最终的html文档中,这样做的好处就是给哪些大佬们提供了自我发挥的空间,虽然我暂时没有尝试,但是,svg可能的确会使ECharts变得更加灵活。

参考和应用

https://echarts.apache.org/zh/index.html (Apache ECharts官网)
https://www.runoob.com/w3cnote/html5-canvas-intro.html (《学习 HTML5 Canvas 这一篇文章就够了》(菜鸟教程))

10分钟了解何为ECharts相关推荐

  1. 【工具篇】10分钟快速学会React图表搭建

    10分钟快速学会React图表搭建 本次紧着之前的antd,接着学习有关react图表以及富文本编辑器的搭建. 本次的功能实现基于上次的[工具篇]10分钟学会Ant Design of React用法 ...

  2. 使用和风天气 API 10分钟搭建天气预报数据看板

    本文首发:<使用和风天气 API 10分钟搭建天气预报数据看板)> 使用和风天气 API 10分钟搭建天气预报数据看板 第 1 步:注册和风天气 API 及卡拉云 (1)注册和风天气 AP ...

  3. 10分钟内基于gpu的目标检测

    10分钟内基于gpu的目标检测 Object Detection on GPUs in 10 Minutes 目标检测仍然是自动驾驶和智能视频分析等应用的主要驱动力.目标检测应用程序需要使用大量数据集 ...

  4. 10分钟学会php面相对象基础(Ⅰ)

    <?php 声明一个类 class mycar{ etc. //成员方法 } class mycar{ function drive(){ etc. } } ?> 对象的实例化 内存中分栈 ...

  5. 比特币区块的产生速度为何被设定为10分钟?

    链客,专为开发者而生,有问必答! 此文章来自区块链技术社区,未经允许拒绝转载. 众所周知,比特币的block产生速度被设定为了10分钟,按着官方wiki所说,每一个节点需要一些时间来确认block(& ...

  6. github创建静态页面_如何在10分钟内使用GitHub Pages创建免费的静态站点

    github创建静态页面 Static sites have become all the rage, and with good reason – they are blazingly fast a ...

  7. 自行车车把会吧车刮坏吗_花10分钟即可开始使用车把

    自行车车把会吧车刮坏吗 by Wing Puah 永帕(Wing Puah) 花10分钟即可开始使用车把 (Take 10 minutes to get started with Handlebars ...

  8. 以太坊区块链同步_以太坊69:如何在10分钟内建立完全同步的区块链节点

    以太坊区块链同步 by Lukas Lukac 卢卡斯·卢卡奇(Lukas Lukac) Ethereu M 69:如何在10分钟内建立完全同步的区块链节点 (Ethereum 69: how to ...

  9. es6 ... 添加属性_如何在10分钟内免费将HTTPS添加到您的网站,以及为什么您现在不止需要这样做......

    es6 ... 添加属性 by Ayo Isaiah 通过Ayo Isaiah 如何在10分钟内免费将HTTPS添加到您的网站,以及为什么现在比以往更需要这样做 (How to add HTTPS t ...

最新文章

  1. winsock 函数声明大全
  2. 【EventBus】事件通信框架 ( 总结 | 手写事件通信框架完整代码示例 | 测试上述框架 )
  3. time.h 详细介绍
  4. 网页浏览器知道我们的哪些信息?(1)
  5. [剑指offer]面试题48:不能被继承的类
  6. ssm使用全注解实现增删改查案例——DeptServiceImpl
  7. 任务调度及远端管理(基于Quartz.net)
  8. 【转】SharePoint开发中可能用到的各种Context(上下文)
  9. 计算机性能怎么测试软件,如何测试电脑性能|检测电脑性能的方法
  10. 华为路由器后台登录协议实现
  11. 简述er图的作用_er图的作用是什么
  12. 计算机组装与维护毕业论文范文,计算机应用毕业论文 计算机组装与维护
  13. 《工业控制系统信息安全防护指南》实施建议 (上)
  14. iOS 5 故事板进阶(3)
  15. python中search函数用法_查找匹配函数FIND和SEARCH的基本用法
  16. 树莓派网线直连海康威视摄像头
  17. 北京 买房 提取 公积金
  18. CSS3基础入门03
  19. FinClip 2021 年 12 月产品大事记
  20. Android 通过 NSD 服务 Netty(断线重连、心跳、黏包处理) 实现两个 Android 系统端的长连接通讯

热门文章

  1. MySQL插入数据库乱码问题Incorrect string value: ‘\xE8\xB5\xB5‘ for column ‘name‘ at row 1
  2. CSS3中rotate的作用
  3. 导航星历的钟差,TGD问题
  4. 嵌入式开发有必要学习python吗?
  5. Axure绘制左侧菜单
  6. mac关闭渐隐和弹出动画效果
  7. PTA 用java编写 7-4 房产税费计算2022
  8. 【离散数学】最小生成树失败普罗米
  9. android 游戏遥感,Android2.2+游戏摇杆 MOPS魅影T800评测
  10. git github 快速入门