如何修改D3.js单系列水平条形图为带圆角和侧边百分比样式?
解决方案
针对需求,我们需要对现有D3.js代码做以下关键修改:
- 修正Y轴比例尺逻辑,确保单个条形正确布局
- 为条形添加圆角效果
- 在条形侧边显示百分比数值
- 移除冗余元素,优化布局空间
修改后的完整代码
<html> <head> <title>单条圆角条形图</title> <script src="https://d3js.org/d3.v4.min.js" charset="utf-8"></script> <style> .bar { rx: 10; ry: 10; } .percentage-label { font-size: 14px; fill: #333; } </style> </head> <body> <script> d3.select("body").selectAll('svg').remove(); var data = [{"label": "Toblerone", "value": 70}]; var w = 280, h = 80; var color = d3.scaleOrdinal().range(['#046395']); data.forEach(function(d) { d.total = +d.value; }); var margin = {top: 20, right: 40, bottom: 20, left: 20}; var width = w - margin.left - margin.right; var height = h - margin.top - margin.bottom; // X轴设为0-100的百分比范围 var x = d3.scaleLinear().range([0, width]).domain([0, 100]); // Y轴使用分类值确保单个条形居中 var y = d3.scaleBand().range([height, 0]).padding(0.1).domain([data[0].label]); var svg = d3.select("body") .append("svg") .attr("width", width + margin.left + margin.right) .attr("height", height + margin.top + margin.bottom) .append("g") .attr('class', 'barchart') .attr("transform", "translate(" + margin.left + "," + margin.top + ")"); var bars = svg.append('g').attr('class', 'bars'); // 绘制带圆角的条形 bars.selectAll(".bar") .data(data) .enter().append("rect") .attr("class", "bar") .attr('fill', function(d, i) { return color(i); }) .attr("width", function(d) { return x(d.total); }) .attr("y", function(d) { return y(d.label); }) .attr("height", y.bandwidth()); // 添加百分比标签 bars.selectAll(".percentage-label") .data(data) .enter().append("text") .attr("class", "percentage-label") .attr('text-anchor', 'start') .attr("x", function(d) { return x(d.total) + 10; }) .attr("y", function(d) { return y(d.label) + y.bandwidth() / 2; }) .attr("dy", "0.35em") .text(function(d) { return d.value + "%"; }); // 可选:保留X轴作为百分比参考 bars.append("g") .attr("transform", "translate(0," + height + ")") .call(d3.axisBottom(x).ticks(5)); </script> </body> </html>
关键修改说明
- 圆角实现:通过CSS为条形添加
rx和ry属性,实现圆角效果 - Y轴修正:将Y轴域设置为分类标签,避免数值导致的布局错误
- 百分比标签:调整文本位置到条形右侧,内容改为百分比格式,并通过
dy确保垂直居中 - 布局优化:增加右侧边距容纳百分比文本,移除不必要的左侧Y轴
内容的提问来源于stack exchange,提问作者The Old County
相关产品推荐
相关产品推荐

