如何传递非分层CSV以便在D3.js分区的旭日树中使用?

时间:2015-11-11 01:07:47

标签: javascript json csv d3.js sunburst-diagram

我正在使用this javascript code将我的CSV转换为分层JSON。分层JSON成功填充了示例中使用的sunburst图表。

   //*************************************************
  // GET THE CSV DATA
  //*************************************************
  d3.csv("data/religions.csv", function(error, data) {

    _.each(data, function(element, index, list){
        element.pop = +element.pop;
    });

    //*************************************************
    // THE FUNCTION
    //*************************************************
    function genJSON(csvData, groups) {

      var genGroups = function(data) {
        return _.map(data, function(element, index) {
          return { name : index, children : element };
        });
      };

      var nest = function(node, curIndex) {
        if (curIndex === 0) {
          node.children = genGroups(_.groupBy(csvData, groups[0]));
          _.each(node.children, function (child) {
            nest(child, curIndex + 1);
          });
        }
        else {
          if (curIndex < groups.length) {
            node.children = genGroups(
              _.groupBy(node.children, groups[curIndex])
            );
            _.each(node.children, function (child) {
              nest(child, curIndex + 1);
            });
          }
        }
        return node;
      };
      return nest({}, 0);
    }
    //*************************************************
    // CALL THE FUNCTION
    //*************************************************
    var preppedData = genJSON(data, ['year', 'cat'])

    //*************************************************
    // LOAD THE PREPPED DATA IN D3
    //*************************************************
    var path = svg.datum(preppedData).selectAll("path")
      .data(partition.nodes)
    .enter().append("path")
      .attr("display", function(d) { return d.depth ? null : "none"; }) // hide inner ring
      .attr("d", arc)
      .attr("class", function(d) { return (d.children ? d : d.parent).name; })
      .style("stroke", "#fff")
      .style("fill", function(d) { return color((d.children ? d : d.parent).name); })
      .style("fill-rule", "evenodd")

  });

我在其他D3.js可视化中使用此脚本的输出时遇到问题。基本上,我想使用来自前一个示例to create this D3.js visualization的分层JSON。这是用于创建此分区旭日树的javascript。

! function() {
function t(n, e) {
    return n === e ? !0 : n.children ? n.children.some(function(n) {
        return t(n, e)
    }) : !1
}

function n(t) {
    if (t.children) {
        var e = t.children.map(n),
            r = d3.hsl(e[0]),
            a = d3.hsl(e[1]);
        return d3.hsl((r.h + a.h) / 2, 1.2 * r.s, r.l / 1.2)
    }
    return t.colour || "#fff"
}

function e(t) {
    var n = r(t),
        e = d3.interpolate(d.domain(), [t.x, t.x + t.dx]),
        a = d3.interpolate(u.domain(), [t.y, n]),
        i = d3.interpolate(u.range(), [t.y ? 20 : 0, o]);
    return function(t) {
        return function(n) {
            return d.domain(e(n)), u.domain(a(n)).range(i(n)), x(t)
        }
    }
}

function r(t) {
    return t.children ? Math.max.apply(Math, t.children.map(r)) : t.y + t.dy
}

function a(t) {
    return .299 * t.r + .587 * t.g + .114 * t.b
}
var i = 840,
    l = i,
    o = i / 2,
    d = d3.scale.linear().range([0, 2 * Math.PI]),
    u = d3.scale.pow().exponent(1.3).domain([0, 1]).range([0, o]),
    c = 5,
    s = 1e3,
    h = d3.select("#vis");
h.select("img").remove();
var f = h.append("svg").attr("width", i + 2 * c).attr("height", l + 2 * c).append("g").attr("transform", "translate(" + [o + c, o + c] + ")");
h.append("p").attr("id", "intro").text("Click to zoom!");
var p = d3.layout.partition().sort(null).value(function(t) {
        return 5.8 - t.depth
    }),
    x = d3.svg.arc().startAngle(function(t) {
        return Math.max(0, Math.min(2 * Math.PI, d(t.x)))
    }).endAngle(function(t) {
        return Math.max(0, Math.min(2 * Math.PI, d(t.x + t.dx)))
    }).innerRadius(function(t) {
        return Math.max(0, t.y ? u(t.y) : t.y)
    }).outerRadius(function(t) {
        return Math.max(0, u(t.y + t.dy))
    });

d3.json("sunburst.json", function(r, i) {
    function l(n) {
        h.transition().duration(s).attrTween("d", e(n)), m.style("visibility", function(e) {
            return t(n, e) ? null : d3.select(this).style("visibility")
        }).transition().duration(s).attrTween("text-anchor", function(t) {
            return function() {
                return d(t.x + t.dx / 2) > Math.PI ? "end" : "start"
            }
        }).attrTween("transform", function(t) {
            var n = (t.name || "").split(" ").length > 1;
            return function() {
                var e = 180 * d(t.x + t.dx / 2) / Math.PI - 90,
                    r = e + (n ? -.5 : 0);
                return "rotate(" + r + ")translate(" + (u(t.y) + c) + ")rotate(" + (e > 90 ? -180 : 0) + ")"
            }
        }).style("fill-opacity", function(e) {
            return t(n, e) ? 1 : 1e-6
        }).each("end", function(e) {
            d3.select(this).style("visibility", t(n, e) ? null : "hidden")
        })
    }
    var o = p.nodes({
            children: i
        }),
        h = f.selectAll("path").data(o);
    h.enter().append("path").attr("id", function(t, n) {
        return "path-" + n
    }).attr("d", x).attr("fill-rule", "evenodd").style("fill", n).on("click", l);
    var m = f.selectAll("text").data(o),
        y = m.enter().append("text").style("fill-opacity", 1).style("fill", function(t) {
            return a(d3.rgb(n(t))) < 125 ? "#eee" : "#000"
        }).attr("text-anchor", function(t) {
            return d(t.x + t.dx / 2) > Math.PI ? "end" : "start"
        }).attr("dy", ".2em").attr("transform", function(t) {
            var n = (t.name || "").split(" ").length > 1,
                e = 180 * d(t.x + t.dx / 2) / Math.PI - 90,
                r = e + (n ? -.5 : 0);
            return "rotate(" + r + ")translate(" + (u(t.y) + c) + ")rotate(" + (e > 90 ? -180 : 0) + ")"
        }).on("click", l);
    y.append("tspan").attr("x", 0).text(function(t) {
        return t.depth ? t.name.split(" ")[0] : ""
    }), y.append("tspan").attr("x", 0).attr("dy", "1em").text(function(t) {
        return t.depth ? t.name.split(" ")[1] || "" : ""
    })
})
}();

简而言之,Coffee Wheel示例(以及大多数其他D3.js可视化)通过d3.json(“sunburst.json”)函数访问JSON。我想传递第一个脚本的输出来创建sunburst树,而不是将JSON文件传递给该函数。任何想法如何做到这一点,还是有更好的方法?

0 个答案:

没有答案