经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » HTML/CSS » CSS » 查看文章
Echarts实现图表联动(多图联动、图表间联动)
来源:cnblogs  作者:石宏建  时间:2021/3/8 14:48:23  对本文有异议

Echarts实现图表联动(多图联动、图表间联动)

一、背景

Echarts.js目前已经提供了connect功能,只要图标的legend一样,那么就能实现联动。
下面两个链接是介绍Echarts connect的用法的。

ECharts 联动效果

官方文档中connect的使用方法

二、原始例子

通过重新绘制

官方文档提供的案列

在这个样例中,随着鼠标在坐标轴上的移动,饼图会不断的变化,其关键在于这一段代码。

  1. myChart.on('updateAxisPointer', function (event) {
  2. var xAxisInfo = event.axesInfo[0];
  3. if (xAxisInfo) {
  4. var dimension = xAxisInfo.value + 1;
  5. myChart.setOption({
  6. series: {
  7. id: 'pie',
  8. label: {
  9. formatter: '{b}: {@[' + dimension + ']} ({d}%)'
  10. },
  11. encode: {
  12. value: dimension,
  13. tooltip: dimension
  14. }
  15. }
  16. });
  17. }
  18. });

本质上是通过鼠标事件,不断获取xAxisInfo,然后根据获取到的xAxisInfo.value(dimension)重新绘制饼图。这个可视化过程中数据是以数据集形式呈现的,所以用的encode,具体介绍可以在如何使用 dataset 管理数据看到。

如果要看event都有什么,通过console.log(event)即可获取,比如一道第一个横轴坐标2012时,输出内容如下,其value为0.

通过事件

Echarts实践介绍

轮流高亮例子

其关键在于

  1. myEcart.dispatchAction({
  2. type:'highlight',
  3. seriesIndex:0,
  4. dataIndex:app.currentIndex
  5. });

Echarts的action还有很多,在echarts官网的API中可以输入action进行检索。

之所以可以使用这个实现多图的联动,实质是一个图上发生鼠标移动事件后,调用另一个图,使其产生动作。比如myechart1和myechart2,如果获取到了myechart1的params信息,通过这些信息可以对应到myechart2的dataIndex、SeriesIndex,那么,就可以使用这样的形式实现联动。

三、 实现方法

记住这两个东西就好

myEchart.setOption \\ 重新绘制

myEchart.dispatchAction \\echarts action

四、 具体例子

以下是一个对原始例子进行的一些改进之后的效果图:

全部源码如下:

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8">
  5. <title>ECharts</title>
  6. <!-- 引入 echarts.js -->
  7. <script src="echarts.min.js"></script>
  8. </head>
  9. <body>
  10. <!-- 为ECharts准备一个具备大小(宽高)的Dom -->
  11. <div id="main" style="width: 900px;height:600px;"></div>
  12. <script type="text/javascript">
  13. // 基于准备好的dom,初始化echarts实例
  14. var myChart = echarts.init(document.getElementById('main'));
  15. // 指定图表的配置项和数据
  16. var option = {
  17. legend: {},
  18. tooltip: {
  19. //trigger: 'axis',
  20. showContent: false,
  21. },
  22. dataset: {
  23. source: [
  24. ['product', '2012', '2013', '2014', '2015', '2016', '2017'],
  25. ['Matcha Latte', 41.1, 30.4, 65.1, 53.3, 83.8, 98.7],
  26. ['Milk Tea', 86.5, 92.1, 85.7, 83.1, 73.4, 55.1],
  27. ['Cheese Cocoa', 24.1, 67.2, 79.5, 86.4, 65.2, 82.5],
  28. ['Walnut Brownie', 55.2, 67.1, 69.2, 72.4, 53.9, 39.1]
  29. ]
  30. },
  31. xAxis: {type: 'category',
  32. triggerEvent: true,
  33. //axisPointer: {show:true}
  34. },
  35. yAxis: {gridIndex: 0},
  36. grid: {top: '55%'},
  37. series: [
  38. {type: 'line', smooth: true, seriesLayoutBy: 'row', symbolSize: 10},
  39. {type: 'line', smooth: true, seriesLayoutBy: 'row', symbolSize: 10},
  40. {type: 'line', smooth: true, seriesLayoutBy: 'row', symbolSize: 10},
  41. {type: 'line', smooth: true, seriesLayoutBy: 'row', symbolSize: 10},
  42. {
  43. type: 'pie',
  44. id: 'pie',
  45. radius: '30%',
  46. center: ['50%', '25%'],
  47. label: {
  48. formatter: '{b}: {@[2012]} ({d}%)'
  49. },
  50. encode: {
  51. itemName: 'product',
  52. value: '2012',
  53. tooltip: '2012'
  54. }
  55. }
  56. ]
  57. };
  58. setTimeout(function () {
  59. myChart.on('mouseover',function(params){
  60. if(params.componentType == "xAxis"){
  61. var xAxisInfo = params.value;
  62. myChart.setOption({
  63. series: {
  64. id: 'pie',
  65. label: {
  66. formatter: '{b}: {@[' + xAxisInfo + ']} ({d}%)'
  67. },
  68. encode: {
  69. value: xAxisInfo,
  70. tooltip: xAxisInfo
  71. }
  72. }
  73. });
  74. }
  75. if(params.componentType == "series" && params.seriesType == 'line'){
  76. var xAxisInfo = params.value[0];
  77. myChart.setOption({
  78. series: {
  79. id: 'pie',
  80. label: {
  81. formatter: '{b}: {@[' + xAxisInfo + ']} ({d}%)'
  82. },
  83. encode: {
  84. value: xAxisInfo,
  85. tooltip: xAxisInfo
  86. }
  87. }
  88. });
  89. }
  90. setTimeout(function(){
  91. myChart.dispatchAction({
  92. type: 'highlight',
  93. seriesIndex: 4,
  94. dataIndex: params.seriesIndex
  95. });
  96. },300);
  97. });
  98. myChart.on('mouseout',function(params){
  99. myChart.dispatchAction({
  100. type: 'downplay',
  101. seriesIndex: 4,
  102. dataIndex: params.seriesIndex
  103. });
  104. });
  105. },0);
  106. // 使用刚指定的配置项和数据显示图表。
  107. myChart.setOption(option);
  108. </script>
  109. </body>
  110. </html>

那两个if主要是用于获取信息,如果不是两个图画在同一个myEchart里其实没有那么麻烦,实际上可以忽略不看。鼠标移动到某一和线图的点的时候,并图中对应的块将会高亮。

实现的关键在于通过鼠标事件,获取到了params的相关信息,通过

  1. myChart.dispatchAction({
  2. type:'highlight',
  3. seriesIndex:'4',
  4. dataIndex:params.seriesIndex
  5. });

实现饼图部分的高亮。这个例子中两个图是在同一个myechart中,如果我们画在两个不同的图像中如何实现高亮呢?

简化来写就是这样

  1. myChart1.on('mouseover',function(params){
  2. myChart2.dispatchAction({
  3. type:'highlight',
  4. seriesIndex:4,
  5. dataIndex:params.seriesIndex
  6. });
  7. });

具体需要根据params的对应情况来实行高亮。

原文链接:http://www.cnblogs.com/orint/p/14499333.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号