5

我想根据这个例子用 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 在此处没有任何值)。(实际)点也应显示为圆圈。我也不想在内存中有两个数据表(一个是真实的测量数据,另一个是图表线的增强数据)。

4

1 回答 1

3

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

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;
            });
};
于 2013-07-29T17:36:39.457 回答