【问题标题】:D3 JS creating a legend for a chartD3 JS 为图表创建图例
【发布时间】:2014-08-14 13:20:41
【问题描述】:

我正在尝试为图表制作自己的图例,此时出现带有颜色的条形,但没有出现文本。这是我的代码:

viz.selectAll("rect").data(data).enter().append("rect")
    .attr({
      x: margin,
      y: function (d, i) { return ((3*b)/data.length)*i; } ,
      width: 30,
      height: 15,
      fill: function(d, i) { return color(i); }
    })
.append("text").text(function (d) { return d.name; })
    .attr({
      "text-anchor" : "start",
      x: 2 * margin + parseFloat (d3.select(this).attr("width")), //doing 2* marging so I  can add some space between the text and the bar
      y: parseFloat(d3.select(this).attr("y"))
    });

我还尝试将 x 和 y 都更改为 0,以防我定位错误,但这不起作用。当我尝试使用浏览器检查元素时,我注意到它根本没有添加文本。我做错了吗?

【问题讨论】:

  • 请准备一个fiddle。代码看起来不错,所以如果没有进一步的信息就很难提供帮助。

标签: javascript d3.js charts legend


【解决方案1】:

您正在将文本添加到rect which is not possible。您应该将文本直接添加到viz

viz.selectAll("rect").data(data).enter().append("rect")
  .attr({
    x: margin,
    y: function (d, i) { return ((3*b)/data.length)*i; } ,
    width: 30,
    height: 15,
    fill: function(d, i) { return color(i); }
  });
viz.selectAll("text").data(data).enter().append("text")
  .text(function (d) { return d.name; }).attr({
    "text-anchor" : "start",
    x: 2*margin + 30,
    y: function (d, i) { return ((3*b)/data.length)*i; }
  });

或者,也许更简洁,创建g 元素并将recttext 添加到其中(使用的示例与您的示例略有不同,因为您没有提供数据):

  var vis = d3.select("#vis").append("svg")
    .attr("width", width).attr("height", height)

  var legend = ["red", "green", "blue"];
  var colors = ["#FF0000", "#00FF00", "#0000FF"];

  var margin = 10;

  vis.selectAll("g.legend").data(legend).enter().append("g")
    .attr("class", "legend").attr("transform", function(d,i) {
      return "translate(" + margin + "," + (margin + i*20) + ")";
    }).each(function(d, i) {
      d3.select(this).append("rect").attr("width", 30).attr("height", 15)
        .attr("fill", d);
      d3.select(this).append("text").attr("text-anchor", "start")
        .attr("x", 30+10).attr("y", 15/2).attr("dy", "0.35em")
        .text(d);
    });

编辑attr("dy", "0.35em") 确保文本行的中心与rect 的中心水平对齐。见the d3 wiki for an overview

【讨论】:

  • 谢谢,但你能告诉我这是什么意思吗:.attr("dy", "0.35em") ??
  • @user3281466 添加了解释。
猜你喜欢
  • 1970-01-01
  • 2015-04-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-07
  • 2019-03-09
  • 2018-06-17
相关资源
最近更新 更多