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

如何修改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>

关键修改说明

  1. 圆角实现:通过CSS为条形添加rx和ry属性,实现圆角效果
  2. Y轴修正:将Y轴域设置为分类标签,避免数值导致的布局错误
  3. 百分比标签:调整文本位置到条形右侧,内容改为百分比格式,并通过dy确保垂直居中
  4. 布局优化:增加右侧边距容纳百分比文本,移除不必要的左侧Y轴

内容的提问来源于stack exchange,提问作者The Old County

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 20:26:07