上一节记录没有加上echarts的legend功能,这一小节补一下。

1. 数据

我们可以从echarts中看出,折线数据并不是我们传进入的原始数据(多数情况下我们也不会修改原始数据),而是原始数组的一个备份而已。备份数组的方法有很多。这里我是用了ES6的方法。

  1. series(series) {
  2. if(!arguments.length) return this._series;
  3. this._series = series;
  4. let maxY = this.selectMaxYNumber(this._series);
  5. this.scaleY([0, maxY])
  6. return this;
  7. }
  8. dataY(data) {
  9. if(!arguments.length) return this._dataY;
  10. this._dataY = data;
  11. this.series(this._dataY.map(d => d));
  12. return this;
  13. }
  1. 这里的this._dataY就是原始数组,this._series就是备份
  1. this._series = this._dataY.map(d => d)

2.渲染上部分legend

如图

首先上面有很多相同的图形标志,我们像定义clipPath一样定义这些图形,然后通过use去引用他们,接着去渲染上面的承装legend的容器

  1. initGraph() {
  2. let graph = this._svg.append('defs')
  3. .append('g')
  4. .attr('id', 'graph')
  5.  
  6. graph.append('line')
  7. .attr('x1', 0)
  8. .attr('y1', 0)
  9. .attr('x2', 30)
  10. .attr('y2', 0)
  11. .style('stroke', 'inherit')
  12.  
  13. graph.append('circle')
  14. .attr('cx', 15)
  15. .attr('cy', 0)
  16. .attr('r', 6.5)
  17. .attr('stroke', 'inherit')
  18. .attr('fill', '#fff')
  19.  
  20. this._graphGroup = this._svg.append('g').attr('class', 'graphGroup')
  21. }

这里是应用use的代码

  1. let ele = this._graphGroup.selectAll('g.graph-item').data(this._dataY);
  2.  
  3. let ent = ele.enter().append('g')
  4. .attr('class', 'graph-item')
  5.  
  6. ent.append('use')
  7. .attr('x', (d,i) => i * 150 + 100)
  8. .attr('y', 20)
  9. .attr('xlink:href', '#graph')
  10. .attr('stroke', (d,i) => this._color(i))
  11. .style('cursor', 'pointer')
  12.  
  13. ent.append('text')
  14. .attr('x', (d,i) => i * 150 + 132)
  15. .attr('y', 20)
  16. .attr('dy', '.4em')
  17. .attr('fill', '#444')
  18. .style('font-size', '13px')
  19. .style('cursor', 'pointer')
  20. .text(d => d.name)

3. 点击相应legend重新筛选数据渲染

  1. ent.append('text')
  2. .attr('x', (d,i) => i * 150 + 132)
  3. .attr('y', 20)
  4. .attr('dy', '.4em')
  5. .attr('fill', '#444')
  6. .style('font-size', '13px')
  7. .style('cursor', 'pointer')
  8. .text(d => d.name)
  9. .on('click', item => {
  10. let index = this._series.map(d => d.name).indexOf(item.name);
  11. if(this._series[index]['data'].length == 0) {
  12. this.series(this._series.map((d,i) => {
  13. if(i == index) {
  14. return this._dataY[index]
  15. } else {
  16. return d;
  17. }
  18. }))
  19. } else {
  20. this.series(this._series.map((d,i) => {
  21. if(i == index) {
  22. return {
  23. name: d.name,
  24. data: []
  25. }
  26. } else {
  27. return d
  28. }
  29. }))
  30. }
  31. this.render();
  32. })

主要的代码差不多就是这些,
想预览或者下载代码的朋友们可以来到原文下载!

原文地址 http://www.bettersmile.cn

  1.  

d3.js 教程 模仿echarts legend功能的更多相关文章

  1. d3.js 教程 模仿echarts柱状图

    由于最近工作不是很忙,隧由把之前的charts项目用d3.js重写的一下,其实d3.js文档很多,但是入门不是很难,可是想真的能做一个完成的,交互良好的图还是要下一番功夫的.今天在echarts找到了 ...

  2. d3.js 教程 模仿echarts折线图

    今天我们来仿echarts折线图,这个图在echarts是折线图堆叠,但是我用d3改造成了普通的折线图,只为了大家学习(其实在简单的写一个布局就可以).废话不多说商行代码. 1 制作 Line 类 c ...

  3. vue项目中基于D3.js实现桑基图功能

    前端实现数据可视化的方案有很多种,以前都是使用百度的echarts,使用起来很方便,直接按照特定的数据格式输入,就能实现相应的效果,虽然使用方便,但是缺点就是无法自定义一些事件操作,可自由发挥的功能很 ...

  4. d3.js封装文本实现自动换行和旋转平移等功能

    我们下面话不多说,本文主要介绍的是利用D3.js封装文本实现自动换行功能的步骤,下面来一起看看吧. 一.引用 multext.js 文件 multext.js function appendMulti ...

  5. D3.js的v5版本入门教程(第三章)—— 选择元素和绑定数据

    D3.js的v5版本入门教程(第三章) 在D3.js中,选择元素和绑定元素是最基本的内容,也是很重要的内容,等你看完整个教程后你会发现,这些D3.js教程都是在选择元素和绑定元素的基础上展开后续工作的 ...

  6. D3.js 入门教程

    最近需要用到d3, 记录下d3的教程 网上搜了几个关于d3的教程 D3.js 入门教程      http://wiki.jikexueyuan.com/project/d3wiki/author.h ...

  7. javascript实例教程使用canvas技术模仿echarts柱状图

    canvas 画布是HTML5中新增的标签,可以通过js操作 canvas 绘图 API在网页中绘制图像. 百度开发了一个开源的可视化图表库ECharts,功能非常强大,可以实现折线图.柱状图.散点图 ...

  8. D3.js的v5版本入门教程(第十三章)—— 饼状图

    D3.js的v5版本入门教程(第十三章) 这一章我们来绘制一个简单的饼状图,我们只绘制构成饼状图基本的元素——扇形.文字,从这一章开始,内容可能有点难理解,因为每一章都会引入比较多的难理解知识点,在这 ...

  9. D3.js的v5版本入门教程(第十二章)—— D3.js中各种精美的图形

    D3.js的v5版本入门教程(第十二章) D3中提供了各种制作常见图形的函数,在d3的v3版本中叫布局,通过d3.layout.xxx,来新建,但是到了v5,新建一个d3中基本的图形的方式变了(我也并 ...

随机推荐

  1. [POJ2823] Sliding Window 「单调队列」

    我们从最简单的问题开始: 给定一个长度为N的整数数列a(i),i=0,1,...,N-1和窗长度k. 要求:   f(i) = max{ a(i-k+1),a(i-k+2),..., a(i) },i ...

  2. abp(net core)+easyui+efcore实现仓储管理系统——使用 WEBAPI实现CURD (十一)

    abp(net core)+easyui+efcore实现仓储管理系统目录 abp(net core)+easyui+efcore实现仓储管理系统——ABP总体介绍(一) abp(net core)+ ...

  3. ERROR 临时

    ERROR ITMS-4238: "Redundant Binary Upload. There already exists a binary upload with build vers ...

  4. angular6组件通信

    此文章是用markdown书写,赋值全部到vscode打开即可. # Angular组件通信 ## .父组件传递数据到子组件 - `@Input`:属性绑定,父组件向子组件传递数据 ```js // ...

  5. [AI开发]目标检测之素材标注

    算力和数据是影响深度学习应用效果的两个关键因素,在算力满足条件的情况下,为了到达更好的效果,我们需要将海量.高质量的素材数据喂给神经网络,训练出高精度的网络模型.吴恩达在深度学习公开课中提到,在算力满 ...

  6. html以前没有学到的标签

    <q>标签,短文本引用 <blockquote>标签,长文本引用 <address>标签,为网页加入地址信息 <code>标签,插入单行代码 <p ...

  7. 我的第一个py爬虫-小白(beatifulsoup)

    一.基本上所有的python第一步都是安装.安装 我用到的第三方安装包(beatifulsoup4.re.requests).还要安装lxml 二.找个http开头的网址我找的是url="h ...

  8. 3PHP如何用PDO的连接方式方式导出mysql数据

    首先连接mysql,具体看上一篇 接下来在try{}中加入以下代码 $query="select * from 你的数据表名称"          //$query的内容给个SQL ...

  9. Docker启用TLS进行安全配置

    之前开启了docker的2375 Remote API,接到公司安全部门的要求,需要启用授权,翻了下官方文档 Protect the Docker daemon socket 启用TLS 在docke ...

  10. [TCP/IP]DNS解析

    DNS解析主机的IP地址 host -t A www.baidu.com