javascript - 在 d3 中加载多行数据的默认格式是什么?

标签 javascript arrays json d3.js charts

我正在尝试使用 d3 创建多折线图。我可以在 Controller 中以任何格式操作我的数据并将其传递给图形,但不确定 d3 接受的默认格式或最佳实践是什么。示例非常不同,并且使用不同的方法使用不同形式的条目,例如:

文件阅读器:

 csv()
 tsv()
 col1,col2,col3
 x1,y1,y2,...
 x2,y1,y2,...

或对象数组:

[
    {key:"col1",value:[[x1,y1],[x2,y2],...]},
    {key:"col2",value:[[x1,y1],[x2,y2],...]},
]

 [ 
 { label: "col1", 
    x: [x1, x2, x3,...], 
    y: [y1, y2, y3,...] }, 
 { label: "col2", 
    x: [x1, x2, x3,...], 
    y: [y1, y2, y3,...] } 
 ] ;

还有很多其他格式...

但基本上我正在寻找一种默认格式,我可以将多系列数据传递给 d3,而图表代码中的数据操作量较少。我只想将准备好的数据传递给 d3。

最佳答案

而不是回答“在 d3 中加载多行数据的默认格式是什么?”,这是非常模糊和明显基于意见的(因为没有默认格式),我将只解释一些连接数据的基本 D3 原则。

数据方法 (selection.data()) 接受 3 个东西:

  • 一个数组
  • 一个函数
  • 没有

因此,我们将使用数组来存储多行数据。

现在是重要的部分:线生成器本身使用一个数组来绘制路径。根据 API,d3.line :

Generates a line for the given array of data.

因此,这是最简单的多行格式:

[//outer array
    [...],
    [...],
    [...]
    //inner arrays, one for each line
]//closing the outer array

这些内部数组可以包含对象甚至其他数组(每个数组有两个值,一个用于 x 位置,另一个用于 y 位置)。

例如,包含对象的内部数组:

var data = [
    [{x:0, y: 0},{x:50, y: 40},{x:100, y: 100},{x:150, y: 90},{x:200, y: 150}],
    [{x:0, y: 50},{x:50, y: 60},{x:100, y: 100},{x:150, y: 110},{x:200, y: 10}],
    [{x:0, y: 20},{x:50, y: 20},{x:100, y: 140},{x:150, y: 130},{x:200, y: 10}]
];

并包含数组:

var data = [
    [[0, 10],[50, 20],[100, 30]],
    [[0, 80],[50, 10],[100, 40]],
    [[0, 50],[50, 120],[100, 90]]
];

由于这是最简单格式之一,它可能适合您,因为您说:“我正在寻找一种默认格式,我可以使用更少的数据操作”

您只需要创建一个输入选择,如下所示:

var lines = svg.selectAll(null)
  .data(data)
  .enter()
  .append("path")
  .attr("d", lineGenerator)

行(路径)的数量是内部数组的数量。对于每一行(路径),相应的内部数组作为数据传递。

这是一个演示:

var data = [
[{x:0, y: 0},{x:50, y: 40},{x:100, y: 100},{x:150, y: 90},{x:200, y: 150},{x:250, y: 140},{x:300, y: 130}],
[{x:0, y: 120},{x:50, y: 60},{x:100, y: 100},{x:150, y: 110},{x:200, y: 90},{x:250, y: 10},{x:300, y: 30}],
[{x:0, y: 20},{x:50, y: 20},{x:100, y: 140},{x:150, y: 130},{x:200, y: 10},{x:250, y: 70},{x:300, y: 90}]
];
var svg = d3.select("svg");
var color = d3.scaleOrdinal(d3.schemeCategory10)
var lineGenerator = d3.line()
  .x(function(d) {
    return d.x
  })
  .y(function(d) {
    return d.y
  })

var lines = svg.selectAll(null)
  .data(data)
  .enter()
  .append("path")
  .attr("d", lineGenerator)
  .attr("fill", "none")
  .attr("stroke-width", 3)
  .attr("stroke", function(d, i) {
    return color(i)
  })
svg {
  border: 1px solid darkgray;
}
<script src="https://d3js.org/d3.v4.min.js"></script>
<svg></svg>

人们如何根据数据(例如,CSV 或 TSV)创建这些嵌套数组?那是一个不同的问题。正如 in the comments 所建议的,最常见的方法(但不是唯一的方法)是使用 d3.nest()

关于javascript - 在 d3 中加载多行数据的默认格式是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45601588/

相关文章:

javascript - Android 浏览器上的长按功能

javascript - 查找动态数组的对象元素 Javascript 中的公共(public)元素

javascript - 在 Javascript 中使数组元素为正

json - Drupal 创建一个输出 JSON 的页面

python - 从txt文件到字典再到json

javascript - Handlebars.js 和 SEO

javascript - 如何使用jquery隐藏父元素?

javascript - 切换类别按钮不起作用?

arrays - 使用PIL中的fromarray保存4 channel 的图像向量,然后重新读取它

php - 在 PHP 上将多种类型的日期字符串格式化为相同的日期格式