【问题标题】:Adding text to d3 circle将文本添加到 d3 圆圈
【发布时间】:2016-05-11 08:56:46
【问题描述】:

我正在使用这个示例http://bl.ocks.org/danielatkin/57ea2f55b79ae686dfc7,我正在尝试在圆圈中添加一些文字。

这就是圆圈的创建和放置方式

    var nodes = svg.selectAll("circle")
       .data(data);

    nodes.enter().append("circle")
      .attr("class", function (d, i) { return "circle_"+d.sentiment+" circle_"+i})
      .attr("cx", function (d) { return d.x; })
      .attr("cy", function (d) { return d.x; })
      .attr("r", function (d) { return d.radius; })
      .style("fill", function (d, i) { return colors['default']; })
      .on("mouseover", function (d) { showPopover.call(this, d); })
          .on("mouseout", function (d) { removePopovers(this, true); })
          .call(pulse, function(d){ return d.radius+4; }, function(d){return d.radius; });

但我不知道如何向这些圈子添加文字。

我已经推荐了thisthis 的答案,但没有成功。问题是,在遵循上述答案后,我的圈子卡在了对角线上。

谁能告诉我怎么做?

【问题讨论】:

    标签: javascript d3.js


    【解决方案1】:

    另一个接近@cyril 的选项是使用g 元素并将圆圈和文本放在里面。这为您节省了双重数据绑定和双重移动更新:

    var nodes = svg.selectAll("g")
        .data(data);
    
    var g = nodes.enter().append("g")
    
    g.append("circle")
      .attr("class", function(d) {
        return d.ratingCategory;
      })   
      .attr("r", 2)
      .attr("id", function(d){return d.objectName;})
      .on("mouseover", function(d) {
        showPopover.call(this, d);
      })
      .on("mouseout", function(d) {
        removePopovers();
      });
    
      g.append("text")
        .attr("dx",12)
        .attr("dy",".35em")
        .text(function(d){
            return d.objectName;
        });
    

    并在tick函数中更新节点位置为:

    nodes.each(collide(.2))
      .attr("transform", function(d){ //<-- use transform it's not a g
        return "translate(" + d.x + "," + d.y + ")";
      });
    

    更新block

    【讨论】:

    • 绝对比我的好:)
    • 说得很有道理。我想再问一个问题,如果你能帮我解决这个问题。我想在多个地方制作这些气泡,所以我想知道哪些是可以重复使用的模块化组件/方法来再次创建气泡?
    【解决方案2】:

    问题一:

    您在圆 dom 内制作文本,这是不正确的。

    &lt;circle class="Low" cx="521.4462169807987" cy="183.39012004057906" r="10" id="171" data-original-title="" title="" aria-describedby="popover833687"&gt;&lt;text dx="12" dy=".35em"&gt;171&lt;/text&gt;&lt;/circle&gt;

    应该是这样的:

    &lt;circle class="ratingCategory1" cx="343.02601945806816" cy="333.91072717787176" r="10" id="9" data-original-title="" title="" aria-describedby="popover766707"&gt;&lt;/circle&gt;

    &lt;text x="317.17351217946583" y="310.10556778212015" dx="12" dy=".35em" class="All-Objects"&gt;4&lt;/text&gt;

    如何做到这一点:

    nodes.enter().append("circle") //make circle
        //.attr("class", "node")
         .attr("class", function(d) {
          return d.ratingCategory;
        })
        .attr("cx", function(d) {
          return d.x;
        })
        .attr("cy", function(d) {
          return d.y;
        })
        .attr("r", 2)
        .attr("id", function(d){return d.objectName;})
        .on("mouseover", function(d) {
          showPopover.call(this, d);
        })
        .on("mouseout", function(d) {
          removePopovers();
        })
        ;
    
    
    
    var text = svg.selectAll("text")
            .data(data).enter().append("text")
         .attr("x", function(d) {
          return d.x;
        })
        .attr("y", function(d) {
          return d.y;
        })
            .attr("dx",12)
            .attr("dy",".35em")
            .text(function(d){
                return d.objectName;
            });
    

    问题 2

    在 tick 函数中,您只更新了圆圈而不是文本,您应该同时更新两者:

         //update circle
         d3.selectAll("circle").each(collide(.2))
           .attr("cx", function (d) { return d.x; })
           .attr("cy", function (d) { return d.y; });
      //update tick 
      d3.selectAll("text").each(collide(.2))
           .attr("x", function (d) { return d.x -20; })
           .attr("y", function (d) { return d.y; });
    

    工作代码here

    【讨论】:

    • 太好了,效果惊人。如果你能帮我解决这个问题,我想再问一个问题。我想在多个地方制作这些气泡,所以我想知道哪些是可以重复使用的模块化组件/方法来再次创建气泡?
    猜你喜欢
    • 2012-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-03
    • 1970-01-01
    • 1970-01-01
    • 2014-05-26
    相关资源
    最近更新 更多