0

我正在完成我的计算学位的项目,我对 D3 有问题,基本上如果我将数据直接传递给代码,它就可以工作,但是对于文件上的数据,它说“n 不存在” . 我不知道为什么会这样,这是我的代码:

PD:如果有人需要我的数据文件样本,请索取。

提前致谢!

<code>
<!DOCTYPE html>
<meta charset="utf-8">
<title>Causa básica</title>
<style>
 .axis path, .axis line
        {
            fill: none;
            stroke: #777;
            shape-rendering: crispEdges;
        }

        .axis text
        {
            font-family: 'Arial';
            font-size: 13px;
        }
        .tick
        {
            stroke-dasharray: 1, 2;
        }
        .bar
        {
            fill: FireBrick;
        }
</style>
<svg id="visualisation" width="1000" height="500"></svg>
<script src="http://d3js.org/d3.v3.min.js"></script>

<script>
InitChart();

function InitChart() {
/*
  var lineData = [{ //don't know if this is needed in source: <script src="http://d3js.org/d3.csv.js">
    'x': 1, //, This is the sample data
    'y': 1.0807955e-01
  }, {
    'x': 2,
    'y': 1.2815365e-01
  }, {
    'x': 3,
    'y': 9.3269178e-02
  }, {
    'x': 4,
    'y': 9.3894191e-02
  }];*/

var lineData;
        d3.tsv("data.tsv", function(data) {
        lineData=data //my data, that doesn't work
        });

  var vis = d3.select("#visualisation"),
    WIDTH = 1000,
    HEIGHT = 500,
    MARGINS = {
      top: 20,
      right: 20,
      bottom: 20,
      left: 50
    },
    xRange = d3.scale.linear().range([MARGINS.left, WIDTH - MARGINS.right]).domain([d3.min(lineData, function (d) {
        return d.x;
      }),
      d3.max(lineData, function (d) {
        return d.x;
      })
    ]),
    yRange = d3.scale.linear().range([HEIGHT - MARGINS.top, MARGINS.bottom]).domain([d3.min(lineData, function (d) {
        return d.y;
      }),
      d3.max(lineData, function (d) {
        return d.y;
      })
    ]),

    xAxis = d3.svg.axis()
      .scale(xRange)
      .tickSize(5)
      .tickSubdivide(true),

    yAxis = d3.svg.axis()
      .scale(yRange)
      .tickSize(5)
      .orient("left")
      .tickSubdivide(true);


  vis.append("svg:g")
    .attr("class", "x axis")
    .attr("transform", "translate(0," + (HEIGHT - MARGINS.bottom) + ")")
    .call(xAxis);

  vis.append("svg:g")
    .attr("class", "y axis")
    .attr("transform", "translate(" + (MARGINS.left) + ",0)")
    .call(yAxis);

  var lineFunc = d3.svg.line()
  .x(function (d) {
    return xRange(d.x);
  })
  .y(function (d) {
    return yRange(d.y);
  })
  .interpolate('basis');

vis.append("svg:path")
  .attr("d", lineFunc(lineData))
  .attr("stroke", "blue")
  .attr("stroke-width", 2)
  .attr("fill", "none");

}

</script>
</code>
4

1 回答 1

1

异步问题。

功能

    d3.tsv("data.tsv", function(data) {
        lineData=data //my data, that doesn't work
    });

在执行其余代码后调用。

您可以尝试将所有代码移动到函数内部和之后lineData=data;。或者构建一个函数:

var lineData;
d3.tsv("data.tsv", function(data) {
     seeData(data); 
});
function seeData(lineData) {
  var vis = d3.select("#visualisation"),
  WIDTH = 1000,
  HEIGHT = 500,
  MARGINS = {
    top: 20,
    right: 20,
    bottom: 20,
    left: 50
  },
  // etc etc
}
于 2015-01-30T08:58:41.447 回答