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

如何在D3力导向仿真中实现节点悬停显示文本?(已完成CSV解析)

解决D3 v3力导向图节点悬停显示文本的问题

我来帮你搞定这个节点悬停显示文本的问题!在D3 v3里实现tooltip其实很简单,咱们结合你的代码一步步调整:

首先,你需要先创建一个隐藏的tooltip容器,然后给节点绑定鼠标事件来控制它的显示、隐藏和内容。以下是补全并修改后的完整代码:

<!DOCTYPE html>
<meta charset="utf-8">
<style>
.link { stroke: #000; stroke-width: 1.5px; }
.node { stroke: #fff; stroke-width: 1.5px; cursor: pointer; }
/* 给tooltip设置样式 */
.tooltip {
  position: absolute;
  background-color: rgba(0,0,0,0.8);
  color: white;
  padding: 5px 10px;
  border-radius: 4px;
  font-size: 12px;
  pointer-events: none; /* 避免tooltip干扰鼠标事件 */
  display: none;
}
</style>
<body>
<script src="http://d3js.org/d3.v3.min.js" charset="utf-8"></script>
<script>
var width = 960, height = 500;

// 创建SVG容器
var svg = d3.select("body").append("svg")
    .attr("width", width)
    .attr("height", height);

// 创建tooltip容器
var tooltip = d3.select("body").append("div")
    .attr("class", "tooltip");

// 加载并处理CSV数据
d3.csv("your-data.csv", function(error, data) {
  if (error) throw error;

  // 替换成你的实际节点/链接数据处理逻辑
  var nodes = data;
  var links = [];

  // 初始化力导向图布局
  var force = d3.layout.force()
      .nodes(nodes)
      .links(links)
      .size([width, height])
      .linkDistance(50)
      .charge(-100)
      .start();

  // 创建链接元素
  var link = svg.selectAll(".link")
      .data(links)
      .enter().append("line")
      .attr("class", "link");

  // 创建节点元素并绑定交互事件
  var node = svg.selectAll(".node")
      .data(nodes)
      .enter().append("circle")
      .attr("class", "node")
      .attr("r", 10)
      .style("fill", function(d) { return "#" + Math.floor(Math.random()*16777215).toString(16); })
      .call(force.drag)
      // 鼠标悬停显示tooltip
      .on("mouseover", function(d) {
        tooltip.style("display", "block")
            .text(d.name) // 替换成你CSV里的实际文本字段,比如d.id、d.value
            .style("left", (d3.event.pageX + 10) + "px")
            .style("top", (d3.event.pageY - 20) + "px");
      })
      // 鼠标离开隐藏tooltip
      .on("mouseout", function() {
        tooltip.style("display", "none");
      });

  // 力导向图tick事件,更新节点和链接位置
  force.on("tick", function() {
    link.attr("x1", function(d) { return d.source.x; })
        .attr("y1", function(d) { return d.source.y; })
        .attr("x2", function(d) { return d.target.x; })
        .attr("y2", function(d) { return d.target.y; });

    node.attr("cx", function(d) { return d.x; })
        .attr("cy", function(d) { return d.y; });
  });
});
</script>
</body>

关键修改点解释:

  1. 添加Tooltip样式:在CSS里定义了.tooltip类,设置了绝对定位、半透明背景和字体样式,初始状态为隐藏。
  2. 创建Tooltip容器:用d3.select("body").append("div")创建了一个全局的tooltip元素,专门用来承载悬停文本。
  3. 绑定鼠标交互事件:给节点添加了mouseover和mouseout事件:
    • mouseover时,显示tooltip,设置要展示的文本(记得替换成你CSV里的实际字段,比如d.id),并调整tooltip的位置(相对于鼠标坐标)。
    • mouseout时,隐藏tooltip。
  4. 节点交互提示:给节点添加了cursor: pointer样式,让用户直观知道这个元素可交互。

小提示:

如果需要显示多行文本或HTML格式内容,可以把.text()换成.html(),比如.html("<strong>节点ID:</strong> " + d.id + "<br>名称: " + d.name)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 03:45:43