如何在已有图形上方绘制图形?多层矩形图层仅显示一层问题求助
解决D3叠放条形图只显示一层的问题
嘿,我看你在D3里尝试在“短且宽”的底层矩形上方绘制另一层条形图,但结果只显示一层,这情况我做可视化时也踩过坑,大概率是这几个原因导致的,咱们一步步排查:
1. 图层绘制顺序搞反了
D3是按代码的先后顺序渲染SVG元素的——后画的元素会覆盖先画的。如果你先画了上层的条形,再画底层的“短宽”矩形,那底层就会把上层完全盖住,自然只能看到一层。
解决办法:先绘制底层(短宽的矩形),再绘制上层的条形,让上层叠在上面。
2. 数据绑定或属性计算错误
从你给出的数据来看,每个条目有Deliciousness和new两个数值,得确保两层图形的x、y、width、height属性都计算正确,不然要么位置不对,要么尺寸为0导致看不见。
比如你需要先设置正确的比例尺,再分别给两层图形赋值:
// 补全你代码里缺失的部分 var margin = { top: 20, right: 20, bottom: 30, left: 40 }, w = 600 - margin.left - margin.right, h = 300 - margin.top - margin.bottom; var data = [{ "Food": "Apples", "Deliciousness": 9, "new": 4 }, { "Food": "Green Beans", "Deliciousness": 5, "new": 4 }, { "Food": "Egg Salad Sandwich", "Deliciousness": 4, "new": 4 }, { "Food": "Cookies", "Deliciousness": 10, "new": 4 }]; // 创建SVG容器 var svg = d3.select("body") .append("svg") .attr("width", w + margin.left + margin.right) .attr("height", h + margin.top + margin.bottom) .append("g") .attr("transform", "translate(" + margin.left + "," + margin.top + ")"); // 设置比例尺:x轴用序数比例尺处理食物分类,y轴用线性比例尺处理数值 var x = d3.scaleBand() .domain(data.map(d => d.Food)) .range([0, w]) .padding(0.1); var y = d3.scaleLinear() .domain([0, d3.max(data, d => Math.max(d.Deliciousness, d.new))]) .range([h, 0]); // 第一步:先画底层的短宽矩形(用new字段对应高度,宽度加宽) svg.selectAll(".bottom-bar") .data(data) .enter() .append("rect") .attr("class", "bottom-bar") .attr("x", d => x(d.Food) - (x.bandwidth() * 0.1)) // 向左偏移一点,让宽度更宽 .attr("y", y(0)) // 底部对齐坐标轴 .attr("width", x.bandwidth() * 1.2) // 比上层条形宽20% .attr("height", h - y(d.new)) // 高度对应new字段,更短 .attr("fill", "#e0e0e0"); // 浅灰色,和上层区分开 // 第二步:再画上层的条形(用Deliciousness字段) svg.selectAll(".top-bar") .data(data) .enter() .append("rect") .attr("class", "top-bar") .attr("x", d => x(d.Food)) .attr("y", d => y(d.Deliciousness)) .attr("width", x.bandwidth()) .attr("height", d => h - y(d.Deliciousness)) .attr("fill", "#42a5f5"); // 亮蓝色,突出显示
3. 额外排查点
- 检查样式:有没有给元素设置
opacity或fill-opacity为0,导致看不见? - 检查类名:两层图形要设置不同的类名(比如
.bottom-bar和.top-bar),不然selectAll会选中已有的元素,导致数据绑定错误。
内容的提问来源于stack exchange,提问作者santoku
相关产品推荐
相关产品推荐

