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

无法为D3条形图添加tooltip?求技术解决办法

解决D3.js条形图添加d3-tip tooltip的问题

你的代码里d3-tip没生效是因为几个关键步骤缺失,以下是完整修复方案:

1. 核心缺失点说明

  • 未完成tip的初始化与容器绑定
  • 未给条形绑定tooltip触发事件
  • 缺少d3-tip必需的CSS样式

完整修正代码

JavaScript(修复后)

import * as d3 from "d3";
import d3Tip from "d3-tip";
d3.tip = d3Tip;

// DATA //
let data = [
  { Technology: "Hydropower", Size: 33, Carbon: 350 },
  { Technology: "Coal", Size: 15, Carbon: 754 },
  { Technology: "Ground PV", Size: 19, Carbon: 905 },
  { Technology: "Large Hydropower", Size: 14, Carbon: 142 },
  { Technology: "Roof Solar", Size: 3, Carbon: 263 },
  { Technology: "Nuclear", Size: 0.3, Carbon: 475 },
  { Technology: "Ethanol", Size: 50.3, Carbon: 374 },
  { Technology: "Onshore Wind", Size: 0.4, Carbon: 224 }
];

// PLOTTING //
const svg = d3.select("svg"),
  margin = { top: 100, right: 20, bottom: 100, left: 20 },
  width = svg.attr("width") - margin.left - margin.right,
  height = svg.attr("height") - margin.top - margin.bottom;

const xScale = d3.scaleBand().range([0, width]).padding(0.4),
  yScale = d3.scaleLinear().range([height, 0]);

const g = svg.append("g")
  .attr("transform", "translate(" + 100 + "," + 100 + ")");

// 初始化d3-tip
const tip = d3.tip()
  .attr("class", "d3-tip")
  .offset([-10, 0]) // 设置偏移避免与条形重叠
  .html(function(d) {
    return `<strong>技术:</strong> <span style="color:#fff">${d.Technology}</span><br/>
            <strong>Size:</strong> <span style="color:red">${d.Size} kW</span>`;
  });

// 将tip绑定到图表容器
g.call(tip);

xScale.domain(data.map(d => d.Technology));
yScale.domain([0, d3.max(data, d => d.Size)]);

// 绘制X轴
g.append("g")
  .attr("transform", "translate(0," + height + ")")
  .call(d3.axisBottom(xScale));

// 绘制Y轴
g.append("g")
  .call(d3.axisLeft(yScale)
    .tickFormat(d => d + " kW")
    .ticks(10))
  .append("text")
  .attr("y", 6)
  .attr("dy", "0.71em")
  .attr("text-anchor", "end");

// X轴标题
g.append("text")
  .attr("transform", "translate(" + width / 2 + " ," + (height + 40) + ")")
  .style("text-anchor", "middle")
  .text("Technology");

// Y轴标题
g.append("text")
  .attr("transform", "rotate(-90)")
  .attr("x", 0 - height / 2)
  .attr("y", 0 - margin.left - 40)
  .style("text-anchor", "middle")
  .text("Size (kW)");

// 绘制条形并绑定tooltip事件
g.selectAll(".bar")
  .data(data)
  .enter()
  .append("rect")
  .attr("class", "bar")
  .attr("x", d => xScale(d.Technology))
  .attr("y", d => yScale(d.Size))
  .attr("width", xScale.bandwidth())
  .attr("height", d => height - yScale(d.Size))
  .on("mouseover", tip.show)
  .on("mouseout", tip.hide);

HTML(修复后)

<!DOCTYPE html>
<html>
<head>
  <link rel="stylesheet" href="style.css" />
  <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Sofia">
  <title>Land Usage Comparison</title>
  <meta charset="UTF-8" />
</head>
<body>
  <header>
    <h1>Land Usage Comparison</h1>
    <p name="valueX" id="landusage">
      <label><input type="checkbox" name="elecprod" value="1" /><span>Electricity Produced</span></label>
      <label><input type="checkbox" name="carbonemissions" value="2" /><span>Carbon Emissions</span></label>
    </p>
  </header>
  <svg width="960" height="600"></svg>
  <script type="module" src="land.js"></script>
</body>
</html>

style.css(新增)

/* d3-tip基础样式 */
.d3-tip {
  line-height: 1.5;
  padding: 8px 12px;
  background: rgba(0, 0, 0, 0.9);
  color: #fff;
  border-radius: 4px;
  pointer-events: none;
  font-size: 14px;
}

/* 顶部箭头样式 */
.d3-tip.n:after {
  content: "\25BC";
  position: absolute;
  top: 100%;
  left: 50%;
  transform: translateX(-50%);
  color: rgba(0, 0, 0, 0.9);
  font-size: 10px;
}

关键修复说明

  • 新增g.call(tip):将tooltip绑定到图表容器,这是d3-tip生效的核心步骤
  • 添加offset属性:控制tooltip与鼠标的偏移距离,避免遮挡条形
  • 绑定鼠标事件:给每个条形添加mouseover和mouseout事件,触发tooltip的显示/隐藏
  • 补充CSS样式:确保tooltip可见且样式美观,包括背景、文字颜色和箭头

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 03:40:29