【问题标题】:d3 JSON multiple line chartd3 JSON 多折线图
【发布时间】:2012-12-27 20:13:01
【问题描述】:

我正在尝试从一个 JSON blob 中绘制一个包含多条线的图,如下所示:

{"2007": [{"val":10, "mon":10}, {"val":20, "mon":11}, {"val":40, "mon":12}, ...],
 "2008": [{"val":20, "mon":8}, {"val":20, "mon":9}, {"val":40, "mon":10}, ...],
  ...
 "2012": [{"val":40, "mon":8}, {"val":50, "mon":9}, {"val":60, "mon":10}, ...]
}

数据基本上是每年的月度总计,有些年份有些月份没有数据。不过,我不知道如何解析 d3 中的数据。我尝试了各种方法,例如

var line = d3.svg.line()
 .interpolate("basis")
.x(function(d) { return x(d.mon); })
.y(function(d) { return y(d.val); });

svg.selectAll(".line")
 .data(series)
 .enter().append("path")
 .attr("class", "line")
 .attr("d", line);

但我似乎无法将数据输入 SVG 行。有什么建议?有没有更好的方法来构建 JSON?

【问题讨论】:

  • 多行从哪里来?您想每年生产一条生产线吗?
  • 是的,每年想要一行。

标签: javascript json d3.js


【解决方案1】:

如果其他人遇到此问题,请执行以下操作。诀窍是传递一个函数,该函数在路径元素的“d”属性中返回关联数组中的值。

  entries = d3.entries(data);

  var colors = d3.scale.category20()
    .domain(d3.keys(data));

  var line = d3.svg.line()
    .interpolate("basis")
    .x(function(d) { return x(d.month) })
    .y(function(d) { return y(d.value) });

  svg1.selectAll(".line")
    .data(entries)
  .enter().append("path")
    .attr("class", "line")
    // function(d), not just line function 
    .attr("d", function(d){ return  line(d.value); })
    .attr("stroke", function(d) { return colors(d.key) });

这个答案也有一些帮助: Using nested data with javascript D3 problem

【讨论】:

  • svg1 在哪里定义?
【解决方案2】:

我的猜测是这里最大的问题是你从一个对象开始,而不是一个数组。 d3.data 接受一个数组,而不是一个对象,因此您可能需要像这样设置数据:

[
  [{"val":10, "mon":10}, {"val":20, "mon":11}, {"val":40, "mon":12}, ...],
  [{"val":20, "mon":8}, {"val":20, "mon":9}, {"val":40, "mon":10}, ...],
  ...
]

如果您需要将当前数据转换为这种格式,请查看d3.entries,它会为您提供一个包含您的键以及点数组的数组:

[
  {
    key: "2008",
    value: [{"val":10, "mon":10}, {"val":20, "mon":11}, {"val":40, "mon":12}, ...]
  },
  { 
    key: "2008",
    value: [{"val":20, "mon":8}, {"val":20, "mon":9}, {"val":40, "mon":10}, ...]
  },
  ...
]

请参阅此小提琴以获取图表的简单案例版本,使用上面的第一种数据格式:http://jsfiddle.net/nrabinowitz/kmmyc/

【讨论】:

  • 感谢您的提示!我认为 d3.entries() 业务可能会成功。我仍然对如何在 d3 中解析它感到有些困惑,但我认为它朝着正确的方向前进。
猜你喜欢
  • 1970-01-01
  • 2015-01-24
  • 1970-01-01
  • 2017-06-24
  • 1970-01-01
  • 2022-09-23
  • 1970-01-01
  • 2021-10-25
  • 2013-09-28
相关资源
最近更新 更多