You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何设置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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 04:25:34