10

如何将图例添加到多线系列图表?我试过了,但没有显示任何图例。

这里的块:

http://bl.ocks.org/3884955

当各种级数收敛到同一点时存在缺陷,例如零。所有标签将相互叠加。而不是去这些标签,一个传统的传说会很有用。

我试着添加这个

var legend = svg.append("g")
.attr("class", "legend")
.attr("height", 100)
.attr("width", 100)
.attr('transform', 'translate(-20,50)');    

legend.selectAll('rect')
  .datum(function(d) { return {name: d.name, value: d.values[d.values.length - 1]}; })
  .append("rect")
  .attr("x", width)
  .attr("y", function(d, i){ return i *  20;})
  .attr("width", 10)
  .attr("height", 10)
  .style("fill", function(d) { 
    return color.domain(d3.keys(d[0]).filter(function(key) { return key !== "day"; }));
  });

legend.selectAll('text')
  .datum(function(d) { return {name: d.name, value: d.values[d.values.length - 1]}; })
  .append("text")
  .attr("x", width)
  .attr("y", function(d, i){ return i *  20 + 9;})
  .text(function(d) {
  return d.name;
  });

在代码末尾,键名(d.name)与我的数据格式匹配,但不显示。在某一时刻,它显示了图表右侧的所有黑框,这意味着我很接近,但我错过了一些重要的东西

任何见解表示赞赏

4

2 回答 2

13

是您的代码的固定和重构版本。

    var legend = svg.selectAll('g')
        .data(cities)
        .enter()
      .append('g')
        .attr('class', 'legend');

    legend.append('rect')
        .attr('x', width - 20)
        .attr('y', function(d, i){ return i *  20;})
        .attr('width', 10)
        .attr('height', 10)
        .style('fill', function(d) { 
          return color(d.name);
        });

    legend.append('text')
        .attr('x', width - 8)
        .attr('y', function(d, i){ return (i *  20) + 9;})
        .text(function(d){ return d.name; });

您需要使用enter(),但enter()exit()方法不能与 一起使用datum()。引用d3 wiki

selection.datum([值])

获取或设置每个选定元素的绑定数据。与 selection.data 方法不同,此方法不计算连接(因此不计算进入和退出选择)。

于 2013-02-09T19:13:21.007 回答
0

在 .datum() 函数调用之后,您似乎缺少 .enter() 。

legend.selectAll('rect')

  .datum(function(d) { return {name: d.name, value: d.values[d.values.length - 1]}; })

  .enter() // <======

  .append("rect")

  .attr("x", width)

  .attr("y", function(d, i){ return i *  20;})

  .attr("width", 10)

  .attr("height", 10)

  .style("fill", function(d) { 

    return color.domain(d3.keys(d[0]).filter(function(key) { return key !== "day"; }));

在附加“rect”之前,您必须使用 enter() 函数,请参阅链接以获取详细说明单击此处

于 2013-02-08T18:32:24.510 回答