Javascript 在树映射d3.js中解析json以获得不同的颜色

Javascript 在树映射d3.js中解析json以获得不同的颜色,javascript,d3.js,Javascript,D3.js,我跟随链接以供参考 但是这个链接中的json是不同的。 我想分析: [ {\"name\":\"ABC\",\"amount\":489956}, {\"name\":\"XYZ\",\"amount\":54554726} ] 我已尝试使用此代码: var svg = d3.select("svg"), width = +svg.attr("width"), height = +svg .attr("height"); var fa

我跟随链接以供参考

但是这个链接中的json是不同的。 我想分析:

[
    {\"name\":\"ABC\",\"amount\":489956},
    {\"name\":\"XYZ\",\"amount\":54554726}
]
我已尝试使用此代码:

     var svg = d3.select("svg"), width = +svg.attr("width"), height = +svg
            .attr("height");

    var fader = function(color) {
        return d3.interpolateRgb(color, "#fff")(0.2);
    }, color = d3.scaleOrdinal(d3.schemeCategory20.map(fader)), format = d3
            .format(",d");

    var treemap = d3.treemap().tile(d3.treemapResquarify).size(
            [ width, height ]).round(true).paddingInner(1);

  var jsonResp = "{\"name\": \"schools\",\"children\":[{\"name\":\"ABC\",\"amount\":489956},{\"name\":\"XYZ\",\"amount\":54554726}]}";

    var data = JSON.parse(jsonResp);    
    var root = d3.hierarchy(data).eachBefore(
                function(d) {
                    d.data.id = (d.parent ? d.parent.data.id + "." : "")
                            + d.data.name;
                }).sum(sumBySize).sort(function(a, b) {
            return b.height - a.height || b.value - a.value;
        });

        treemap(root);

        var cell = svg.selectAll("g").data(root.leaves()).enter().append(
                "g").attr("transform", function(d) {
            return "translate(" + d.x0 + "," + d.y0 + ")";
        });

        cell.append("rect").attr("id", function(d) {
            return d.data.id;
        }).attr("width", function(d) {
            return d.x1 - d.x0;
        }).attr("height", function(d) {
            return d.y1 - d.y0;
        }).attr("fill", function(d) {
            return color(d.parent.data.id);
        });

        cell.append("clipPath").attr("id", function(d) {
            return "clip-" + d.data.id;
        }).append("use").attr("xlink:href", function(d) {
            return "#" + d.data.id;
        });

        cell.append("text").attr("clip-path", function(d) {
            return "url(#clip-" + d.data.id + ")";
        }).selectAll("tspan").data(function(d) {
            return d.data.name.split(/(?=[A-Z][^A-Z])/g);
        }).enter().append("tspan").attr("x", 4).attr("y", function(d, i) {
            return 13 + i * 10;
        }).text(function(d) {
            return d;
        });

        cell.append("title").text(function(d) {
            return  "Amount - "+format(d.value)+" ";
        });

        d3.selectAll("input").data([ sumBySize, sumByCount ], function(d) {
            return d ? d.name : this.value;
        }).on("change", changed);

        var timeout = d3.timeout(function() {
            d3.select("input[value=\"sumByCount\"]").property("checked",
                    true).dispatch("change");
        }, 2000);

        function changed(sum) {
            timeout.stop();
            treemap(root.sum(sum));
            cell.transition().duration(750).attr("transform", function(d) {
                return "translate(" + d.x0 + "," + d.y0 + ")";
            }).select("rect").attr("width", function(d) {
                return d.x1 - d.x0;
            }).attr("height", function(d) {
                return d.y1 - d.y0;
            });
        }
    });

    function sumBySize(d) {
        return d.amount;
    } 
但是我在解析的json中得到的所有对象的颜色都是相同的。我希望每个对象都有不同的颜色,而不改变前面提到的json的结构。如何更改代码中的解析以获得每个对象的不同颜色? 我需要用json和数字对金额进行分类,并将其显示在悬停状态。
我只是d3.js的初学者。

首先,您提供的代码有几个问题:

您删除了d3.jsonflare.json、functionerror和数据{ 从原始代码中删除,但忘记删除关闭};导致错误的 您删除了代码其余部分中使用的sumByCount定义,导致了另一个错误 关于颜色问题,矩形的颜色设置如下:

cell.append("rect").attr("id", function(d) {
            return d.data.id;
        }).attr("width", function(d) {
            return d.x1 - d.x0;
        }).attr("height", function(d) {
            return d.y1 - d.y0;
        }).attr("fill", function(d) {
            return color(d.parent.data.id);
        });
它由“填充”属性控制。这意味着d.parent.data.id可能存在问题

这里是数组root.leaves的一个元素。如果您在控制台中打印出来,您将看到d.parent.data.id与每个元素的“schools”匹配。这就是为什么颜色比例返回相同的颜色

如果您直接使用d.data.id,并将示例中的html与您的数据一起使用,则最终会得到一个打印出root.leaves的工作代码:

var svg=d3.selectsvg, 宽度=+svg.attrwidth, 高度=+svg .身高; var fader=functioncolor{ 返回d3.b颜色,fff0.2; }, color=d3.scaleOrdinald3.schemeCategory 10.mapfader, 格式=d3 .格式,d; var treemap=d3.treemap.tiled3.treemapResquarify.size [宽度,高度].roundtrue.paddinginer1; var jsonResp={\name\:\schools\,\children\:[{\name\:\ABC\,\amount\:489956},{\name\:\XYZ\,\amount\:54554726}; var data=JSON.parsejsonResp; var root=d3.hierarchydata.eachBefore 功能{ d、 data.id=d.parent?d.parent.data.id+:+ d、 data.name; }.sumbysize.sort函数a,b{ 返回b.height-a.height | | b.value-a.value; }; 树状体; 控制台日志数据; console.logroot.leaves; var cell=svg.selectAllg.dataroot.leaves.enter.append g、 属性转换,函数{ 返回translate+d.x0+,+d.y0+; }; cell.appendrect.attrid,函数为{ 返回d.data.id; }.attrwidth,函数d{ 返回d.x1-d.x0; }.attr高度,功能{ 返回d.y1-d.y0; }.attrfill,函数d{ 返回colord.data.id; }; cell.appendclipPath.attrid,函数为{ 返回剪辑-+d.data.id; }.appenduse.attrxlink:href,函数d{ return+d.data.id; }; cell.appendtext.attrclip-path,函数d{ 返回urlclip-+d.data.id+; }。选择Alltspan.datafunctiond{ 返回d.data.name.split/?=[A-Z][^A-Z]/g; }.enter.appendtspan.attrx,4.attry,functionad,i{ 返回13+i*10; }.textfunctiond{ 返回d; }; cell.appendtitle.textfunctiond{ 返回金额-+格式值+; }; d3.选择输入数据[sumBySize,sumByCount],函数D{ 返回d?d.名称:this.value; }.一旦改变,就改变; 变量超时=d3.timeoutfunction{ d3.选择输入[value=\sumByCount\]。属性已检查, 真的。改变; }, 2000; 功能改变{ 超时。停止; 三叶树; cell.transition.duration750.attrtransform,函数D{ 返回translate+d.x0+,+d.y0+; }.selectrect.attrwidth,函数D{ 返回d.x1-d.x0; }.attr高度,功能{ 返回d.y1-d.y0; }; } 函数sumByCountd{ 返回d.children?0:1; } 函数求和{ 返回d.金额; } 大小 计数
什么是/stack/test.js?啊,好主意!在将代码放入代码段之前,我在本地运行了代码,但忘记删除导入。我马上编辑它!这成功了!非常感谢您的详细解释well@Araelath.