用echartsjs 实现散点图与table表格双向交互,以及实现echarts取自于table数据,和自定义echarts提示内容
本人研究echarts已经有一段时间了,今天就分享几个关于echarts的小技巧。虽然看起来简单,但做起来却很繁琐,不过实用性倒是很好。
在一个大的页面中,左边为table表格,右边为echarts的散点图。
需求一,实现echarts中所有的散点取自table中的数据。
需求二:两个交互,交互1,点击左边的table中数据时,先实现table重新隔行变色,然后左边被点击的数据背景颜色变黄,右边的散点图点亮。通过table控制散点图。
交互2:当点击散点图中任意数据时,获取此数据来自于左边散点图的位置,并控制页面滚动到指定位置(本例数据较少,这个方法的作用感觉不明显,但当有大量数据时,这个方法会很有用),先对table进行重新隔行变色,然后左边的table会先重构,接着右边被点击的散点图点亮。通过散点图来控制table表格。
需求三:自定义echarts提示内容。
下图是我做的小demo的简单样式图(不要觉得简单,其实可以在这个基础上增加许多的东西)。

首先我们先引入echarts
<script type="text/javascript" src="js/echarts.js" ></script>
我们先来实现第一个需求。思路:我们通过遍历将table中的数据全部获取,并存入一个数组中,再在series中使用这个数组。
篇幅有限,先在这里放核心代码(文章结尾我会全部的代码):
function gainData() {//将table中的数据赋给information
var td = info.getElementsByTagName("td");
for(var i = 0;i<td.length - 1;i++,i++){
var x = td[i].innerText*1; // x轴
var y = td[i+1].innerText*1;// y轴
information.push([// 获取所有散点数据
x,
y
]);
}
}
series: [{
name: '销量',
type: 'scatter',
data: information,
},
扩展:当table的数据是动态改变时,其实这里可以给table加上MutationObserver方法,在不刷新页面的情况可以确保散点图与它完全一致,我们这里考虑的是table数据是不改变情况。
实现两个交互:当点击左边table时,先重新加载一次隔行变色(将原先的点击记录清除掉),然后再将被点击的行变色,获取被点击的数据,将此数据存入chose数组中,重新加载echarts散点图(被点亮的值为chose中的值)。
核心代码:
function trclick() {//点击table事件,下方的顺序不要错,还有一定要使用this方法
for (var i = 1; i < tr.length; i++) {
tr[i].onclick = function clicktr() {
interleavecolor();
//重新加载一次隔行变色
this.style.background = "#FFFF00";
//被点击的变为黄色
var td = this.getElementsByTagName("td");
chosex = td[0].innerText*1;//获取点击的数据
chosey = td[1].innerText*1;
operationEcharts(); //重新运行Echarts
}
}
}
name: 'CHOSE',
type: 'effectScatter',
coordinateSystem: 'cartesian2d',
data: choseData(),//重新加载echarts时获取chose数组中需要标亮的x、y轴的值,新的数据会标亮
//标亮数据存入chose中
function choseData(){
var chose = [];
if(null==chosex||null==chosey){
chosex = 1;//这是一开始默认的标亮数据
chosey = 100;
}
chose.push([chosex,chosey]);//将获取的值存入chose数组中
return chose;
}
交互2:交互2与交互1有两点不同,1,多了一个滚动事件,控制页面滚动到我们可以看到的table指定位置,2,标亮数据来源不同,交互二中点击echarts时,将点击的数据存入chose数组中。
点击echarts的代码:
//如果点击echarts图
myChart.on('click', function (params) {
if(params.componentType == 'series') {
for (var k = 1; k < tr.length; k++) {
var tablex = String(tr[k].children[0].innerHTML); // 表格中的x轴
var tabley = String(tr[k].children[1].innerHTML); // 表格中的y轴
var chartx = String(params.data[0]);// 散点中的x轴
var charty = String(params.data[1]);// 散点中的y轴
if(tablex == chartx && tabley == charty) {
interleavecolor();
// 控制页面滚动到指定位置
tr[k].scrollIntoView();
tr[k].style.background = "#FFFF00";
// 对应行变为黄色
chosex = params.data[0];
chosey = params.data[1];
operationEcharts();//重新加载echarts视图
trclick();
break;
}
}
}
});
需求三:一般情况下,当我们鼠标移动到数据上时,echarts的原生方法的数据是没有名称,也没有单位的,会给我们造成许多的不便,我们想看到单位和名称就要对formatter的方法进行重写。我们先来看看重新前后的区别。


你会发现重写formatter方法前,数据显示2和300(你会发现根本不知道显示了什么),而重写之后我增加了日期和产量等名称。是不是高大上了一些。而这个2,300是什么数据呢。我们可以通过console.log()这个方法打印出来所有的内容,我们对内容进行拼接,就可以展示任何自己想展示的内容。看下图。

tooltip: {
padding: 10,
backgroundColor: '#222',
borderColor: '#777',
borderWidth: 1,
formatter: function (param) {
// return '<div style="border-bottom: 1px solid rgba(255,255,255,.3); font-size: 18px;padding-bottom: 7px;margin-bottom: 7px">'
// + 'table与ECharts交互模式'
// + '</div>'
// + '日期:' + param.data[0]
// + "<div></div>"
// + '产量:' + param.data[1];
console.log(param);
}
}
完整的代码如下:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<script type="text/javascript" src="js/echarts.js" ></script>
<title></title>
</head>
<body>
<div id="information"style="width: 400px;float: left;">
<table border="1">
<thead>
<tr>
<th>日期</th>
<th>产量</th>
</tr>
</thead>
<tbody>
<tr>
<td>1</td>
<td>100</td>
</tr>
<tr>
<td>2</td>
<td>300</td>
</tr> <tr>
<td>3</td>
<td>700</td>
</tr>
<tr>
<td>4</td>
<td>800</td>
</tr> <tr>
<td>5</td>
<td>700</td>
</tr>
<tr>
<td>6</td>
<td>200</td>
</tr>
</tbody>
</table>
</div>
<div id="main"style="width: 600px;height:400px;float: left;">
cccc
</div>
<script type="text/javascript">
var information = []; // 数据的源头,取自于表格
var info = document.getElementById("information");
var table = info.getElementsByTagName("table");
var tr = table[0].getElementsByTagName("tr");
var myChart = echarts.init(document.getElementById('main'));
var chosex,chosey;//被选择的x、y
//初始化echarts实例 information
gainData();//获取数据源
operationEcharts();//运行echarts
trclick();//点击table的数据时右边进行标亮
interleavecolor();//隔行变色
function gainData() {//将table中的数据赋给information
var td = info.getElementsByTagName("td");
for(var i = 0;i<td.length - 1;i++,i++){
var x = td[i].innerText*1; // x轴
var y = td[i+1].innerText*1;// y轴
information.push([// 获取所有散点数据
x,
y
]);
}
}
//画echarts
function operationEcharts(){
var option = {
title: {
text: 'table与ECharts交互模式'
},
tooltip: {
padding: 10,
backgroundColor: '#222',
borderColor: '#777',
borderWidth: 1,
formatter: function (param) {
// return '<div style="border-bottom: 1px solid rgba(255,255,255,.3); font-size: 18px;padding-bottom: 7px;margin-bottom: 7px">'
// + 'table与ECharts交互模式'
// + '</div>'
// + '日期:' + param.data[0]
// + "<div></div>"
// + '产量:' + param.data[1];
console.log(param);
}
},
legend: { },
xAxis: {
splitLine: {show: false},
axisLine: {
lineStyle : {
color: {
type: 'linear',
x: 0,
y: 0,
x2: 0,
y2: 1,
colorStops: [{
offset: 0, color: 'red' // 0% 处的颜色
}, {
offset: 1, color: 'blue' // 100% 处的颜色
}],
globalCoord: false // 缺省为 false
},
width: 2,
}
},
},
yAxis: {
splitLine: {show: true},
},
series: [{
name: '销量',
type: 'scatter',
data: information,
},
{
name: 'CHOSE',
type: 'effectScatter',
coordinateSystem: 'cartesian2d',
data: choseData(),
symbolSize: 12,
showEffectOn: 'render',
rippleEffect: {
brushType: 'stroke'
},
hoverAnimation: true,
itemStyle: {
normal: {
shadowBlur: 10,
shadowColor: 'rgba(25, 100, 150, 0.5)',
shadowOffsetY: 5,
color: new echarts.graphic.RadialGradient(0.4, 0.3, 1, [{
offset: 0,
color: '#FF4500'
}, {
offset: 1,
color: '#FFFF00'
}])
}
},
zlevel: 1,
label: {
emphasis: {
show: true,
formatter: function (param) {
return param.data[2];
},
position: 'top',
textStyle: {
color : '#FF4500'
}
}
}
}
]
};
myChart.setOption(option);
}
//标亮数据
function choseData(){
var chose = [];
if(null==chosex||null==chosey){
chosex = 1;
chosey = 100;
}
chose.push([chosex,chosey]);
return chose;
}
function trclick() {
for (var i = 1; i < tr.length; i++) {
tr[i].onclick = function clicktr() {
interleavecolor();
//重新加载一次隔行变色
this.style.background = "#FFFF00";
//被点击的变为黄色
var td = this.getElementsByTagName("td");
chosex = td[0].innerText*1;
chosey = td[1].innerText*1;
operationEcharts(); //重新运行Echarts
}
}
}
//隔行变色
function interleavecolor(){
for (j = 1; j < tr.length; j++) {
if(0 != j%2){
tr[j].style.background = "#F0FFF0";
}else{
tr[j].style.background = "#FFFAFA";
}
}
}
//如果点击echarts图
myChart.on('click', function (params) {
if(params.componentType == 'series') {
for (var k = 1; k < tr.length; k++) {
var tablex = String(tr[k].children[0].innerHTML); // 表格中的x轴
var tabley = String(tr[k].children[1].innerHTML); // 表格中的y轴
var chartx = String(params.data[0]);// 散点中的x轴
var charty = String(params.data[1]);// 散点中的y轴
if(tablex == chartx && tabley == charty) {
interleavecolor();
// 控制页面滚动到指定位置
tr[k].scrollIntoView();
tr[k].style.background = "#FFFF00";
// 对应行变为黄色
chosex = params.data[0];
chosey = params.data[1];
operationEcharts();//重新加载echarts视图
trclick();
break;
}
}
}
});
</script>
</body>
</html>
如果你觉得写的不错请点赞,欢迎与我交流学习,谢谢!
转载请表明原出处:http://www.cnblogs.com/liebagefly/p/7961734.html 谢谢!
用echartsjs 实现散点图与table表格双向交互,以及实现echarts取自于table数据,和自定义echarts提示内容的更多相关文章
- 在table表格中实现圆角效果
在table中设置border-radius发现不起作用,网上查找了一番,原因是border-collapse:collapse和border-radius不兼容. 设计图效果 代码实现效果: < ...
- 将Highcharts图表数据生成Table表格
有的时候,我们不仅仅需要漂亮的统计图来显示统计结果,还需要在统计图下方一个表格可以更加直观的展现各类数据.既然统计图都显示出来了,那我们可以根据统计图的各元素生成表格了. 首先,先显示统计图. Htm ...
- Vue + Element-ui实现后台管理系统(5)---封装一个Form表单组件和Table表格组件
封装一个Form表单组件和Table组件 有关后台管理系统之前写过四遍博客,看这篇之前最好先看下这四篇博客.另外这里只展示关键部分代码,项目代码放在github上: mall-manage-syste ...
- [转]CSS如何设置html table表格边框样式
原文地址:http://www.divcss5.com/wenji/w503.shtml 对table设置css样式边框,分为几种情况: 1.只对table设置边框 2.对td设置边框 3.对tabl ...
- JS组件系列——Bootstrap Table 表格行拖拽
前言:之前一直在研究DDD相关知识,好久没更新JS系列文章了.这两天做了一个简单的业务需求,觉得效果还可以,今天在这里分享给大家,欢迎拍砖~~ 一.业务需求及实现效果 项目涉及到订单模块,那天突然接到 ...
- JS组件系列——Bootstrap Table 表格行拖拽(二:多行拖拽)
前言:前天刚写了篇JS组件系列——Bootstrap Table 表格行拖拽,今天接到新的需要,需要在之前表格行拖拽的基础上能够同时拖拽选中的多行.博主用了半天时间研究了下,效果是出来了,但是感觉不尽 ...
- MiniUI动态添加table表格
本文将介绍一下,如何用Jquery MiniUi动态添加一行table表格 1.效果展示 ↓ 2.具体代码 <script type="text/javascript"> ...
- table表格宽度固定,同时td内容过长也不会被撑开
table表格宽度固定,同时td内容过长也不会被撑开,设置如下css: table{table-layout:fixed;word-break:break-all;}
- [转]jQuery实现清空table表格除首行外的所有数据
1.其实网上有很多版本,试了好几个都不行,最后还是查到了一个非常方便的:不会清除表格第一行表头部分. 其中J_tab_fam是table的id. 1 $("#J_tab_fam tr:no ...
随机推荐
- 表单处理的方案与注意事项(servlet)
摘要 表单是后端程序员用的与接触最多的,我这里例举了常用处理办法,与注意事项 sevlet处理代码 package myform; import java.io.IOException; import ...
- 在centos7上实现LAMP的全过程及实现wordpress
原理 http使用方法一编译安装,php独立服务fpm实现. 软件版本 在本次实验中,我们需要用到的软件版本如下: apr-1.6.2 apr-util-1.6.0 httpd-2.4.28 mari ...
- SpringMVC 配置
1.在WEB-INF\web.xml中定义前端控制器 <servlet> <servlet-name>springmvc</servlet-name> <se ...
- Ubuntu/deppin 系统安装Nginx
Ubuntu/deppin 系统安装Nginx 添加密钥 打开Nginx官网 ,并找到如下位置: 在桌面新建"nginx_signing.key"文件,文件内容为请点击图1中的标注 ...
- Maven 设置Maven源/镜像
在Eclipse/ InteliJ Idea使用Maven时,企业提供的本地仓库经常有些Jar包下载不下来,所以.配置Maven设置国内镜像对开发人员来说是必不可少的.今天写一篇自己配制的Maven镜 ...
- 视觉词袋模型(BOVW)
一.介绍 Bag-of-words model (BoW model) 最早出现在神经语言程序学(NLP)和信息检索(IR)领域. 该模型忽略掉文本的语法和语序, 用一组无序的单词(words)来表达 ...
- 独热编码OneHotEncoder简介
在分类和聚类运算中我们经常计算两个个体之间的距离,对于连续的数字(Numric)这一点不成问题,但是对于名词性(Norminal)的类别,计算距离很难.即使将类别与数字对应,例如{'A','B','C ...
- JQ编写楼层效果
<!DOCTYPE html><html> <head> <meta charset="UTF-8"> <title>& ...
- Leetcode题解(十九)
54.Spiral Matrix 题目: 题目意思很简单,就是螺旋式访问矩阵元素.也没有比较经典的算法可以解决此题,只需要模拟一下这个过程即可. 代码如下: class Solution { publ ...
- 离散型特征编码方式:one-hot与哑变量
在机器学习问题中,我们通过训练数据集学习得到的其实就是一组模型的参数,然后通过学习得到的参数确定模型的表示,最后用这个模型再去进行我们后续的预测分类等工作.在模型训练过程中,我们会对训练数据集进行抽象 ...