【问题标题】:Multi series chart (D3) with missing values具有缺失值的多系列图表 (D3)
【发布时间】:2013-07-29 15:06:34
【问题描述】:

我想根据这个example 用 D3 创建一个多系列折线图。我的问题是,缺少一些值:

y    x1   x2   x3
1   0.8       0.7
2   0.9       0.7
3   0.9  1.2  0.7
4        1.1  0.7
5   0.8  1.1  2.7
6   0.9  1.2  2.6
7        1.3  0.8

我想得到以下图表:

应省略开头或结尾的缺失点。我可以通过

实现这一目标
d3.svg.line().defined(function (d) { return d.value; }

但是如果一行中缺少某些点,则不应中断该行。绿线上方的代码 (x1) 在 y=3 处停止并在 y=5 处继续。但我想把这些点连接起来。

如果不使用line().defined(),所有缺失的点都会被处理为它们的值是0

这是代码,我曾经找到一种方法来实现该功能:

http://jsfiddle.net/G5z4N/2/

我认为在将数据数组中的缺失点传递给我的图表函数之前替换它不是解决方案,因为我必须在图例和工具提示中显示值,而我无法在此处显示计算值。因此,例如,如果我将鼠标移到 y=4 上,图例中应该会出现 x1:-- x2:1.1 x3:0.8(x1 在这里没有任何值)。 (实际)点也应显示为圆圈。我也不想在内存中有两个数据表(一个是真实的测量数据,另一个是图表线的增强数据)。

【问题讨论】:

  • 对于您希望线路在中间缺失值时连接的部分,如果在前面或后面缺失值则不连接:可能是如果您可以遍历您的数据并为每个 X* 列找到第一个和最后一个定义的值,然后在 defined(function(d,i){if (i Defined[first] || i> xDefined[Last ]) 返回 false;否则返回 true;})
  • 嗨@stofl,请指出代码的哪一部分可以将缺失值视为0。我正在努力实现这一目标。到目前为止,它们只是没有出现在图表上。谢谢,
  • 函数line1(第12行)和line2(第16行)之间的区别。据我记得,当值为null时,第13行的函数x()返回0

标签: javascript charts d3.js


【解决方案1】:

我可以解决它,但我不确定我是否可以通过转换以这种方式处理数据更新。我稍微改变了数据格式,现在分别绘制每一行:

http://jsfiddle.net/G5z4N/3/

var data = [
    {
        name: "x1",
        color: "green",
        data: [
            [1, 0.8],
            [2, 0.9],
            [3, 0.9],
            [5, 0.8],
            [6, 0.9]
        ]
    },
    {
        name: "x2",
        color: "red",
        data: [
            [3, 1.2],
            [4, 1.1],
            [5, 1.1],
            [6, 1.2],
            [7, 1.3]
        ]
    },
    {
        name: "x3",
        color: "blue",
        data: [
            [1, 0.7],
            [2, 0.7],
            [3, 0.7],
            [4, 0.7],
            [5, 2.7],
            [6, 2.6],
            [7, 0.8]
        ]
    },
];

var margin = [20, 20, 20, 20];
var w = 400 - margin[1] - margin[3];
var h = 300 - margin[0] - margin[2];

var x = d3.time.scale().range([0, w]);
var y = d3.scale.linear().range([h, 0]);
var lineFunction = d3.svg.line()
    .x(function(d) { return x(d[0]); })
    .y(function(d) { return y(d[1]); });

graph = d3.select('#line')
    .append("svg:svg")
        .attr("class", "line-graph")
        .attr("width", w + margin[1] + margin[3])
        .attr("height", h + margin[0] + margin[2])  
    .append("svg:g")
        .attr("transform", "translate(" + margin[3] + "," + margin[0] + ")");

x.domain([
    d3.min(data, function(c) { return d3.min(c.data, function(v) { return v[0]; }); }),
    d3.max(data, function(c) { return d3.max(c.data, function(v) { return v[0]; }); })
]);

y.domain([
    d3.min(data, function(c) { return d3.min(c.data, function(v) {  return +v[1]; }); }),
    d3.max(data, function(c) { return d3.max(c.data, function(v) { return +v[1]; }); })
]);

var linesGroup = graph
    .append("svg:g")
        .attr("class", "lines");

var linedata;
for (var i in data) {
    linedata = data[i];
    linesGroup
        .append("path")
            .attr("d", lineFunction(linedata.data))
            .attr("class", "line")
            .attr("fill", "none")
            .attr("stroke", function(d, i) {
                console.log(linedata.color);
                return linedata.color;
            });
};

【讨论】:

    猜你喜欢
    • 2014-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多