无法将文本添加到d3水平条

斯巴达93

我正在使用以下水平条形图(http://bl.ocks.org/juan-cb/ab9a30d0e2ace0d2dc8c),它会根据一些选择进行更新。我正在尝试将标签添加到条形图,以在每个条形图内显示值。不知道我要去哪里错了。我最初有SVG rect元素,我将其归类为“ g”元素,并尝试了这种方法,但仍然没有运气。任何帮助将不胜感激!

JsFiddle- https: //jsfiddle.net/b772s5mg/3/

JS

  datasetTotal = [
        {label:"Category 1", value:19},
        {label:"Category 2", value:5},
        {label:"Category 3", value:13},
        {label:"Category 4", value:17},
        {label:"Category 5", value:21},
        {label:"Category 6", value:25}
    ];

    datasetOption1 = [
        {label:"Category 1", value:22},
        {label:"Category 2", value:33},
        {label:"Category 3", value:4},
        {label:"Category 4", value:15},
        {label:"Category 5", value:36},
        {label:"Category 6", value:0}
    ];

    datasetOption2 = [
        {label:"Category 1", value:10},
        {label:"Category 2", value:20},
        {label:"Category 3", value:30},
        {label:"Category 4", value:5},
        {label:"Category 5", value:12},
        {label:"Category 6", value:23}
    ];

    d3.selectAll("input").on("change", selectDataset);

    function selectDataset()
    {
        var value = this.value;
        if (value == "total")
        {
            change(datasetTotal);
        }
        else if (value == "option1")
        {
            change(datasetOption1);
        }
        else if (value == "option2")
        {
            change(datasetOption2);
        }
    }

    var margin = {top: (parseInt(d3.select('body').style('height'), 10)/20), right: (parseInt(d3.select('body').style('width'), 10)/20), bottom: (parseInt(d3.select('body').style('height'), 10)/20), left: (parseInt(d3.select('body').style('width'), 10)/5)},
            width = parseInt(d3.select('body').style('width'), 10) - margin.left - margin.right,
            height = parseInt(d3.select('body').style('height'), 10) - margin.top - margin.bottom;

    var div = d3.select("body").append("div").attr("class", "toolTip");

    var formatPercent = d3.format("");

    var y = d3.scale.ordinal()
            .rangeRoundBands([height, 0], .2, 0.5);

    var x = d3.scale.linear()
            .range([0, width]);

    var xAxis = d3.svg.axis()
            .scale(x)
            .tickSize(-height)
            .orient("bottom");

    var yAxis = d3.svg.axis()
            .scale(y)
            .orient("left");
    //.tickFormat(formatPercent);

    var svg = d3.select("body").append("svg")
            .attr("width", width + margin.left + margin.right)
            .attr("height", height + margin.top + margin.bottom)
            .append("g")
            .attr("transform", "translate(" + margin.left + "," + margin.top + ")");

    svg.append("g")
            .attr("class", "x axis")
            .attr("transform", "translate(0," + height + ")")
            .call(xAxis);

    d3.select("input[value=\"total\"]").property("checked", true);
    change(datasetTotal);

    function change(dataset) {

        y.domain(dataset.map(function(d) { return d.label; }));
        x.domain([0, d3.max(dataset, function(d) { return d.value; })]);

        svg.append("g")
                .attr("class", "x axis")
                .attr("transform", "translate(0," + height + ")")
                .call(xAxis);

        svg.select(".y.axis").remove();
        svg.select(".x.axis").remove();

        svg.append("g")
                .attr("class", "y axis")
                .call(yAxis)
                .append("text")
                .attr("transform", "rotate(0)")
                .attr("x", 50)
                .attr("dx", ".1em")
                .style("text-anchor", "end")
                .text("Option %");


        var bar = svg.selectAll(".bar")
                .data(dataset, function(d) { return d.label; })
        // new data:
        .enter().append("g").append("rect")
                .attr("class", "bar")
                .attr("x", function(d) { return x(d.value); })
                .attr("y", function(d) { return y(d.label); })
                .attr("width", function(d) { return width-x(d.value); })
                .attr("height", y.rangeBand());

                bar.append("text")
    .attr("x", function(d) { return x(d) - 3; })
    .attr("y", 30)
    .attr("dy", ".35em")
    .text(function(d) { return d.value; });


        var bars = d3.select("svg").selectAll("g.rects").data(dataset);

        // removed data:
        bars.exit().remove();

        // updated data:
        bars.transition()
                .duration(750)
                .attr("x", function(d) { return 0; })
                .attr("y", function(d) { return y(d.label); })
                .attr("width", function(d) { return x(d.value); })
                .attr("height", y.rangeBand());

    };
杰拉尔多·富塔多(Gerardo Furtado)

您可能会认为您正在将<text>元素添加<g>(组)元素中,但事实并非如此!

当你这样做的那一刻...

.enter().append("g").append("rect")

...您现在正尝试将text元素追加到<rect>elements上,这将不起作用。

解决方案:中断bars变量:

//appending the <g> elements
var bar = svg.selectAll(".bar")
    .data(dataset, function(d) {
        return d.label;
    })
    .enter().append("g");

//now you append the <rect> to the <g>
bar.append("rect")
    .attr("class", "bar")
    .attr("x", function(d) {
        return x(d.value);
    })
    .attr("y", function(d) {
        return y(d.label);
    })
    .attr("width", function(d) {
        return width - x(d.value);
    })
    .attr("height", y.rangeBand());

//and then you append the <text> to the <g>
bar.append("text")
    .attr("x", function(d) {
        return x(d.value) - 3;
    })
    .attr("text-anchor", "end")
    .attr("y", function(d) {
        return y(d.label) + y.rangeBand() / 2;
    })
    .attr("dy", ".35em")
    .text(function(d) {
        return d.value;
    });

这是您更新的小提琴:https : //jsfiddle.net/v8razxc8/

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

将标签/文本添加到 D3 圆圈?

来自分类Dev

尝试将标签添加到d3,无法弄清楚文本标签

来自分类Dev

将跨度图标添加到D3条形图

来自分类Dev

将文本添加到D3甜甜圈图的中心

来自分类Dev

将HTML代码添加到D3文本

来自分类Dev

如何将文本添加到 d3 中的 svg 圆圈

来自分类Dev

d3将拖放添加到填充圆圈

来自分类Dev

将工具提示添加到d3散点图

来自分类Dev

将点添加到d3 SVG贴图

来自分类Dev

将工具提示添加到d3散点图

来自分类Dev

D3将缩放添加到圈子包

来自分类Dev

向d3条添加文本

来自分类Dev

三.js | 无法将动态文本几何体添加到 3d 网格

来自分类Dev

在“强制”布局中将文本标签添加到d3节点

来自分类Dev

在“强制”布局中将文本标签添加到d3节点

来自分类Dev

如何通过数据联接将多个x轴添加到d3图表?

来自分类Dev

将边框添加到SVG路径d3 JavaScript

来自分类Dev

d3将html链接添加到表中的数据列

来自分类Dev

将标签添加到D3路径

来自分类Dev

将iFrame添加到D3可折叠树插件上的每个节点

来自分类Dev

在D3中将阴影添加到svg图像

来自分类Dev

在d3中将轴添加到动态折线图中

来自分类Dev

如何将SVG / d3映射添加到React Native?

来自分类Dev

如何仅将新节点添加到d3强制有向图?

来自分类Dev

D3仅将笔划添加到路径的一侧

来自分类Dev

使用D3将'value'属性动态添加到选项标签

来自分类Dev

如何将悬停(工具提示)添加到D3。气泡运动图?

来自分类Dev

如何将图例添加到aster图D3 JS中?

来自分类Dev

在d3中将轴添加到动态折线图中