使用路径的 d3 折线图没有显示任何内容

0 d3.js

我正在尝试使用 d3.js 绘制一条表示折线图的路径。我正在使用以下代码

    var data;
d3.csv("myfile.csv",function(datagot){data=datagot;});
var format = d3.time.format("%Y/%m/%d %H:%M:%S");
        data.forEach(function (e){
                e.dist = +e.dist;
                e.speed = +e.speed;
                e.lat=+e.lat;
                e.lon=+e.lon;               
                e.dd=format.parse(e.time);
        });


var xScale = d3.time.scale().range([margin.left, width - margin.right]).domain([d3.min(dataset,function(d){return d.dd}),d3.max(dataset,function(d){ return d.dd})]),
                yScale = d3.scale.linear().range([height - margin.top, margin.bottom]).domain([d3.min(dataset,function(d){return d.dist;}),d3.max(dataset,function(d){return d.dist;})]),

                xAxis = d3.svg.axis()
                .scale(xScale).ticks(10).tickFormat(d3.time.format("%H:%M")).tickPadding(2),

               yAxis = d3.svg.axis()
                .scale(yScale).orient("left").tickPadding(5).ticks(5);



        var svg = d3.select("body").append("svg")
              .attr("width", width-50 )
              .attr("height", height -60);

              svg.append("svg:g")
                .attr("class","axis")
                .attr("transform", "translate(0," + (height - margin.bottom) + ")")
                .call(xAxis);
                // x axis label
                svg.append("text")
                .attr("x", width / 2 )
                .attr("y",  height - 60)
                .style("text-anchor", "middle")
                .text("Time");

                svg.append("svg:g")
                .attr("class","axis")
                .attr("transform", "translate(" + (margin.left-10) + ",-90)")
                .call(yAxis);

                // Y axis label
                    svg.append("text")
                  .attr("transform", "rotate(-90)")
                  .attr("y", 15)
                   .attr("x",70- (height / 2))
                   .attr("dy", "1em")
                   .style("text-anchor", "middle")
                   .text("Distance"); 

            // svg.append("g")
              //.attr("transform", "translate(" + margin.left + "," + margin.top + ")");
     var x = d3.scale.linear()
    .range([0, width]);

    var y = d3.scale.linear()
    .range([height, 0]);
     lineh = d3.svg.line().x(function(d) {
        return x(d.dd);
             }).y(function(d) {
                return y(d.dist);
    });
        var line  = svg.append("g").attr("transform", "translate(" + margin.left + "," + (-margin.top) + ")").selectAll(".hour")
              .data(outputf)
              .enter().append("path")
              //.attr("x", function(d) { return (d.dd.getMinutes())*15 ; })
             // .attr("cx", function(d) { return (d.dd.getMinutes())*10 ; })
              //.attr("y", function(d) { return (d.dist)*50 ; })
             // .attr("cy", function(d) { return height-100-(d.dist)*50 ; })
              //.attr("r",3)
/*              .attr("rx", 2)
              .attr("ry", 2)*/
              .attr("d",lineh)
              .attr("class", "line");
Run Code Online (Sandbox Code Playgroud)

但它实际上并没有策划任何事情。我提供 jsfiddle 来帮助您理解。http://jsfiddle.net/1b0gn0r2/。jsfiddle 组织得不好,但它包含我的代码,我正在使用的 csv 数据位于底部。谁能帮我找出错误吗?在我的实际代码中,输出如下 在此输入图像描述

Hen*_*y S 5

您的代码中似乎有很多错误!缺少各种东西(例如margin,,,其他变量,CSS等) heightwidth使得回答你的问题变得非常痛苦。

首先,如果您正在努力使用 jsfiddle,您可能更喜欢Plunker,它可以更轻松地组织您的代码和数据。

我创建了一个与您的代码一起使用的插件:http://plnkr.co/edit/ZEi7U6qQ8pxq06FdDIW6 ?p=preview

...但它涉及相当多的变化,我将尝试总结一下:

加载是异步的,所以这一行:

d3.csv("myfile.csv",function(datagot){data=datagot;});
Run Code Online (Sandbox Code Playgroud)

不会做你期望的事。其余的代码将在没有正确设置的情况下关闭并执行(例如绘制轴)data。因此,您尝试在数据准备好之前划清界限。通过将主代码插入数据加载函数来修复此问题。

定义尺度。您似乎定义了 4 种不同的尺度:

  • xScale = d3.time.scale()
  • yScale = d3.scale.linear()
  • x = d3.scale.linear()
  • y = d3.scale.linear()

这会导致稍后的线条绘制功能出现问题(更多问题还会出现)。我已经摆脱xy这里

线条绘制函数 lineh期望比例为xy,但我建议使用您之前定义的xScale和。yScale

// line function
lineh = d3.svg.line()
    .x(function(d) {
        return xScale(d.dd); // <- do not use d(d.dd)
    })...
Run Code Online (Sandbox Code Playgroud)

调用线路函数应该以完全不同的方式完成:您的代码:

var line  = svg.append("g")
    .data(outputf)
    .enter().append("path")
    .attr("d",lineh)
    .attr("class", "line");
Run Code Online (Sandbox Code Playgroud)

不确定outputf是什么所以我忽略了它。lineh(定义如何画线)应该用数据调用。我将调用更改为:

var line = svg.append("g")
    .append("path")
    .attr("d", lineh(dataset)) // <- Note the change
    .attr("class", "line");
Run Code Online (Sandbox Code Playgroud)

最后,我重新组织了代码,将一些变量定义放在文件顶部,使其更易于理解。