echarts学习2----地图的改造以及主图副图的联动

本文介绍如何使用ECharts创建北京地图并实现两个副图的数据联动。通过修改地图类型为北京,设置各区域数据,利用JavaScript监听地图选择事件,动态更新副图数据,实现了点击地图上任一区域能即时显示该区域详细数据的功能。
现在第二步要实现的是做一张北京的地图,并配上两个副图,网上有很多是中国地图的,只要把参数改成下面这样就可以变成北京的。


series: [
 
        {
 
            name:'降水量',
 
            type:'map',
 
            mapType:'北京',//这里就是改成北京地图的关键
 
            selectedMode: 'single',
 
            itemStyle: {
 
                normal: { label: { show:true },color:'blue' },// for legend
 
                emphasis: { label: { show:true} }
 
            },
 
            data: [//下面是从map.js里面找出来的各个区
 
                { name:'怀柔区',value:Math.round(Math.random() *1000) },
 
                { name:'房山区',value:Math.round(Math.random() *1000) },
 
                { name:'延庆县',value:Math.round(Math.random() *1000) },
 
                { name:'门头沟区',value:Math.round(Math.random() *1000) },
 
                { name:'昌平区',value:Math.round(Math.random() *1000) },
 
                { name:'大兴区',value:Math.round(Math.random() *1000) },
 
                { name:'顺义区',value:Math.round(Math.random() *1000) },
 
                { name:'平谷区',value:Math.round(Math.random() *1000) },
 
                { name:'通州区',value:Math.round(Math.random() *1000) },
 
                { name:'朝阳区',value:Math.round(Math.random() *1000) },
 
                { name:'海淀区',value:Math.round(Math.random() *1000) },
 
                { name:'石景山区',value:Math.round(Math.random() *1000) },
 
                { name:'西城区',value:Math.round(Math.random() *1000) },
 
                { name:'东城区',value:Math.round(Math.random() *1000) },
 
                { name:'崇文区',value:Math.round(Math.random() *1000) },

{ name:'密云县',value:Math.round(Math.random() *1000) },

{ name:'丰台区',value:Math.round(Math.random() *1000) }
 
            ]
 
        },


像上面那样就可以把地图改成的北京的,现在正在想,怎么搞那个什么副图。。。。。好像就是弄两个div 两个mychart,嗯,就是这样。。


首先巩固一下以前的知识点,我先把主的那个main的div给弄左边一点:
<div id="main"style="position:absolute;top:10px;left:10px;height:500px;width:500px;border:1px solid #ccc;padding:10px;"></div>
先弄成绝对定位,top和left  height和width 都要定义,这样就能控制位置。
   
然后添加两个副图的位置:
  <div id="sub1"style="position:absolute;top:10px;left:800px;height:250px;width:400px;border:1px solid #ccc;padding:10px;"></div>
   <div id="sub1"style="position:absolute;top:300px;left:800px;height:250px;width:400px;border:1px solid #ccc;padding:10px;"></div>


然后在function(ec)里面添加
var myChart=ec.init(document.getElementById('main'));
var myChart2=ec.init(document.getElementById('sub1'));
var myChart3=ec.init(document.getElementById('sub2'));
来引用这三个div


接着是后台数据获取的部分:

           var ecConfig= require('echarts/config');
            myChart.on(ecConfig.EVENT.MAP_SELECTED,function (param) 
{
var selected=param.selected;
var mapSeries=option.series[0];
  //alert(mapSeries.data.length);
                var data= [];
                var legendData= [];
                var name;
                for (var p=0,len=mapSeries.data.length; p<len; p++)
{

                    name=mapSeries.data[p].name;//先循环每一个县的名字
                    mapSeries.data[p].selected=selected[name];
                    //alert(selected[name]);只有查到选中的那个,这个才会是true
if (selected[name])
{
myChart2.setOption(option2[p]);//动态地改变两个副图的参数
myChart3.setOption(option3[p]);
                    }
                }
            }
);               

myChart.setOption(option);




通过上面的代码可以看到,基本上就是靠返回的P序号来确定点击的是北京市的哪个县,所以我就把每个县的option数据都存到一个数组里面,两个副图的option选项分别是option2 和option3。
Option2举例:
Option2=[{
    calculable : true,
    xAxis : 
[
        {
            type : 'category',
            data : ['周一','周二','周三','周四','周五','周六','周日']
        }
    ],
    yAxis : 
[
        {
            type : 'value',
            splitArea : {show : true}
        }
    ],
title: {
 
                    text:'怀柔区降水',
 
                    subtext:'单位:毫升',
 
                    x:'200px'
 
                },
    series :
[
{
            name:'怀柔区',
            type:'bar',
            stack: '总量',
            data:[320, 332, 301, 334, 390, 330, 320]
        }
    ]
},
{
    calculable : true,
    xAxis : 
[
        {
            type : 'category',
            data : ['周一','周二','周三','周四','周五','周六','周日']
        }
    ],
    yAxis : 
[
        {
            type : 'value',
            splitArea : {show : true}
        }
    ],
title: {
 
                    text:'房山区降水',
 
                    subtext:'单位:毫升',
 
                    x:'200px'
 
                },
    series :
[
{
            name:'房山区',
            type:'bar',
            stack: '总量',
            data:[102, 0, 31, 24, 0, 50, 20]
        }
    ]
}

];//这里我只列了两个,总的是有17个,对应每个地域


就这样一个一个存进数组里。

最后就像下面这样的效果:点击地图上的一个地方,其它两个副图可以联动显示相应地区的数据


 
<think>好的,我现在需要帮用户解决ECharts中多个联动并显示对应数据值的问题。首先,我得回想一下ECharts联动机制。记得可以通过connect功能将多个表的实例连接起来,这样在一个表中进行操作时,其他表也会响应。比如缩放、平移这些事件,用户提到的显示数据值可能是指当鼠标悬停在某个数据点时,所有联动表都高亮对应的数据。接下来,我需要考虑如何具体实现这个联动。首先,用户需要确保所有表都使用相同的groupID,这样在初始化的时候用connect方法将它们关联起来。然后,每个表实例的option中可能需要配置相同的dataset或者数据源,这样才能保证数据的一致性。不过用户可能希望显示对应的数据值,比如tooltip联动,这时候可能需要监听事件,比如'mouseover'或者'highlight'事件,然后在回调函数中触发其他表的高亮动作。然后,用户提到显示对应的数据值,可能需要自定义tooltip或者使用axisPointer来同步显示多个表中的数值。比如当在一个表中悬停某个点,其他表对应的点也会显示数值。这时候可能需要用到axisPointer的link属性,这个属性允许不同坐标轴的指针联动。不过需要确认ECharts的版本是否支持这个功能,可能需要较新的版本。 另外,用户可能遇到tooltip重叠的问题,尤其是在多个表放在同一页面的情况下。这时候可能需要调整tooltip的位置,或者使用grid布局来合理分配每个表的位置,避免legendtooltip的遮挡。参考之前提到的引用[1],使用grid来安排表的位置,同时处理legend的重叠问题。此外,引用[2]中的例子处理了多个y值的情况,可能对数据结构的处理有参考价值,但用户的问题更侧重于联动显示数据值,而不是多y值连线。 然后,我需要考虑如何展示代码示例。比如,首先创建多个表实例,将它们分配到同一个group,然后用connect方法连接。接着在每个表的option中配置dataset,确保数据一致。然后添加事件监听器,当某个表触发高亮时,其他表也执行对应的高亮操作。同时,可能需要配置tooltip的formatter函数,以显示跨表的数据信息。另外,用户可能需要多个表之间的数据点一一对应,比如折线柱状联动,当鼠标悬停在某个时间点时,两个表都显示该时间点的数据。这时候需要确保数据索引一致,或者在事件回调中根据数据找到对应的索引,再触发其他表的高亮。最后,总结步骤应该是:1)使用connect方法连接表;2)配置相同的groupdataset;3)监听事件并同步高亮tooltip;4)处理布局样式问题,如gridlegend的位置。同时,给出代码示例,展示如何实现这些步骤,并提示常见问题优化方法,比如性能考虑交互优化。</think>### ECharts联动显示数据值实现方法 --- #### 一、核心实现原理 1. **表组联动** 使用`echarts.connect()`方法将多个表绑定到同一组,实现视操作(缩放、平移)的同步[^1]。 关键代码: ```javascript const chart1 = echarts.init(dom1); const chart2 = echarts.init(dom2); echarts.connect([chart1, chart2]); // 建立联动组 ``` 2. **数据高亮同步** 通过监听`highlight`事件,在多个表间同步高亮状态: ```javascript chart1.on('highlight', function(params) { chart2.dispatchAction({ type: 'highlight', seriesIndex: params.seriesIndex, dataIndex: params.dataIndex }); }); ``` --- #### 二、完整实现步骤 1. **基础联动配置** ```javascript // 初始化表时指定同一组名 const chart1 = echarts.init(dom1, null, {group: 'dataGroup'}); const chart2 = echarts.init(dom2, null, {group: 'dataGroup'}); // 建立联动关系 echarts.connect('dataGroup'); ``` 2. **共享数据源配置** ```javascript const commonDataset = { source: [ ['日期', '销量', '库存'], ['2023-01', 150, 300], ['2023-02', 200, 250], ['2023-03', 180, 280] ] }; const option1 = { dataset: commonDataset, /* 其他配置 */ }; const option2 = { dataset: commonDataset, /* 其他配置 */ }; ``` 3. **增强型数据提示联动 ```javascript // 自定义tooltip内容 tooltip: { formatter: function(params) { const dataIndex = params.dataIndex; const chart2Data = chart2.getOption().series[0].data[dataIndex]; return `值: ${params.value}<br>值: ${chart2Data}`; } } ``` 4. **坐标轴指针联动(v5+)** ```javascript xAxis: { axisPointer: { link: [{xAxisIndex: 'all'}] } } ``` --- #### 三、典型应用场景示例 ```javascript // 折线与柱状联动 const option1 = { dataset: commonDataset, series: [{type: 'line'}], tooltip: {trigger: 'axis'} }; const option2 = { dataset: commonDataset, series: [{type: 'bar'}], tooltip: {trigger: 'axis'} }; // 添加联动事件 chart1.on('mouseover', function(params) { chart2.dispatchAction({ type: 'showTip', seriesIndex: 0, dataIndex: params.dataIndex }); }); ``` --- #### 四、常见问题解决方案 1. **数据索引不一致** 使用`convertToPixel`方法进行坐标转换: ```javascript chart1.on('mousemove', function(params) { const pointInGrid = chart2.convertToPixel('grid', params.offsetX, params.offsetY); chart2.dispatchAction({type: 'showTip', position: pointInGrid}); }); ``` 2. **性能优化** 对大数据量表启用`large: true`属性: ```javascript series: [{ type: 'line', large: true, progressive: 200 }] ``` ---
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值