【问题标题】:How to make multiple charts with d3.chart using nested data如何使用 d3.chart 使用嵌套数据制作多个图表
【发布时间】:2014-08-14 19:48:29
【问题描述】:

我正在尝试使用 d3.chart 框架创建多个图表。这似乎是一个常见的用例:d3.chart 的全部意义在于图表是可重用的!如果你能指出一个很棒的例子(:

我通过这个 (https://github.com/misoproject/d3.chart/wiki/quickstart) 教程创建了一个非常基本的“圆形图”。 (我完全复制了代码)。现在我想做的是为几组数据创建一个单独的图表。 我稍微编辑了一下。 在编辑之前,设置我们调用的图表:

var data = [1,3,4,6,10];

var chart = d3.select("body")
  .append("svg")
  .chart("Circles")
    .width(100)
    .height(50)
    .radius(5);

chart.draw(data);

我尝试将其更改为:

var data = [{key:1, values:[1,3,4,6,10]}, 
{key:2, values:[5,2,10,8,11]}, 
{key:3, values:[1,5,9,16,12]}]

var chart = d3.select("body")
  .selectAll("chart)
  .data(data)
  .enter()
  .append("svg")
  .chart("Circles")
    .width(100)
    .height(50)
    .radius(5);

chart.draw(function(d) { return d.values; });

但这不起作用。你可以在 3 个不同的地方看到一个圆的角,但是 其余部分被切断。但是,如果替换

chart.draw(function(d) { return d.values; });

chart.draw([1,3,4,6,10]);

它正确地生成了 3 个圆形图,所有这些都包含一个数据集。当我添加时

chart.draw(function(d) { console.log(d.values) return d.values; }); 

控制台显示了我试图传递的 3 个数组!我不明白这里发生了什么破坏了代码。它不应该与将实际数组传递给 3 个单独的图表完全相同吗?

这里是 JS bin 设置的链接:http://jsbin.com/jenofovogoke/1/edit?html,js,console,output 随意摆弄它!

代码在底部。

我对 java 脚本和 d3 很陌生,对 d3.chart 完全陌生。任何帮助将不胜感激!

【问题讨论】:

  • 我通过链接到 d3.chart 而不是包含代码,稍微清理了那个 bin。见jsbin.com/jenofovogoke/3/edit?html,js,output。如果您打开 浏览器的 JavaScript 控制台,您会看到“错误: 属性 cx="NaN" 的值无效,这可能解释了为什么您的圈子都显示在彼此之上.
  • @FrankvanPuffelen 感谢您清理它!但这并没有真正解决我的问题:它没有找到 cx 的原因是因为它没有正确访问数据(cx 依赖于值)。如果您将chart.data的控制台日志放在初始化下的dataBind下方,您可以看到它将数据记录为“function(d){return d.values;}”,就像它是一个字符串一样,而不是记录实际对应于 d.values 的数组。我的问题是为什么它不是/我怎样才能让它正确访问数据。
  • 我一直试图弄清楚发生了什么,但没有成功。在某处,您的xScale 似乎中断了。但不幸的是,我找不到发生这种情况的地方。也许这里的其他人运气更好。
  • @FrankvanPuffelen 如果你有兴趣,我想出了答案!不幸的是,d3.chart 的绘图函数只能接受一个数据对象,因此我没有传递一个计算数据对象的函数,而是通过循环并手动设置每个图表的数据。它现在有效! (:耶!现在如果我能弄清楚如何在我要设置的图层中设置 d3 图表图层.. :P
  • 我尝试删除数据访问功能,但显然做错了什么。 :-/ 太好了,你想通了,然后回来自我回答。谢谢!

标签: javascript svg d3.js charts nested


【解决方案1】:

我问了帮助运行 d3.chart 的 Irene Ros,她告诉我,问题在于 d3.chart 的 draw 方法只能接受数组或数据对象——它不能接受函数。她给了我一些有用的提示来解决这个问题:使用转换函数在图表中编辑我的数据,而不是使用函数,或者创建一个包含多个图表的图表(参见https://gist.github.com/jugglinmike/6004102这个例子)。

但最后我发现对我来说最简单的解决方案是手动设置数据。感觉有点过时了,因为 D3 已经为您完成了这项工作,但它比更改我的图表的整个设置要简单得多,并且允许嵌套数据(耶!)。

var svg = d3.select("body")
  .selectAll("svg")
  .data(data)
  .enter()
  .append("svg");

svg.each(function(d, i) {
  var chart = d3.select(this)
    .chart("Circles")
    .height(50)
    .width(100)
    .radius(5)
  var data = d.values;
  chart.draw(data);
});

【讨论】:

  • 不应该是svg.each吗?
猜你喜欢
  • 1970-01-01
  • 2021-02-12
  • 2015-12-06
  • 1970-01-01
  • 1970-01-01
  • 2011-10-30
  • 1970-01-01
  • 2019-02-12
  • 1970-01-01
相关资源
最近更新 更多