2

我正在尝试使用标签实现可缩放的旭日形可视化(如图所示。因为我希望它在本地工作,所以我想跳过 json 文件的使用,而是想对数据内联进行硬编码。

有一个关于类似问题的相关问题(请在此处阅读),我试图遵循那里的建议,但它并没有解决我的问题。

下面是我修改后的代码。由于嵌入的 json 数据,很抱歉排长队。

非常感谢您的帮助。

代码:

<!DOCTYPE html>
<meta charset="utf-8">
<style>

body {
  font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
  margin: auto;
  position: relative;
  width: 960px;
}

form {
  position: absolute;
  right: 10px;
  top: 10px;
}

</style>
<form>
  <label><input type="radio" name="mode" value="size"> Size</label>
  <label><input type="radio" name="mode" value="count" checked> Count</label>
</form>
<script src="http://d3js.org/d3.v3.min.js"></script>
<script>

var width = 960,
    height = 700,
    radius = Math.min(width, height) / 2,
    color = d3.scale.category20c();

var svg = d3.select("body").append("svg")
    .attr("width", width)
    .attr("height", height)
    .data(flaredata)        // this line is modified according to provided solution here: https://stackoverflow.com/questions/17019572/d3-sunburst-doesnt-draw-with-inline-json
  .append("g")
    .attr("transform", "translate(" + width / 2 + "," + height * .52 + ")");

var partition = d3.layout.partition()
    .sort(null)
    .size([2 * Math.PI, radius * radius])
    .value(function(d) { return 1; });

var arc = d3.svg.arc()
    .startAngle(function(d) { return d.x; })
    .endAngle(function(d) { return d.x + d.dx; })
    .innerRadius(function(d) { return Math.sqrt(d.y); })
    .outerRadius(function(d) { return Math.sqrt(d.y + d.dy); });

var flaredata = {"name": "flare","children": [{"name": "analytics","children": [{"name": "cluster","children": [{"name": "AgglomerativeCluster", "size": 3938},{"name": "CommunityStructure", "size": 3812},{"name": "HierarchicalCluster", "size": 6714},{"name": "MergeEdge", "size": 743}]},{"name": "graph","children": [{"name": "BetweennessCentrality", "size": 3534},{"name": "LinkDistance", "size": 5731},{"name": "MaxFlowMinCut", "size": 7840},{"name": "ShortestPaths", "size": 5914},{"name": "SpanningTree", "size": 3416}]},{"name": "optimization","children": [{"name": "AspectRatioBanker", "size": 7074}]}]},{"name": "animate","children": [{"name": "Easing", "size": 17010},{"name": "FunctionSequence", "size": 5842},{"name": "interpolate","children": [{"name": "ArrayInterpolator", "size": 1983},{"name": "ColorInterpolator", "size": 2047},{"name": "DateInterpolator", "size": 1375},{"name": "Interpolator", "size": 8746},{"name": "MatrixInterpolator", "size": 2202},{"name": "NumberInterpolator", "size": 1382},{"name": "ObjectInterpolator", "size": 1629},{"name": "PointInterpolator", "size": 1675},{"name": "RectangleInterpolator", "size": 2042}]},{"name": "ISchedulable", "size": 1041},{"name": "Parallel", "size": 5176},{"name": "Pause", "size": 449},{"name": "Scheduler", "size": 5593},{"name": "Sequence", "size": 5534},{"name": "Transition", "size": 9201},{"name": "Transitioner", "size": 19975},{"name": "TransitionEvent", "size": 1116},{"name": "Tween", "size": 6006}]},{"name": "data","children": [{"name": "converters","children": [{"name": "Converters", "size": 721},{"name": "DelimitedTextConverter", "size": 4294},{"name": "GraphMLConverter", "size": 9800},{"name": "IDataConverter", "size": 1314},{"name": "JSONConverter", "size": 2220}]},{"name": "DataField", "size": 1759},{"name": "DataSchema", "size": 2165},{"name": "DataSet", "size": 586},{"name": "DataSource", "size": 3331},{"name": "DataTable", "size": 772},{"name": "DataUtil", "size": 3322}]},{"name": "display","children": [{"name": "DirtySprite", "size": 8833},{"name": "LineSprite", "size": 1732},{"name": "RectSprite", "size": 3623},{"name": "TextSprite", "size": 10066}]},{"name": "flex","children": [{"name": "FlareVis", "size": 4116}]},{"name": "physics","children": [{"name": "DragForce", "size": 1082},{"name": "GravityForce", "size": 1336},{"name": "IForce", "size": 319},{"name": "NBodyForce", "size": 10498},{"name": "Particle", "size": 2822},{"name": "Simulation", "size": 9983},{"name": "Spring", "size": 2213},{"name": "SpringForce", "size": 1681}]},{"name": "query","children": [{"name": "AggregateExpression", "size": 1616},{"name": "And", "size": 1027},{"name": "Arithmetic", "size": 3891},{"name": "Average", "size": 891},{"name": "BinaryExpression", "size": 2893},{"name": "Comparison", "size": 5103},{"name": "CompositeExpression", "size": 3677},{"name": "Count", "size": 781},{"name": "DateUtil", "size": 4141},{"name": "Distinct", "size": 933},{"name": "Expression", "size": 5130},{"name": "ExpressionIterator", "size": 3617},{"name": "Fn", "size": 3240},{"name": "If", "size": 2732},{"name": "IsA", "size": 2039},{"name": "Literal", "size": 1214},{"name": "Match", "size": 3748},{"name": "Maximum", "size": 843},{"name": "methods","children": [{"name": "add", "size": 593},{"name": "and", "size": 330},{"name": "average", "size": 287},{"name": "count", "size": 277},{"name": "distinct", "size": 292},{"name": "div", "size": 595},{"name": "eq", "size": 594},{"name": "fn", "size": 460},{"name": "gt", "size": 603},{"name": "gte", "size": 625},{"name": "iff", "size": 748},{"name": "isa", "size": 461},{"name": "lt", "size": 597},{"name": "lte", "size": 619},{"name": "max", "size": 283},{"name": "min", "size": 283},{"name": "mod", "size": 591},{"name": "mul", "size": 603},{"name": "neq", "size": 599},{"name": "not", "size": 386},{"name": "or", "size": 323},{"name": "orderby", "size": 307},{"name": "range", "size": 772},{"name": "select", "size": 296},{"name": "stddev", "size": 363},{"name": "sub", "size": 600},{"name": "sum", "size": 280},{"name": "update", "size": 307},{"name": "variance", "size": 335},{"name": "where", "size": 299},{"name": "xor", "size": 354},{"name": "_", "size": 264}]},{"name": "Minimum", "size": 843},{"name": "Not", "size": 1554},{"name": "Or", "size": 970},{"name": "Query", "size": 13896},{"name": "Range", "size": 1594},{"name": "StringUtil", "size": 4130},{"name": "Sum", "size": 791},{"name": "Variable", "size": 1124},{"name": "Variance", "size": 1876},{"name": "Xor", "size": 1101}]},{"name": "scale","children": [{"name": "IScaleMap", "size": 2105},{"name": "LinearScale", "size": 1316},{"name": "LogScale", "size": 3151},{"name": "OrdinalScale", "size": 3770},{"name": "QuantileScale", "size": 2435},{"name": "QuantitativeScale", "size": 4839},{"name": "RootScale", "size": 1756},{"name": "Scale", "size": 4268},{"name": "ScaleType", "size": 1821},{"name": "TimeScale", "size": 5833}]},{"name": "util","children": [{"name": "Arrays", "size": 8258},{"name": "Colors", "size": 10001},{"name": "Dates", "size": 8217},{"name": "Displays", "size": 12555},{"name": "Filter", "size": 2324},{"name": "Geometry", "size": 10993},{"name": "heap","children": [{"name": "FibonacciHeap", "size": 9354},{"name": "HeapNode", "size": 1233}]},{"name": "IEvaluable", "size": 335},{"name": "IPredicate", "size": 383},{"name": "IValueProxy", "size": 874},{"name": "math","children": [{"name": "DenseMatrix", "size": 3165},{"name": "IMatrix", "size": 2815},{"name": "SparseMatrix", "size": 3366}]},{"name": "Maths", "size": 17705},{"name": "Orientation", "size": 1486},{"name": "palette","children": [{"name": "ColorPalette", "size": 6367},{"name": "Palette", "size": 1229},{"name": "ShapePalette", "size": 2059},{"name": "SizePalette", "size": 2291}]},{"name": "Property", "size": 5559},{"name": "Shapes", "size": 19118},{"name": "Sort", "size": 6887},{"name": "Stats", "size": 6557},{"name": "Strings", "size": 22026}]},{"name": "vis","children": [{"name": "axis","children": [{"name": "Axes", "size": 1302},{"name": "Axis", "size": 24593},{"name": "AxisGridLine", "size": 652},{"name": "AxisLabel", "size": 636},{"name": "CartesianAxes", "size": 6703}]},{"name": "controls","children": [{"name": "AnchorControl", "size": 2138},{"name": "ClickControl", "size": 3824},{"name": "Control", "size": 1353},{"name": "ControlList", "size": 4665},{"name": "DragControl", "size": 2649},{"name": "ExpandControl", "size": 2832},{"name": "HoverControl", "size": 4896},{"name": "IControl", "size": 763},{"name": "PanZoomControl", "size": 5222},{"name": "SelectionControl", "size": 7862},{"name": "TooltipControl", "size": 8435}]},{"name": "data","children": [{"name": "Data", "size": 20544},{"name": "DataList", "size": 19788},{"name": "DataSprite", "size": 10349},{"name": "EdgeSprite", "size": 3301},{"name": "NodeSprite", "size": 19382},{"name": "render","children": [{"name": "ArrowType", "size": 698},{"name": "EdgeRenderer", "size": 5569},{"name": "IRenderer", "size": 353},{"name": "ShapeRenderer", "size": 2247}]},{"name": "ScaleBinding", "size": 11275},{"name": "Tree", "size": 7147},{"name": "TreeBuilder", "size": 9930}]},{"name": "events","children": [{"name": "DataEvent", "size": 2313},{"name": "SelectionEvent", "size": 1880},{"name": "TooltipEvent", "size": 1701},{"name": "VisualizationEvent", "size": 1117}]},{"name": "legend","children": [{"name": "Legend", "size": 20859},{"name": "LegendItem", "size": 4614},{"name": "LegendRange", "size": 10530}]},{"name": "operator","children": [{"name": "distortion","children": [{"name": "BifocalDistortion", "size": 4461},{"name": "Distortion", "size": 6314},{"name": "FisheyeDistortion", "size": 3444}]},{"name": "encoder","children": [{"name": "ColorEncoder", "size": 3179},{"name": "Encoder", "size": 4060},{"name": "PropertyEncoder", "size": 4138},{"name": "ShapeEncoder", "size": 1690},{"name": "SizeEncoder", "size": 1830}]},{"name": "filter","children": [{"name": "FisheyeTreeFilter", "size": 5219},{"name": "GraphDistanceFilter", "size": 3165},{"name": "VisibilityFilter", "size": 3509}]},{"name": "IOperator", "size": 1286},{"name": "label","children": [{"name": "Labeler", "size": 9956},{"name": "RadialLabeler", "size": 3899},{"name": "StackedAreaLabeler", "size": 3202}]},{"name": "layout","children": [{"name": "AxisLayout", "size": 6725},{"name": "BundledEdgeRouter", "size": 3727},{"name": "CircleLayout", "size": 9317},{"name": "CirclePackingLayout", "size": 12003},{"name": "DendrogramLayout", "size": 4853},{"name": "ForceDirectedLayout", "size": 8411},{"name": "IcicleTreeLayout", "size": 4864},{"name": "IndentedTreeLayout", "size": 3174},{"name": "Layout", "size": 7881},{"name": "NodeLinkTreeLayout", "size": 12870},{"name": "PieLayout", "size": 2728},{"name": "RadialTreeLayout", "size": 12348},{"name": "RandomLayout", "size": 870},{"name": "StackedAreaLayout", "size": 9121},{"name": "TreeMapLayout", "size": 9191}]},{"name": "Operator", "size": 2490},{"name": "OperatorList", "size": 5248},{"name": "OperatorSequence", "size": 4190},{"name": "OperatorSwitch", "size": 2581},{"name": "SortOperator", "size": 2023}]},{"name": "Visualization", "size": 16540}]}]};


//d3.json(flaredata, function(error, root) {
  var path = svg.selectAll("path")  // this line is modified - original was:   var path = svg.datum(root).selectAll("path")
                                    // since root was an argument of function(error,root)
      .data(partition.nodes)
    .enter().append("path")
      .attr("display", function(d) { return d.depth ? null : "none"; }) // hide inner ring
      .attr("d", arc)
      .style("stroke", "#fff")
      .style("fill", function(d) { return color((d.children ? d : d.parent).name); })
      .style("fill-rule", "evenodd")
      .each(stash);

  d3.selectAll("input").on("change", function change() {
    var value = this.value === "count"
        ? function() { return 1; }
        : function(d) { return d.size; };

    path
        .data(partition.value(value).nodes)
      .transition()
        .duration(1500)
        .attrTween("d", arcTween);
  });
// });                               // this line is modified, because these are closing brackets of d3.json

// Stash the old values for transition.
function stash(d) {
  d.x0 = d.x;
  d.dx0 = d.dx;
}

// Interpolate the arcs in data space.
function arcTween(a) {
  var i = d3.interpolate({x: a.x0, dx: a.dx0}, a);
  return function(t) {
    var b = i(t);
    a.x0 = b.x;
    a.dx0 = b.dx;
    return arc(b);
  };
}

d3.select(self.frameElement).style("height", height + "px");

</script>

4

1 回答 1

1

感谢拉斯的帮助。现在代码可以工作了。顺便说一句,我在问题中发布了错误的 d3 代码,所以它不属于“带有标签的可缩放旭日形”,这是我的错:(

但是,我仍然将您的帮助集成到实际代码中。它有效。我想发布“带有嵌入数据标签的可缩放旭日形”的最终代码,作为将来可能需要它的人的答案。

<!DOCTYPE html>
<meta charset="utf-8">
<style>

path {
  stroke: #fff;
  fill-rule: evenodd;
}

text {
  font-family: Arial, sans-serif;
  font-size: 12px;
}

</style>
<body>
<script src="http://d3js.org/d3.v3.min.js"></script>
<script>

// original code of this D3 visualization can be found at http://bl.ocks.org/metmajer/5480307
// by the help of stackoverflow user Lars Kotthoff, I made some changes and now the code has embedded data


var flaredata = {"name": "flare","children": [{"name": "analytics","children": [{"name": "cluster","children": [{"name": "AgglomerativeCluster", "size": 3938},{"name": "CommunityStructure", "size": 3812},{"name": "HierarchicalCluster", "size": 6714},{"name": "MergeEdge", "size": 743}]},{"name": "graph","children": [{"name": "BetweennessCentrality", "size": 3534},{"name": "LinkDistance", "size": 5731},{"name": "MaxFlowMinCut", "size": 7840},{"name": "ShortestPaths", "size": 5914},{"name": "SpanningTree", "size": 3416}]},{"name": "optimization","children": [{"name": "AspectRatioBanker", "size": 7074}]}]},{"name": "animate","children": [{"name": "Easing", "size": 17010},{"name": "FunctionSequence", "size": 5842},{"name": "interpolate","children": [{"name": "ArrayInterpolator", "size": 1983},{"name": "ColorInterpolator", "size": 2047},{"name": "DateInterpolator", "size": 1375},{"name": "Interpolator", "size": 8746},{"name": "MatrixInterpolator", "size": 2202},{"name": "NumberInterpolator", "size": 1382},{"name": "ObjectInterpolator", "size": 1629},{"name": "PointInterpolator", "size": 1675},{"name": "RectangleInterpolator", "size": 2042}]},{"name": "ISchedulable", "size": 1041},{"name": "Parallel", "size": 5176},{"name": "Pause", "size": 449},{"name": "Scheduler", "size": 5593},{"name": "Sequence", "size": 5534},{"name": "Transition", "size": 9201},{"name": "Transitioner", "size": 19975},{"name": "TransitionEvent", "size": 1116},{"name": "Tween", "size": 6006}]},{"name": "data","children": [{"name": "converters","children": [{"name": "Converters", "size": 721},{"name": "DelimitedTextConverter", "size": 4294},{"name": "GraphMLConverter", "size": 9800},{"name": "IDataConverter", "size": 1314},{"name": "JSONConverter", "size": 2220}]},{"name": "DataField", "size": 1759},{"name": "DataSchema", "size": 2165},{"name": "DataSet", "size": 586},{"name": "DataSource", "size": 3331},{"name": "DataTable", "size": 772},{"name": "DataUtil", "size": 3322}]},{"name": "display","children": [{"name": "DirtySprite", "size": 8833},{"name": "LineSprite", "size": 1732},{"name": "RectSprite", "size": 3623},{"name": "TextSprite", "size": 10066}]},{"name": "flex","children": [{"name": "FlareVis", "size": 4116}]},{"name": "physics","children": [{"name": "DragForce", "size": 1082},{"name": "GravityForce", "size": 1336},{"name": "IForce", "size": 319},{"name": "NBodyForce", "size": 10498},{"name": "Particle", "size": 2822},{"name": "Simulation", "size": 9983},{"name": "Spring", "size": 2213},{"name": "SpringForce", "size": 1681}]},{"name": "query","children": [{"name": "AggregateExpression", "size": 1616},{"name": "And", "size": 1027},{"name": "Arithmetic", "size": 3891},{"name": "Average", "size": 891},{"name": "BinaryExpression", "size": 2893},{"name": "Comparison", "size": 5103},{"name": "CompositeExpression", "size": 3677},{"name": "Count", "size": 781},{"name": "DateUtil", "size": 4141},{"name": "Distinct", "size": 933},{"name": "Expression", "size": 5130},{"name": "ExpressionIterator", "size": 3617},{"name": "Fn", "size": 3240},{"name": "If", "size": 2732},{"name": "IsA", "size": 2039},{"name": "Literal", "size": 1214},{"name": "Match", "size": 3748},{"name": "Maximum", "size": 843},{"name": "methods","children": [{"name": "add", "size": 593},{"name": "and", "size": 330},{"name": "average", "size": 287},{"name": "count", "size": 277},{"name": "distinct", "size": 292},{"name": "div", "size": 595},{"name": "eq", "size": 594},{"name": "fn", "size": 460},{"name": "gt", "size": 603},{"name": "gte", "size": 625},{"name": "iff", "size": 748},{"name": "isa", "size": 461},{"name": "lt", "size": 597},{"name": "lte", "size": 619},{"name": "max", "size": 283},{"name": "min", "size": 283},{"name": "mod", "size": 591},{"name": "mul", "size": 603},{"name": "neq", "size": 599},{"name": "not", "size": 386},{"name": "or", "size": 323},{"name": "orderby", "size": 307},{"name": "range", "size": 772},{"name": "select", "size": 296},{"name": "stddev", "size": 363},{"name": "sub", "size": 600},{"name": "sum", "size": 280},{"name": "update", "size": 307},{"name": "variance", "size": 335},{"name": "where", "size": 299},{"name": "xor", "size": 354},{"name": "_", "size": 264}]},{"name": "Minimum", "size": 843},{"name": "Not", "size": 1554},{"name": "Or", "size": 970},{"name": "Query", "size": 13896},{"name": "Range", "size": 1594},{"name": "StringUtil", "size": 4130},{"name": "Sum", "size": 791},{"name": "Variable", "size": 1124},{"name": "Variance", "size": 1876},{"name": "Xor", "size": 1101}]},{"name": "scale","children": [{"name": "IScaleMap", "size": 2105},{"name": "LinearScale", "size": 1316},{"name": "LogScale", "size": 3151},{"name": "OrdinalScale", "size": 3770},{"name": "QuantileScale", "size": 2435},{"name": "QuantitativeScale", "size": 4839},{"name": "RootScale", "size": 1756},{"name": "Scale", "size": 4268},{"name": "ScaleType", "size": 1821},{"name": "TimeScale", "size": 5833}]},{"name": "util","children": [{"name": "Arrays", "size": 8258},{"name": "Colors", "size": 10001},{"name": "Dates", "size": 8217},{"name": "Displays", "size": 12555},{"name": "Filter", "size": 2324},{"name": "Geometry", "size": 10993},{"name": "heap","children": [{"name": "FibonacciHeap", "size": 9354},{"name": "HeapNode", "size": 1233}]},{"name": "IEvaluable", "size": 335},{"name": "IPredicate", "size": 383},{"name": "IValueProxy", "size": 874},{"name": "math","children": [{"name": "DenseMatrix", "size": 3165},{"name": "IMatrix", "size": 2815},{"name": "SparseMatrix", "size": 3366}]},{"name": "Maths", "size": 17705},{"name": "Orientation", "size": 1486},{"name": "palette","children": [{"name": "ColorPalette", "size": 6367},{"name": "Palette", "size": 1229},{"name": "ShapePalette", "size": 2059},{"name": "SizePalette", "size": 2291}]},{"name": "Property", "size": 5559},{"name": "Shapes", "size": 19118},{"name": "Sort", "size": 6887},{"name": "Stats", "size": 6557},{"name": "Strings", "size": 22026}]},{"name": "vis","children": [{"name": "axis","children": [{"name": "Axes", "size": 1302},{"name": "Axis", "size": 24593},{"name": "AxisGridLine", "size": 652},{"name": "AxisLabel", "size": 636},{"name": "CartesianAxes", "size": 6703}]},{"name": "controls","children": [{"name": "AnchorControl", "size": 2138},{"name": "ClickControl", "size": 3824},{"name": "Control", "size": 1353},{"name": "ControlList", "size": 4665},{"name": "DragControl", "size": 2649},{"name": "ExpandControl", "size": 2832},{"name": "HoverControl", "size": 4896},{"name": "IControl", "size": 763},{"name": "PanZoomControl", "size": 5222},{"name": "SelectionControl", "size": 7862},{"name": "TooltipControl", "size": 8435}]},{"name": "data","children": [{"name": "Data", "size": 20544},{"name": "DataList", "size": 19788},{"name": "DataSprite", "size": 10349},{"name": "EdgeSprite", "size": 3301},{"name": "NodeSprite", "size": 19382},{"name": "render","children": [{"name": "ArrowType", "size": 698},{"name": "EdgeRenderer", "size": 5569},{"name": "IRenderer", "size": 353},{"name": "ShapeRenderer", "size": 2247}]},{"name": "ScaleBinding", "size": 11275},{"name": "Tree", "size": 7147},{"name": "TreeBuilder", "size": 9930}]},{"name": "events","children": [{"name": "DataEvent", "size": 2313},{"name": "SelectionEvent", "size": 1880},{"name": "TooltipEvent", "size": 1701},{"name": "VisualizationEvent", "size": 1117}]},{"name": "legend","children": [{"name": "Legend", "size": 20859},{"name": "LegendItem", "size": 4614},{"name": "LegendRange", "size": 10530}]},{"name": "operator","children": [{"name": "distortion","children": [{"name": "BifocalDistortion", "size": 4461},{"name": "Distortion", "size": 6314},{"name": "FisheyeDistortion", "size": 3444}]},{"name": "encoder","children": [{"name": "ColorEncoder", "size": 3179},{"name": "Encoder", "size": 4060},{"name": "PropertyEncoder", "size": 4138},{"name": "ShapeEncoder", "size": 1690},{"name": "SizeEncoder", "size": 1830}]},{"name": "filter","children": [{"name": "FisheyeTreeFilter", "size": 5219},{"name": "GraphDistanceFilter", "size": 3165},{"name": "VisibilityFilter", "size": 3509}]},{"name": "IOperator", "size": 1286},{"name": "label","children": [{"name": "Labeler", "size": 9956},{"name": "RadialLabeler", "size": 3899},{"name": "StackedAreaLabeler", "size": 3202}]},{"name": "layout","children": [{"name": "AxisLayout", "size": 6725},{"name": "BundledEdgeRouter", "size": 3727},{"name": "CircleLayout", "size": 9317},{"name": "CirclePackingLayout", "size": 12003},{"name": "DendrogramLayout", "size": 4853},{"name": "ForceDirectedLayout", "size": 8411},{"name": "IcicleTreeLayout", "size": 4864},{"name": "IndentedTreeLayout", "size": 3174},{"name": "Layout", "size": 7881},{"name": "NodeLinkTreeLayout", "size": 12870},{"name": "PieLayout", "size": 2728},{"name": "RadialTreeLayout", "size": 12348},{"name": "RandomLayout", "size": 870},{"name": "StackedAreaLayout", "size": 9121},{"name": "TreeMapLayout", "size": 9191}]},{"name": "Operator", "size": 2490},{"name": "OperatorList", "size": 5248},{"name": "OperatorSequence", "size": 4190},{"name": "OperatorSwitch", "size": 2581},{"name": "SortOperator", "size": 2023}]},{"name": "Visualization", "size": 16540}]}]};

var width = 1500,
    height = 1000,
    radius = Math.min(width, height) / 2;

var x = d3.scale.linear()
    .range([0, 2 * Math.PI]);

var y = d3.scale.linear()
    .range([0, radius]);

var color = d3.scale.category20c();

var svg = d3.select("body").append("svg")
    .attr("width", width)
    .attr("height", height)
    .datum(flaredata)        // this line is modified according to provided solution here: https://stackoverflow.com/questions/17019572/d3-sunburst-doesnt-draw-with-inline-json
			                 // data() was replaced with datum() as suggested by Lars Kotthoff
    .append("g")
    .attr("transform", "translate(" + width / 2 + "," + (height / 2 + 10) + ")");

var partition = d3.layout.partition()
    .value(function(d) { return d.size; });

var arc = d3.svg.arc()
    .startAngle(function(d) { return Math.max(0, Math.min(2 * Math.PI, x(d.x))); })
    .endAngle(function(d) { return Math.max(0, Math.min(2 * Math.PI, x(d.x + d.dx))); })
    .innerRadius(function(d) { return Math.max(0, y(d.y)); })
    .outerRadius(function(d) { return Math.max(0, y(d.y + d.dy)); });

// d3.json("flare.json", function(error, root) {

  var g = svg.selectAll("g")
      .data(partition.nodes)        // removed "root" argument here
    .enter().append("g");

  var path = g.append("path")
    .attr("d", arc)
    .style("fill", function(d) { return color((d.children ? d : d.parent).name); })
    .on("click", click);

  var text = g.append("text")
    .attr("transform", function(d) { return "rotate(" + computeTextRotation(d) + ")"; })
    .attr("x", function(d) { return y(d.y); })
    .attr("dx", "6") // margin
    .attr("dy", ".35em") // vertical-align
    .text(function(d) { return d.name; });

  function click(d) {
    // fade out all text elements
    text.transition().attr("opacity", 0);

    path.transition()
      .duration(750)
      .attrTween("d", arcTween(d))
      .each("end", function(e, i) {
          // check if the animated element's data e lies within the visible angle span given in d
          if (e.x >= d.x && e.x < (d.x + d.dx)) {
            // get a selection of the associated text element
            var arcText = d3.select(this.parentNode).select("text");
            // fade in the text element and recalculate positions
            arcText.transition().duration(750)
              .attr("opacity", 1)
              .attr("transform", function() { return "rotate(" + computeTextRotation(e) + ")" })
              .attr("x", function(d) { return y(d.y); });
          }
      });
  }
// });

d3.select(self.frameElement).style("height", height + "px");

// Interpolate the scales!
function arcTween(d) {
  var xd = d3.interpolate(x.domain(), [d.x, d.x + d.dx]),
      yd = d3.interpolate(y.domain(), [d.y, 1]),
      yr = d3.interpolate(y.range(), [d.y ? 20 : 0, radius]);
  return function(d, i) {
    return i
        ? function(t) { return arc(d); }
        : function(t) { x.domain(xd(t)); y.domain(yd(t)).range(yr(t)); return arc(d); };
  };
}

function computeTextRotation(d) {
  return (x(d.x + d.dx / 2) - Math.PI / 2) / Math.PI * 180;
}

</script>

于 2015-02-19T10:22:20.713 回答