如何设置ECharts散点图SymbolSize随Datazoom缩放动态变化
问题描述
我希望ECharts散点图的SymbolSize在Datazoom放大时变大、缩小时变小,但默认设置下,通过自定义函数计算的SymbolSize为固定值,不会随缩放操作改变。
当前散点图配置如下:
{ name: '128025', data: data[5], type: 'scatter', yAxisIndex:0, symbolSize: function (data) { return (data[2]*data[1])/50000+5 ; }, color:'#5470c6', symbol:'path://M5822 5148 c-404 -774 -1262 -2462 -1258 -2474 8 -21 2704 -21 2712 0 7 19 -1340 2620 -1359 2624 -11 2 -39 -43 -95 -150z m413 -1535 c215 -256 391 -471 393 -477 2 -10 -76 -62 -82 -54 -58 80 -703 858 -712 858 -7 0 -84 -105 -171 -233 l-158 -233 -40 12 c-22 6 -39 16 -38 21 3 14 406 573 412 572 3 0 182 -210 396 -466z', }
我曾尝试使用custom类型绘制矩形,该实现可随缩放改变尺寸,相关代码如下:
自定义渲染函数:
function renderItem(params, api) { var categoryIndex = api.value(1); var start = api.coord([api.value(0), categoryIndex]); var height = api.size([api.value(3)-api.value(0), api.value(2)/100]); //console.log(start,end); // console.log(params); console.log(start,height); var ret = { type :'rect', shape:{ x:start[0],y:start[1],width:height[0],height:height[1] }, style:{ fill:'#91cc75', opacity:0.2 } }; return ret; }
custom系列配置:
{ type: 'custom', renderItem: renderItem, itemStyle: { opacity: 0.1 }, encode: { x: 0, y: 1 }, data: data[10], silent:true, }
请问如何修改散点图的配置,使其实现与上述custom类型相同的随缩放动态改变尺寸的效果?
解决方案
散点图的symbolSize函数默认仅在初始化和数据更新时执行,不会响应dataZoom的缩放变化。要实现随缩放动态调整尺寸,可通过以下两种方式处理:
方式一:监听dataZoom事件实时更新symbolSize
给ECharts实例绑定datazoom事件,在缩放触发时重新计算每个点的symbolSize并更新图表:
// 假设myChart是你的ECharts实例 myChart.on('datazoom', function () { // 获取当前x轴的缩放范围与原始范围 var xAxisModel = myChart.getModel().getComponent('xAxis'); var xScale = xAxisModel.axis.scale; var currentRange = xScale.getExtent(); var originalRange = [xScale.min, xScale.max]; // 计算缩放系数,原始范围与当前范围的比值越大,代表缩放程度越高 var scaleRatio = (originalRange[1] - originalRange[0]) / (currentRange[1] - currentRange[0]); // 更新散点图的symbolSize,基于缩放系数调整尺寸 myChart.setOption({ series: [{ name: '128025', symbolSize: function(data) { // 原计算值乘以缩放系数,实现放大时尺寸变大,缩小时尺寸变小 return ((data[2]*data[1])/50000 + 5) * scaleRatio; } }] }); });
注意:需确保originalRange是坐标轴的初始范围,避免每次缩放都基于上一次的范围计算导致系数偏差。
方式二:改用custom系列模拟散点(推荐)
利用custom系列的renderItem会在每次重绘(包括缩放)时执行的特性,直接修改renderItem函数绘制自定义形状的散点,替代原scatter系列:
function renderItem(params, api) { // 获取数据中的x、y值 var x = api.value(0); var y = api.value(1); // 将数据值转换为画布坐标 var coord = api.coord([x, y]); // 基于数据计算基础尺寸 var baseSize = (api.value(2)*api.value(1))/50000 + 5; // 使用api.size将数值转换为像素,确保尺寸随缩放动态变化 var size = api.size([baseSize, baseSize])[0]; return { type: 'path', shape: { pathData: 'M5822 5148 c-404 -774 -1262 -2462 -1258 -2474 8 -21 2704 -21 2712 0 7 19 -1340 2620 -1359 2624 -11 2 -39 -43 -95 -150z m413 -1535 c215 -256 391 -471 393 -477 2 -10 -76 -62 -82 -54 -58 80 -703 858 -712 858 -7 0 -84 -105 -171 -233 l-158 -233 -40 12 c-22 6 -39 16 -38 21 3 14 406 573 412 572 3 0 182 -210 396 -466z', x: coord[0] - size/2, y: coord[1] - size/2, width: size, height: size }, style: { fill: '#5470c6' } }; }
更新custom系列配置,替换原scatter系列的数据源和样式:
{ type: 'custom', renderItem: renderItem, encode: { x: 0, y: 1 }, data: data[5], silent: false // 需要交互时设为false }
这种方式无需额外监听事件,依赖ECharts自身的重绘机制,实现更稳定。
内容的提问来源于stack exchange,提问作者GainLos
相关产品推荐
相关产品推荐

