2015-05-24 32 views
2

我们有一些数据D3中的工具提示如何动态获取数据?

University,Total,Females,Males,Year,Type 
PortSaid,13817,6679,7138,2012,Public 
PortSaid,14790,7527,7263,2013,Public 
PortSaid,17295,8509,8786,2010,Public 
6OctoberUniversity,12507,4297,8210,2012,Private 
6OctoberUniversity,14608,5360,9248,2013,Private 

我尝试创建饼图这样Block附有一个动态提示。 我创建了一个HTML元素手动

 <p> 
      <strong>University is </strong> 
      <span id="UniversityName"></span> 
     </p> 
     <p><span id="NumberStudents"></span> Students</p> 

和创建弧代码和工具提示

 svg.selectAll("path") 
      .data(pie(data)) 
      .enter().append("path") 
      .each(function(d) { d.outerRadius = outerRadius - 20; }) 
      .attr("d", arc) 
      .on("mouseover", arcTween(outerRadius, 0)) 
      .on("mouseout", arcTween(outerRadius - 20, 150)) 
      .on("mouseover", function(d) { 
       var xPosition = 100; 
       var yPosition = 100; 
       d3.select("#tooltip") 
        .data(pie(data)) 
         .style("left", xPosition + "px") 
         .style("top", yPosition + "px") 
         .select("#NumberStudents") 
         .text(function(d) { return d.value }) 
         .select("#UniversityName") 
         .text(function(d) { return d.value }); 
        //Show the tooltip 
       d3.select("#tooltip").classed("hidden", false); 
       }) 
      .on("mouseout", function() { 

       //Hide the tooltip 
       d3.select("#tooltip").classed("hidden", true);   
      }) 

问题: 工具提示总是返回总计列的第一个值,即13817.它如何根据鼠标悬停弧动态显示正确的值?


编辑:在HTML模板提示代码片段&添加第二个数据点#UniversityName。

问题2 作为@minikomi指出的,正确的数据结合将导致与每个弧被获取正确地相关联的值。然而,似乎每条弧线都有一个附加的值,正确的标记为合计。 但是,这会在何处留下每行的其余数据,如女性,男性?我怎样才能将它们绑定到工具提示?

+0

这将是简单的'd3.select(“#提示”)文本(d.value );',不是? –

+0

关于您的编辑:请查看我的评论,我对编辑的回答和[文档](https://github.com/mbostock/d3/wiki/Pie-Layout#_pie)。这些文档非常全面,所以如果您尝试从块学习,最好阅读每行,并检查它在另一个选项卡中处理文档的方式。 – minikomi

+0

@minikomi我无法将文档与JavaScript的数据模型相关联,它会让人感到困惑。使用控制台猜测/评估数据的任何给定点几乎是无用的(尽管在文档中推荐!)感谢您的帮助,我会给他们一个新的看法 –

回答

4

这可能是值得回顾d3 & data binding背后的想法。

这里:

.on("mouseover", function(d) { 
      var xPosition = 100; 
      var yPosition = 100; 
      d3.select("#tooltip") 
       .data(pie(data)) // re-bind tooltip with entire data set 
        .style("left", xPosition + "px") 
        .style("top", yPosition + "px") 
        .select("#NumberStudents") 
        .text(function(d) { return d.value }); 
       //Show the tooltip 
      d3.select("#tooltip").classed("hidden", false); 
      }) 

原始data是一个数组。当您使用.data,.enter.each时,不仅会创建饼图的一部分,而且每个部分还会绑定一个数据点。

因此,当您告诉段响应mouseover事件时,回调函数的参数d将由d3设置为该段的绑定数据点。

相反,在上面的代码中,选择#tooltip元素之后,有以.data(pie(data))通话 - 将结合的整个数据每次鼠标悬停时间设置的提示 - 而且是意外的行为的原因你观察。

相反,使用单个数据项(在此函数中d),并将其值设定工具提示文本:

.on("mouseover", function(d) { 
      // d = the single data point used 
      //  to create the segment here 
      var xPosition = 100; 
      var yPosition = 100; 
      d3.select("#tooltip") 
       .style("left", xPosition + "px") 
       .style("top", yPosition + "px") 
       .select("#NumberStudents") 
        .text(d.value); 

      d3.select("#tooltip").classed("hidden", false); 
      }) 

要访问的其它值(从用于创建一个单独的饼片),请检查docs的饼图布局。原始数据将位于d的.data属性中。因此,举例来说,假设你的提示有#SchoolType<span>那么你可以从Type属性一样设置文本:

.on("mouseover", function(d) { 

      var xPosition = 100; 
      var yPosition = 100; 
      d3.select("#tooltip") 
       .style("left", xPosition + "px") 
       .style("top", yPosition + "px") 
       .select("#NumberStudents") 
        .text(d.value) 

      //d.data will hold the original data map 
      d3.select("#tooltip #SchoolType").text(d.data["Type"]); 

      d3.select("#tooltip").classed("hidden", false); 
      }) 
+0

这有效,但我仍然不完全理解。 似乎.data(饼图(数据))创建一个弧阵列,每个都有附加的总值。然而,与数据相关的其余数据,即女性,男性,年份等(其将需要物体)缺失。我无法参考他们的完整工具提示。 问题:如何才能参考每行CVS数据的第二个数据点?这甚至有可能吗? –

+0

检查[docs](https://github.com/mbostock/d3/wiki/Pie-Layout#_pie)的饼图布局。原始数据将位于d的'.data'属性中。 所以,你可以说d.data [“女性”],并获得女性的价值,例如。 – minikomi