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

如何在D3.js中使用画笔工具替代矩形刷选散点图数据?

实现D3.js非矩形画笔选择散点图数据

一、切换为圆形刷选

D3内置了圆形刷选工具 d3.brushCircle(),直接替换默认的 d3.brush() 即可实现圆形区域选择:

// 替换原有矩形刷为圆形刷
svg
  .call(d3.brushCircle()
    .extent([[0, 0], [width, height]]) // 刷选范围仍覆盖整个图表区域
    .on("start brush", updateChart)    // 触发逻辑保持不变
  )

在你的 updateChart 函数中,可通过 d3.event.selection 获取圆形的中心坐标与半径,以此筛选数据:

function updateChart() {
  const selection = d3.event.selection;
  if (!selection) return; // 无选择时直接返回

  // selection 格式为 [圆心x, 圆心y, 半径]
  const [cx, cy, radius] = selection;
  
  // 筛选出圆形区域内的散点
  const selectedPoints = data.filter(d => {
    const dx = d.x - cx;
    const dy = d.y - cy;
    return Math.sqrt(dx * dx + dy * dy) <= radius;
  });

  // 这里添加选中数据的后续处理(比如高亮、统计等)
}

二、实现自由套索刷选

如果需要自由手绘的套索选择,D3没有内置工具,可通过监听鼠标事件结合几何判断实现:

let isDrawing = false;
let lassoPoints = [];

// 绑定鼠标事件实现套索绘制
svg
  .on("mousedown", (event) => {
    isDrawing = true;
    const [x, y] = d3.pointer(event);
    lassoPoints = [[x, y]];
  })
  .on("mousemove", (event) => {
    if (!isDrawing) return;
    const [x, y] = d3.pointer(event);
    lassoPoints.push([x, y]);

    // 实时绘制套索预览路径
    svg.select(".lasso-preview").remove();
    svg.append("path")
      .attr("class", "lasso-preview")
      .attr("d", d3.line()(lassoPoints))
      .attr("stroke", "#333")
      .attr("fill", "none")
      .attr("stroke-width", 2);
  })
  .on("mouseup", () => {
    isDrawing = false;
    if (lassoPoints.length < 3) { // 至少3个点构成闭合区域
      svg.select(".lasso-preview").remove();
      return;
    }
    // 闭合套索路径
    lassoPoints.push(lassoPoints[0]);

    // 使用d3.polygonContains判断点是否在套索内
    const selectedPoints = data.filter(d => {
      return d3.polygonContains(lassoPoints, [d.x, d.y]);
    });

    // 处理选中数据,清除预览路径
    svg.select(".lasso-preview").remove();
    // 这里添加选中数据的后续处理逻辑
  });

注意:如果使用的是模块化引入的D3,需要单独导入 d3-polygon 模块以使用 d3.polygonContains 方法。

三、核心说明

  • 官方提供的 d3.brushRect()(即默认的 d3.brush())和 d3.brushCircle() 是最稳定的标准刷选工具,优先推荐使用。
  • 自由套索适合高度自定义的场景,但需要自己处理鼠标事件和区域判断逻辑。
  • 无论哪种刷选方式,都要处理取消选择的情况(比如用户点击空白区域清除刷选)。

内容的提问来源于stack exchange,提问作者Jenan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 17:06:28