【问题标题】:d3 multiple svg with 1 row of data eachd3 多个 svg,每个 1 行数据
【发布时间】:2013-12-17 08:20:18
【问题描述】:

我遇到了一个 d3.js 问题: 我正在尝试使用 LINE 绘制几个 SVG 画布(这是一个更复杂的自定义形状,但作为示例,线条就足够了),其中线条的长度(称为“d.uni”)由数据确定。因此,每一行数据都映射到其自己的 SVG 中的一行。

我查看了多个 SVG 的示例,例如 http://bl.ocks.org/mbostock/1305111http://bl.ocks.org/mbostock/3888852 并调整了这个想法,据我所知,主要是将数据绑定到 SVG 绘图函数。

这是我的代码:

     var w = 300;
     var h = 250;
     var stemL = 100;
     var length1 = 80;
     var angle1 = -1.2;

d3.csv("data_test.csv", function(data) {

//Create SVG element
var svg = d3.select("body")
       .selectAll("svg")
       .data(data)
       .enter()
       .append("svg")
       .attr("width", w)
       .attr("height", h)

// Cat 1         
svg.selectAll("uni")
   .data(data)
   .enter()
   .append("line")
   .attr("x1", w/2)
   .attr("y1", h - stemL)
   .attr("x2", function(d) {return w/2 + length1 * d.uni * Math.sin(angle1);})
   .attr("y2", function(d) {return (h - stemL) - length1 * d.uni * Math.cos(angle1); })
   .style("stroke", "steelblue")
   .style("stroke-width", 5);

});

结果我得到了预期的 3 个 SVG(请参阅下面的 data_test.csv),但 d3 将每个 SVG 中的每一行数据绘制在彼此之上,而不是 SVG 1 中的第 1 行,SVG 2 中的第 2 行等。

我错过了什么??? :-/

非常感谢您提前提供的帮助!

伊娃

data_test.csv:

country,uni
Sweden,1.6
Germany,1
Poland,0.7

【问题讨论】:

  • 看看nested selections tutorial,我相信这就是您在这里寻找的。不过,不确定您所说的饼图布局是什么意思——看起来您并没有使用饼图布局。
  • 感谢拉尔斯的链接!所以我得到的印象是我确实需要 Cat 1/LINE 部分中的 .data(data) 以外的东西。尝试过 .data(function(d) { return d; }),但这也无济于事! :-/
  • P.S.在我的问题中删除了带有“饼图布局”的部分 - 具有误导性..
  • 嗯,你实际上并没有嵌套结构 - 使用循环可能更容易做到这一点。也就是说,遍历行并为每个行绘制 SVG/行。

标签: svg d3.js


【解决方案1】:

你有两次“.data(data)”。 “创建 SVG 元素”中的一个和“Cat 1”中的一个,这似乎是 d3 在每个 SVG 中绘制每一行数据的原因。 “创建 SVG 元素”中的“.data(data)”就足够了。

当“Cat 1”改为这个时

svg.append("line")
.attr("x1", w/2)
.attr("y1", h - stemL)
.attr("x2", function(d) {return w/2 + length1 * d.uni * Math.sin(angle1);})
.attr("y2", function(d) {return (h - stemL) - length1 * d.uni * Math.cos(angle1); })
.style("stroke", "steelblue")
.style("stroke-width", 5);

我得到了三个不同的行。

[编辑] 你也可以这样写:

var svg = d3.select("body")
        .selectAll("svg")
        .data(data)
        .enter()
        .append("svg")
        .attr("width", w)
        .attr("height", h)
        .append("line")
        .attr("x1", w/2)
        .attr("y1", h - stemL)
        .attr("x2", function(d) {return w/2 + length1 * d.uni * Math.sin(angle1);})
        .attr("y2", function(d) {return (h - stemL) - length1 * d.uni * Math.cos(angle1); })
        .style("stroke", "steelblue")
        .style("stroke-width", 5);

【讨论】:

  • 感谢您的回答!当我删除 Cat 1/ LINE 部分中的 .data(data) 时,没有绘制任何内容。我需要绑定数据,因为我指的是它,但我现在确实认为它需要是其他东西然后.data(data)。尝试 .data(function(d) { return d; }) 没有成功。
  • 你太棒了!!!!非常感谢!我忘了删除“selectAll(“uni”)”......我永远不会想到这一点!这背后的理性是什么?你的想法是什么,为什么你不需要再次绑定数据?我想从中学习!
  • 谢谢,你也可以给我的答案投票 :) 数据已经绑定到 svg 所以你不需要再添加了
  • 就这么简单,我明白了……很遗憾,我不能投票给你! :-( 声望不够...
  • d3 冒险继续! :) 下一期:stackoverflow.com/questions/20638417/…。也许你可以再帮忙? :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多