在D3图表的Circle中插入文字 [英] Insert text inside Circle in D3 chart

查看:272
本文介绍了在D3图表的Circle中插入文字的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想在我的Circle中插入一些文本,这些文本是使用D3.js在气泡图中绘制的.
我能够根据提供给它的数据在svg中绘制圆,但是在向其附加文本时遇到问题.
下面是我的代码:

I want to insert some text inside my Circle which is plot in bubble chart using D3.js.
I am able to draw circle in svg as per the data provided to it, but facing a problem while append text to it.
below is my code:

<script type="text/javascript">
var sampleData = [{"x": 8,"y": 1}, {"x": 2,"y": 1}, {"x": 4,"y": 1},{"x": 5,"y": 1}];
 // {"x": 6,"y": 40}, {"x": 8,"y": 100}, {"x": 10,"y": 60}];

$(function() {
  InitChart();
});
function InitChart() {
  // Chart creation code goes here
  var vis = d3.select("#svgVisualize");
  var xRange = d3.scale.linear().range([40, 400]).domain([0,10]);
  var yRange = d3.scale.linear().range([200, 40]).domain([0,2]);
  /* var xRange = d3.scale.linear().range([40, 400]).domain([d3.min(sampleData, function(d) {
      return (d.x);
  }), d3.max(sampleData, function(d) {
    return d.x;
  })]);
  var yRange = d3.scale.linear().range([400, 40]).domain([d3.min(sampleData, function(d) {
      return d.y;
  }), d3.max(sampleData, function(d) {
    return d.y;
  })]); */
  var xAxis = d3.svg.axis().scale(xRange).ticks(2);
  var yAxis = d3.svg.axis().scale(yRange).ticks(2).orient("left");
  vis.append("svg:g").call(xAxis).attr("transform", "translate(0,200)");
  vis.append("svg:g").call(yAxis).attr("transform", "translate(40,0)");

  var circles = vis.selectAll("circle").data(sampleData);

  circles
      .enter()
      .insert("circle")
      .attr("cx", function(d) { return xRange (d.x); })
      //.attr("cy", function(d) { return yRange (d.y); })
      .attr("cy", function(d) { return yRange (d.y); })
      .attr("r", function(d) { return Math.log(d.x) * 30; })
      .attr("stroke","black")
      .style("fill", "yellow");

  var text = vis.selectAll("text")
                          .data(sampleData)
                          .enter()
                          .insert("text");

  //Add SVG Text Element Attributes
  var textLabels = text
                   .attr("x", function(d) { return d.cx; })
                   .attr("y", function(d) { return d.cy; })
                   .text( function (d) { return "( " + d.cx + ", " + d.cy +" )"; })
                   .attr("font-family", "sans-serif")
                   .attr("font-size", "20px")
                   .attr("fill", "red");

}
</script>

<body>
<svg id="svgVisualize" width="500" height="250" style="border:1px solid Red;"></svg>
</body>

有人可以建议上面的代码有什么问题吗? 谢谢

Can anyone suggest what is the problem with above code? Thanks

推荐答案

执行此操作时:

var text = vis.selectAll("text")
    .data(sampleData)
    .enter()
    .insert("text");

您正在选择该SVG中已经存在的<text>元素(在您的情况下,为轴的刻度).因此,您的输入"选择为空.

You are selecting <text> elements that already exist in that SVG (in your case, the axes' ticks). Because of that, your "enter" selection is empty.

解决方案:选择不存在的内容,例如null:

Solution: select something that doesn't exist, like null:

var text = vis.selectAll(null)
    .data(sampleData)
    .enter()
    .insert("text");

这是更新的代码:

var sampleData = [{
  "x": 8,
  "y": 1
}, {
  "x": 2,
  "y": 1
}, {
  "x": 4,
  "y": 1
}, {
  "x": 5,
  "y": 1
}];

var vis = d3.select("svg");
var xRange = d3.scale.linear().range([40, 400]).domain([0, 10]);
var yRange = d3.scale.linear().range([200, 40]).domain([0, 2]);

var xAxis = d3.svg.axis().scale(xRange).ticks(2);
var yAxis = d3.svg.axis().scale(yRange).ticks(2).orient("left");
vis.append("svg:g").call(xAxis).attr("transform", "translate(0,200)");
vis.append("svg:g").call(yAxis).attr("transform", "translate(40,0)");

var circles = vis.selectAll("circle").data(sampleData);

circles
  .enter()
  .append("circle")
  .attr("cx", function(d) {
    return xRange(d.x);
  })
  //.attr("cy", function(d) { return yRange (d.y); })
  .attr("cy", function(d) {
    return yRange(d.y);
  })
  .attr("r", function(d) {
    return Math.log(d.x) * 30;
  })
  .attr("stroke", "black")
  .style("fill", "yellow");

var text = vis.selectAll(null)
  .data(sampleData)
  .enter()
  .append("text");

var textLabels = text
  .attr("x", function(d) {
    return xRange(d.x);
  })
  .attr("text-anchor", "middle")
  .attr("y", function(d) {
    return yRange(d.y);
  })
  .text(function(d) {
    return "( " + d.x + ", " + d.y + " )";
  })
  .attr("font-family", "sans-serif")
  .attr("font-size", "10px")
  .attr("fill", "red");

line, path{
  fill: none;
  stroke: black;
}

<script src="https://d3js.org/d3.v3.min.js"></script>
<svg width="400" height="220"></svg>

PS:请勿使用insert,而应使用append.

PS: Don't use insert, use append instead.

这篇关于在D3图表的Circle中插入文字的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆