2012-05-11 80 views
12

我是一名新手程序员,所以对于大多数人来说,这可能是一件容易的事情。这张和弦图的标签和/或鼠标悬停文字需要哪些代码?在D3和弦图中添加标签

http://mbostock.github.com/d3/ex/chord.html

enter image description here

我需要它,以显示在外部带的类别的名称。当您将鼠标悬停时,我想显示确切的数字和两个类别。像这样的东西:'A:5件B'。

编辑:

我仍然无法弄清楚如何实现它在我的代码。有人可以填写我的示例代码,解释发生了什么?

<!DOCTYPE html> 
<html> 
    <head> 
    <meta http-equiv="Content-type" content="text/html; charset=utf-8"> 
    <title>Selecties EK 2010</title> 
    <script type="text/javascript" src="d3.v2.js"></script> 
    <link type="text/css" rel="stylesheet" href="ek2010.css"/> 
    </head> 
    <body> 
    <div id="chart"></div> 
    <script type="text/javascript" src="ek2010.js"></script> 
    </body> 
</html> 

// From http://mkweb.bcgsc.ca/circos/guide/tables/ 
var chord = d3.layout.chord() 
    .padding(.05) 
    .sortSubgroups(d3.descending) 
    .matrix([ 
     [0, 0, 7, 5], 
     [0, 0, 8, 3], 
     [7, 8, 0, 0], 
     [5, 3, 0, 0] 
    ]); 

var width = 1000, 
    height = 1000, 
    innerRadius = Math.min(width, height) * .3, 
    outerRadius = innerRadius * 1.1; 

var fill = d3.scale.ordinal() 
    .domain(d3.range(4)) 
    .range(["#000000", "#FFDD89", "#957244", "#F26223"]); 

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

svg.append("g") 
    .selectAll("path") 
    .data(chord.groups) 
    .enter().append("path") 
    .style("fill", function(d) { return fill(d.index); }) 
    .style("stroke", function(d) { return fill(d.index); }) 
    .attr("d", d3.svg.arc().innerRadius(innerRadius).outerRadius(outerRadius)) 
    .on("mouseover", fade(.1)) 
    .on("mouseout", fade(1)); 

var ticks = svg.append("g") 
    .selectAll("g") 
    .data(chord.groups) 
    .enter().append("g") 
    .selectAll("g") 
    .data(groupTicks) 
    .enter().append("g") 
    .attr("transform", function(d) { 
     return "rotate(" + (d.angle * 180/Math.PI - 90) + ")" 
      + "translate(" + outerRadius + ",0)"; 
    }); 

ticks.append("line") 
    .attr("x1", 1) 
    .attr("y1", 0) 
    .attr("x2", 5) 
    .attr("y2", 0) 
    .style("stroke", "#000"); 

ticks.append("text") 
    .attr("x", 8) 
    .attr("dy", ".35em") 
    .attr("text-anchor", function(d) { 
     return d.angle > Math.PI ? "end" : null; 
    }) 
    .attr("transform", function(d) { 
     return d.angle > Math.PI ? "rotate(180)translate(-16)" : null; 
    }) 
    .text(function(d) { return d.label; }); 

svg.append("g") 
    .attr("class", "chord") 
    .selectAll("path") 
    .data(chord.chords) 
    .enter().append("path") 
    .style("fill", function(d) { return fill(d.target.index); }) 
    .attr("d", d3.svg.chord().radius(innerRadius)) 
    .style("opacity", 1); 

/** Returns an array of tick angles and labels, given a group. */ 
function groupTicks(d) { 
    var k = (d.endAngle - d.startAngle)/d.value; 
    return d3.range(0, d.value, 1).map(function(v, i) { 
    return { 
     angle: v * k + d.startAngle, 
     label: i % 5 ? null : v/1 + " internat." 
    }; 
    }); 
} 

/** Returns an event handler for fading a given chord group. */ 
function fade(opacity) { 
    return function(g, i) { 
    svg.selectAll("g.chord path") 
     .filter(function(d) { 
      return d.source.index != i && d.target.index != i; 
     }) 
     .transition() 
     .style("opacity", opacity); 
    }; 
} 

回答

1

你需要看看在Github上的d3.js维基selection.on()事件处理程序。这将向您展示如何将事件添加到元素,包括mouseover和mouseout。如果你将鼠标悬停在弦组在外圈,你会看到所有的其他弦组淡出

svg.append("g") 
    .selectAll("path") 
    .data(chord.groups) 
.enter().append("path") 
    .style("fill", function(d) { return fill(d.index); }) 
    .style("stroke", function(d) { return fill(d.index); }) 
    .attr("d", d3.svg.arc().innerRadius(innerRadius).outerRadius(outerRadius)) 
    .on("mouseover", fade(.1)) 
    .on("mouseout", fade(1)); 

:如果你看一下你链接到这个例子,可以看到已经是它的一个实例。

如果您希望标签弹出包含字符串(文本),您将需要使用另一个JS库来定义它们。一个我知道作品是Tipsy,并有一个例子与d3 here一起使用它。然后,您应该可以简单地使用选择器来选择想要说明此行为的SVG元素。

希望有所帮助。

+0

当。迈克打败了我,当然有更好的答案... – tatlar