本人研究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提示内容的更多相关文章

  1. 在table表格中实现圆角效果

    在table中设置border-radius发现不起作用,网上查找了一番,原因是border-collapse:collapse和border-radius不兼容. 设计图效果 代码实现效果: < ...

  2. 将Highcharts图表数据生成Table表格

    有的时候,我们不仅仅需要漂亮的统计图来显示统计结果,还需要在统计图下方一个表格可以更加直观的展现各类数据.既然统计图都显示出来了,那我们可以根据统计图的各元素生成表格了. 首先,先显示统计图. Htm ...

  3. Vue + Element-ui实现后台管理系统(5)---封装一个Form表单组件和Table表格组件

    封装一个Form表单组件和Table组件 有关后台管理系统之前写过四遍博客,看这篇之前最好先看下这四篇博客.另外这里只展示关键部分代码,项目代码放在github上: mall-manage-syste ...

  4. [转]CSS如何设置html table表格边框样式

    原文地址:http://www.divcss5.com/wenji/w503.shtml 对table设置css样式边框,分为几种情况: 1.只对table设置边框 2.对td设置边框 3.对tabl ...

  5. JS组件系列——Bootstrap Table 表格行拖拽

    前言:之前一直在研究DDD相关知识,好久没更新JS系列文章了.这两天做了一个简单的业务需求,觉得效果还可以,今天在这里分享给大家,欢迎拍砖~~ 一.业务需求及实现效果 项目涉及到订单模块,那天突然接到 ...

  6. JS组件系列——Bootstrap Table 表格行拖拽(二:多行拖拽)

    前言:前天刚写了篇JS组件系列——Bootstrap Table 表格行拖拽,今天接到新的需要,需要在之前表格行拖拽的基础上能够同时拖拽选中的多行.博主用了半天时间研究了下,效果是出来了,但是感觉不尽 ...

  7. MiniUI动态添加table表格

    本文将介绍一下,如何用Jquery MiniUi动态添加一行table表格 1.效果展示 ↓ 2.具体代码 <script type="text/javascript"> ...

  8. table表格宽度固定,同时td内容过长也不会被撑开

    table表格宽度固定,同时td内容过长也不会被撑开,设置如下css: table{table-layout:fixed;word-break:break-all;}

  9. [转]jQuery实现清空table表格除首行外的所有数据

    1.其实网上有很多版本,试了好几个都不行,最后还是查到了一个非常方便的:不会清除表格第一行表头部分. 其中J_tab_fam是table的id. 1 $("#J_tab_fam  tr:no ...

随机推荐

  1. 解析PHP多种序列化与反序列化的方法

    1. serialize和unserialize函数这两个是序列化和反序列化PHP中数据的常用函数. 复制代码 代码如下: <?php$a = array('a'=> 'Apple' ,' ...

  2. Java的继承、封装与多态

    Java的继承.封装与多态 基本概念 面向对象OO(Object Oriented):把数据及对数据的操作方法放在一起,作为一个相互依存的整体,即对象. 对同类对象抽象出共性,即类. 比如人就是一个类 ...

  3. spacemacs及python学习-坑之记录

    Table of Contents 1. spacemacs 1.1. .spacemacs 文件 1.2. 项目文件 1.3. open shell windows 1.4. emacs基础 1.4 ...

  4. DNS主从服务部署

    (1)节点信息 console01 主DNS 192.168.80.3 192.168.10.3 console02 从DNS 192.168.80.4 192.168.10.4 (2)环境部署 # ...

  5. SSM框架中的注解,配置和控制器相关笔记

    常规SSM实例 探索SSM理论的前提,应该是在对框架基础的运作方式有一定了解,以下是个人Android后台项目,用SSM框架快速搭建,以下是代码,主要 观察结构. 代码结构: model实体类 Ida ...

  6. 交换知识 VLAN VTP STP 单臂路由

    第1章 交换基础 1.1 园区网分层结构 层次 作用 出口层 广域网接入 出口策略 带宽控制 核心层 高速转发 服务器接入 路由选择 汇聚层 流量汇聚 链路冗余 设备冗余 路由选择 接入层 用户接入 ...

  7. NumPy基础练习(练一遍搞定NumPy)

    import numpy as np import pandas as pd from numpy import random from numpy.random import randn ##### ...

  8. 利用quartz实现定时调度

    1.Quartz是OpenSymphony开源组织在Job scheduling领域又一个开源项目,它可以与J2EE与J2SE应用程序相结合也可以单独使用.这里我介绍quartz的两种方式.我这里搭建 ...

  9. c++学习笔记---02---从一个小程序说起

    从一个小程序说起 这一讲的主要目的是帮助大家在C语言的背景知识上与C++建立联系. 问题探索 问题:对一个整型数组求和. 要求:定义一个存储着 n 个元素的数组,要求用C语言完成这个任务. 赶紧的:大 ...

  10. ⑾bootstrap组件 徽章 大屏 页头 基础案例

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...