d3.js 教程 模仿echarts legend功能
上一节记录没有加上echarts的legend功能,这一小节补一下。
1. 数据
我们可以从echarts中看出,折线数据并不是我们传进入的原始数据(多数情况下我们也不会修改原始数据),而是原始数组的一个备份而已。备份数组的方法有很多。这里我是用了ES6的方法。
series(series) {
if(!arguments.length) return this._series;
this._series = series;
let maxY = this.selectMaxYNumber(this._series);
this.scaleY([0, maxY])
return this;
}
dataY(data) {
if(!arguments.length) return this._dataY;
this._dataY = data;
this.series(this._dataY.map(d => d));
return this;
}
这里的this._dataY就是原始数组,this._series就是备份
this._series = this._dataY.map(d => d)
2.渲染上部分legend
如图
首先上面有很多相同的图形标志,我们像定义clipPath一样定义这些图形,然后通过use去引用他们,接着去渲染上面的承装legend的容器
initGraph() {
let graph = this._svg.append('defs')
.append('g')
.attr('id', 'graph') graph.append('line')
.attr('x1', 0)
.attr('y1', 0)
.attr('x2', 30)
.attr('y2', 0)
.style('stroke', 'inherit') graph.append('circle')
.attr('cx', 15)
.attr('cy', 0)
.attr('r', 6.5)
.attr('stroke', 'inherit')
.attr('fill', '#fff') this._graphGroup = this._svg.append('g').attr('class', 'graphGroup')
}
这里是应用use的代码
let ele = this._graphGroup.selectAll('g.graph-item').data(this._dataY); let ent = ele.enter().append('g')
.attr('class', 'graph-item') ent.append('use')
.attr('x', (d,i) => i * 150 + 100)
.attr('y', 20)
.attr('xlink:href', '#graph')
.attr('stroke', (d,i) => this._color(i))
.style('cursor', 'pointer') ent.append('text')
.attr('x', (d,i) => i * 150 + 132)
.attr('y', 20)
.attr('dy', '.4em')
.attr('fill', '#444')
.style('font-size', '13px')
.style('cursor', 'pointer')
.text(d => d.name)
3. 点击相应legend重新筛选数据渲染
ent.append('text')
.attr('x', (d,i) => i * 150 + 132)
.attr('y', 20)
.attr('dy', '.4em')
.attr('fill', '#444')
.style('font-size', '13px')
.style('cursor', 'pointer')
.text(d => d.name)
.on('click', item => {
let index = this._series.map(d => d.name).indexOf(item.name);
if(this._series[index]['data'].length == 0) {
this.series(this._series.map((d,i) => {
if(i == index) {
return this._dataY[index]
} else {
return d;
}
}))
} else {
this.series(this._series.map((d,i) => {
if(i == index) {
return {
name: d.name,
data: []
}
} else {
return d
}
}))
}
this.render();
})
主要的代码差不多就是这些,
想预览或者下载代码的朋友们可以来到原文下载!
原文地址 http://www.bettersmile.cn
d3.js 教程 模仿echarts legend功能的更多相关文章
- d3.js 教程 模仿echarts柱状图
由于最近工作不是很忙,隧由把之前的charts项目用d3.js重写的一下,其实d3.js文档很多,但是入门不是很难,可是想真的能做一个完成的,交互良好的图还是要下一番功夫的.今天在echarts找到了 ...
- d3.js 教程 模仿echarts折线图
今天我们来仿echarts折线图,这个图在echarts是折线图堆叠,但是我用d3改造成了普通的折线图,只为了大家学习(其实在简单的写一个布局就可以).废话不多说商行代码. 1 制作 Line 类 c ...
- vue项目中基于D3.js实现桑基图功能
前端实现数据可视化的方案有很多种,以前都是使用百度的echarts,使用起来很方便,直接按照特定的数据格式输入,就能实现相应的效果,虽然使用方便,但是缺点就是无法自定义一些事件操作,可自由发挥的功能很 ...
- d3.js封装文本实现自动换行和旋转平移等功能
我们下面话不多说,本文主要介绍的是利用D3.js封装文本实现自动换行功能的步骤,下面来一起看看吧. 一.引用 multext.js 文件 multext.js function appendMulti ...
- D3.js的v5版本入门教程(第三章)—— 选择元素和绑定数据
D3.js的v5版本入门教程(第三章) 在D3.js中,选择元素和绑定元素是最基本的内容,也是很重要的内容,等你看完整个教程后你会发现,这些D3.js教程都是在选择元素和绑定元素的基础上展开后续工作的 ...
- D3.js 入门教程
最近需要用到d3, 记录下d3的教程 网上搜了几个关于d3的教程 D3.js 入门教程 http://wiki.jikexueyuan.com/project/d3wiki/author.h ...
- javascript实例教程使用canvas技术模仿echarts柱状图
canvas 画布是HTML5中新增的标签,可以通过js操作 canvas 绘图 API在网页中绘制图像. 百度开发了一个开源的可视化图表库ECharts,功能非常强大,可以实现折线图.柱状图.散点图 ...
- D3.js的v5版本入门教程(第十三章)—— 饼状图
D3.js的v5版本入门教程(第十三章) 这一章我们来绘制一个简单的饼状图,我们只绘制构成饼状图基本的元素——扇形.文字,从这一章开始,内容可能有点难理解,因为每一章都会引入比较多的难理解知识点,在这 ...
- D3.js的v5版本入门教程(第十二章)—— D3.js中各种精美的图形
D3.js的v5版本入门教程(第十二章) D3中提供了各种制作常见图形的函数,在d3的v3版本中叫布局,通过d3.layout.xxx,来新建,但是到了v5,新建一个d3中基本的图形的方式变了(我也并 ...
随机推荐
- 金蝶K3 V12.2版本,对已发生业务单据的物料启用辅助计量单位
/****************************************************************************** 联达双计量单位 yLD_K3Data_S ...
- 角度转弧度&根据弧度计算圆周上点的坐标的方法
角度转弧度: #define AngleToRadian(angle) (M_PI/180.0f)*angle 以正东面为0度起点计算指定角度所对应的圆周上的点的坐标: float radian = ...
- Python flask构建微信小程序订餐系统
第1章 <Python Flask构建微信小程序订餐系统>课程简介 本章内容会带领大家通览整体架构,功能模块,及学习建议.让大家在一个清晰的开发思路下,进行后续的学习.同时领着大家登陆ht ...
- rocksdb编译步骤——Java、Golang、mac
如果不是必要不建议自己编译rocksdb,编译的过程比较耗时费力.现在已经有很多编译好的文件可供使用. Java <!-- https://mvnrepository.com/artifact/ ...
- 什么是https?http升级为https需要什么?
一.什么是https? https是一种加密传输协议,网站使用https后可以避免敏感信息被第三方获取.https加密协议=SSL / TLS+http协议,也就是说,在传统的http协议上加上SSL ...
- 一文搞懂Python迭代器和生成器
很多童鞋搞不懂python迭代器和生成器到底是什么?它们之间又有什么样的关系? 这篇文章就是要用最简单的方式让你理解Python迭代器和生成器! 1.迭代器和迭代过程 维基百科解释道: 在Python ...
- 802.11学习笔记1-WIFI参数含义
研究下wifi参数的含义 #The word of "Default" must not be removed Default CountryRegion= CountryRegi ...
- JAVA基础知识(八)值传递与引用传递
值传递:(形式参数类型是基本数据类型):方法调用时,实际参数把它的值传递给对应的形式参数,形式参数只是用实际参数的值初始化自己的存储单元内容,是两个不同的存储单元,所以方法执行中形式参数值的改变不影响 ...
- 《机器学习技法》---soft-margin SVM
1. soft-margin SVM的形式 其中ξn表示每个点允许的犯错程度(偏离margin有多远),但是犯错是有代价的,也就是目标函数里面要最小化的.c控制对犯错的容忍程度. 2. 推导soft ...
- Go调度器介绍和容易忽视的问题
本文记录了本人对Golang调度器的理解和跟踪调度器的方法,特别是一个容易忽略的goroutine执行顺序问题,看了很多篇Golang调度器的文章都没提到这个点,分享出来一起学习,欢迎交流指正. 什么 ...