d3在任意线上填充折线图

时间:2013-02-08 03:04:06

标签: javascript d3.js

我正在尝试使用d3创建一个简单的折线图,但由于某种原因,它在线和某个中点之间填充。这是输出:

Line Chart

我的javascript如下:

        var width = 500,
            height = 500,
            padding = 10;

        var extentVisits = d3.extent(visits, function(obj){
            return obj['visits'];
        });

        var extentDates = d3.extent(visits, function(obj){
            return obj['datestamp'];
        });

        var yScale = d3.scale.linear()
            .domain(extentVisits)
            .range([height - padding, padding]);

        var xScale = d3.time.scale()
            .domain(extentDates)
            .range([0, width]);

        var line = d3.svg.line()
            .x(function(d) {
                return xScale(d['datestamp']);
            })
            .y(function(d) {
                return yScale(d['visits']);
            })

        d3.select('#chart')
            .append('svg')
            .attr('width', width)
            .attr('height', height)
            .append("g")
            .attr("transform", "translate(5,5)")
            .append('path')
            .datum(visits)
            .attr("class", "line")
            .attr('d', line);

访问的形式如下:

        visits = [{'datestamp': timestampA, 'visits': 1000},
                  {'datestamp': timestampB, 'visits': 1500}]

我在d3很新,所以我确信它很简单,但它让我发疯了。

提前致谢。

1 个答案:

答案 0 :(得分:20)

您所看到的中点只是第一点和最后一点的连接。这是因为您创建的路径(默认情况下)具有黑色填充。即使它是一条开放路径(即第一个和最后一个点实际上没有连接),如果填充,它将显示为关闭:

  

填充操作通过执行填充操作来填充打开的子路径,就好像在路径中添加了一个额外的“closepath”命令,以将子路径的最后一个点与子路径的第一个点连接起来。

来源:SVG specification来自this SO answer

这里的解决方案是消除填充,而是设置一个笔划。您可以使用d3或通过CSS直接在JS中执行此操作。

path.line
{
    fill: none;
    stroke: #000;
}

Demo showing both the CSS and JS method (commented out) on jsFiddle