2015-12-10 148 views
0

我將我的json數據的第一級孩子的所有「名字」寫在DIV中。 當我將鼠標懸停在名稱上時,如何爲圖形中的對應弧線着色(如紅色)?通過鼠標懸停的D3選擇

這是fiddle,代碼如下。

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

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

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

 
var color = d3.scale.category20c(); 
 

 
var svg = d3.select("body").append("svg") 
 
    .attr("width", width) 
 
    .attr("height", height) 
 
    .append("g") 
 
    .attr("transform", "translate(" + width/2 + "," + (height/2 + 10) + ")"); 
 

 
var partition = d3.layout.partition() 
 
    .sort(null) 
 
    .value(function(d) { return 1; }); 
 

 
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)); }); 
 

 
// Keep track of the node that is currently being displayed as the root. 
 
var node; 
 

 
\t var root = JSON.parse('{ "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} ] } ]}'); 
 

 
root.children.forEach(function(obj) { d3.select("#list").html(d3.select("#list").html() + "<br>" +obj.name); }); 
 

 

 

 
    node = root; 
 
    var nodes = partition.nodes(root) 
 
// \t .filter(function(d) { 
 
// \t \t return (d.dx > 0.005); // 0.001 radians = 0.05 degrees 
 
//  }) 
 
    ; 
 
\t 
 
    var path = svg.datum(root).selectAll("path") 
 
     .data(nodes) 
 
    .enter().append("path") 
 
     .attr("d", arc) 
 
     .style("fill", function(d) { return color((d.children ? d : d.parent).name); }) 
 
     .on("click", click) 
 
     .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(1000) 
 
     .attrTween("d", arcTweenData); 
 
    }); 
 

 
    function click(d) { 
 
    node = d; 
 
    path.transition() 
 
     .duration(1000) 
 
     .attrTween("d", arcTweenZoom(d)); 
 
    } 
 

 

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

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

 
// When switching data: interpolate the arcs in data space. 
 
function arcTweenData(a, i) { 
 
    var oi = d3.interpolate({x: a.x0, dx: a.dx0}, a); 
 
    function tween(t) { 
 
    var b = oi(t); 
 
    a.x0 = b.x; 
 
    a.dx0 = b.dx; 
 
    return arc(b); 
 
    } 
 
    if (i == 0) { 
 
    // If we are on the first arc, adjust the x domain to match the root node 
 
    // at the current zoom level. (We only need to do this once.) 
 
    var xd = d3.interpolate(x.domain(), [node.x, node.x + node.dx]); 
 
    return function(t) { 
 
     x.domain(xd(t)); 
 
     return tween(t); 
 
    }; 
 
    } else { 
 
    return tween; 
 
    } 
 
} 
 

 
// When zooming: interpolate the scales. 
 
function arcTweenZoom(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); }; 
 
    }; 
 
}
body { 
 
    font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; 
 
    margin: auto; 
 
    position: relative; 
 
    width: 700px; 
 
} 
 

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

 
path { 
 
    stroke: #fff; 
 
    fill-rule: evenodd; 
 
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.4.11/d3.min.js"></script> 
 
<form> 
 
    <label><input type="radio" name="mode" value="size"> Size</label> 
 
    <label><input type="radio" name="mode" value="count" checked> Count</label> 
 
</form> 
 
<div id="list"></div>

回答

2

EDITS

就明白了我,我回答了你的倒退問題:)

首先我要建立與數據更d3十歲上下的方式列表-binding:

d3.select("#list") 
    .selectAll('div') 
    .data(root.children) 
    .enter() 
    .append('div') 
    .text(function(d){ 
    return d.name; 
    }) 
    // on mouse over, find all arcs 
    // at given depth and color them 
    .on('mouseover', function(d){ 
    d3.selectAll('.' + d.name + '_arc_1_depth') 
     .style('fill', function(){ 
      // stash old color for revert 
      d._oldColor = d3.select(this).style('fill'); 
      return 'red'; 
     }); 
    }) 
    // revert color 
    .on('mouseout', function(d){ 
    d3.selectAll('.' + d.name + '_arc_1_depth') 
     .style('fill', d._oldColor); 
    }); 

然後,當你建立你的弧線,賦予他們獨特的類名後找到他們:

.attr('class', function(d){ 
    return d.name + '_arc_' + d.depth + '_depth'; 
}) 

工作代碼:

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

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

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

 
var color = d3.scale.category20c(); 
 

 
var svg = d3.select("body").append("svg") 
 
    .attr("width", width) 
 
    .attr("height", height) 
 
    .append("g") 
 
    .attr("transform", "translate(" + width/2 + "," + (height/2 + 10) + ")"); 
 

 
var partition = d3.layout.partition() 
 
    .sort(null) 
 
    .value(function(d) { return 1; }); 
 

 
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)); }); 
 

 
// Keep track of the node that is currently being displayed as the root. 
 
var node; 
 

 
\t var root = JSON.parse('{ "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.select("#list") 
 
    .selectAll('div') 
 
    .data(root.children) 
 
    .enter() 
 
    .append('div') 
 
    .text(function(d){ 
 
    \t return d.name; 
 
    }) 
 
    .on('mouseover', function(d){ 
 
    \t d3.selectAll('.' + d.name + '_arc_1_depth') 
 
    \t .style('fill', function(){ 
 
     \t d._oldColor = d3.select(this).style('fill'); 
 
     \t return 'red'; 
 
     }); 
 
    }) 
 
    .on('mouseout', function(d){ 
 
    \t d3.selectAll('.' + d.name + '_arc_1_depth') 
 
    \t .style('fill', d._oldColor); 
 
    }); 
 
    
 
    node = root; 
 
    var nodes = partition.nodes(root) 
 
// \t .filter(function(d) { 
 
// \t \t return (d.dx > 0.005); // 0.001 radians = 0.05 degrees 
 
//  }) 
 
    ; 
 
\t 
 
    var path = svg.datum(root).selectAll("path") 
 
     .data(nodes) 
 
    .enter().append("path") 
 
     .attr("d", arc) 
 
     .style("fill", function(d) { return color((d.children ? d : d.parent).name); }) 
 
     .on("click", click) 
 
     .attr('class', function(d){ 
 
     \t return d.name + '_arc_' + d.depth + '_depth'; 
 
     }) 
 
     .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(1000) 
 
     .attrTween("d", arcTweenData); 
 
    }); 
 

 
    function click(d) { 
 
    node = d; 
 
    path.transition() 
 
     .duration(1000) 
 
     .attrTween("d", arcTweenZoom(d)); 
 
    } 
 

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

 
// When switching data: interpolate the arcs in data space. 
 
function arcTweenData(a, i) { 
 
    var oi = d3.interpolate({x: a.x0, dx: a.dx0}, a); 
 
    function tween(t) { 
 
    var b = oi(t); 
 
    a.x0 = b.x; 
 
    a.dx0 = b.dx; 
 
    return arc(b); 
 
    } 
 
    if (i == 0) { 
 
    // If we are on the first arc, adjust the x domain to match the root node 
 
    // at the current zoom level. (We only need to do this once.) 
 
    var xd = d3.interpolate(x.domain(), [node.x, node.x + node.dx]); 
 
    return function(t) { 
 
     x.domain(xd(t)); 
 
     return tween(t); 
 
    }; 
 
    } else { 
 
    return tween; 
 
    } 
 
} 
 

 
// When zooming: interpolate the scales. 
 
function arcTweenZoom(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); }; 
 
    }; 
 
}
body { 
 
    font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; 
 
    margin: auto; 
 
    position: relative; 
 
    width: 700px; 
 
} 
 

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

 
path { 
 
    stroke: #fff; 
 
    fill-rule: evenodd; 
 
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.4.11/d3.min.js"></script> 
 
<form> 
 
    <label><input type="radio" name="mode" value="size"> Size</label> 
 
    <label><input type="radio" name="mode" value="count" checked> Count</label> 
 
</form> 
 
<div id="list"></div>

原單ANSWER

首先我會從數據綁定建立您的清單更d3 ISH方式:

d3.select("#list") 
    .selectAll('div') 
    .data(root.children) 
    .enter() 
    .append('div') // place a dive 
    .attr('id', function(d){ 
    return d.name; 
    }) // with a unique name 
    .text(function(d){ 
    return d.name; 
    }); 

然後添加一個mouseovermouseout到您的弧線:

.on("mouseover", function(d){ 
    d3.select('#list>#' + d.name) // find my div in my list by it's id 
     .style('background-color', color((d.children ? d : d.parent).name)); 
    }) 
    .on("mouseout", function(d){ 
    d3.select('#list>#' + d.name) 
     .style('background-color', 'transparent'); 
    })