无法为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
相关产品推荐
相关产品推荐

