簡體   English   中英

d3js:未捕獲的TypeError:無法讀取未定義的屬性“長度”

[英]d3js: Uncaught TypeError: Cannot read property 'length' of undefined

我是d3的新手。 我很確定我的數據沒有問題。 朝正確方向的任何觀點將不勝感激。

(function() {

  d3.json("data.json", function(error, json){
    if(error) return console.warn(error);
    data = json;

    var format = d3.time.format("%a %b %d %Y")
    var amountFn = function(d){return d.amount}
    var dateFn = function(d){
      console.log(d.bonus);
      return format.parse(d.date)

    }


    var x = d3.time.scale()
      .range([10, 280])
      .domain(d3.extent(data, dateFn));

    var y = d3.scale.linear()
      .range([180, 10])
      .domain(d3.extent(data, amountFn));

    var svg = d3.select('#demo').append("svg:svg")
      .attr("width", 300)
      .attr("height", 200)

    svg.selectAll("circle").data(data).enter()
      .append("svg:circle")
      .attr("r", 4)
      .attr("cx", function(d){return x(dateFn(d.draw_date))})
      .attr("cy", function(d){return y(amountFn(d))})
  });


 })();

我正在檢索的數據采用以下格式。

[
    {
        "date": "2015-08-26T00:00:00",
        "amount": "30"
    },
    ...more data
]

實際上,您在這里犯了許多愚蠢的小錯誤。 使用D3.js,您必須了解數據結構。

在您的代碼中,我發現了許多錯誤。

1.您將json存儲在一個變量中,該變量為您未初始化的數據命名,但是javascript會忽略它。

2.您傳入console.log(d.bonus); 此密鑰在您的json中不存在,因此其值顯示為“ undefned” 當您觀看控制台時。

3.對於您的json數據,您需要將d.date轉換為date對象。

4.您已經將密鑰包裝在x和y中,因此您只需要傳遞

.attr("cx", function(d){ return x(d.date); })
.attr("cy", function(d){return y(d.amount); })

代替

.attr("cx", function(d){return x(dateFn(d.draw_date))})
.attr("cy", function(d){return y(amountFn(d))})

因此,我修復了代碼中的一些錯誤,可以通過在系統上運行來測試此代碼:

我的HTML:

<!DOCTYPE html>
<html>
<head>  
    <link rel="stylesheet" href="css/bootstrap.min.css">
    <link rel="stylesheet" href="css/bootstrap-theme.css">
</head>    

<body>
<div class = "container">
    <div class="row">
        <div class="col-md-12">
            <div class = "panel panel-primary">
                <div class="panel-heading">
                    <h3 class="panel-title">D3 Test Example</h3>
                </div>
                <div class="panel-body">
                    <div id="demo"></div>
                <div>
            </div>
        </div>
    </div>
</div>
<script src="js/jquery-2.1.1.min.js"></script>
<script src="js/bootstrap.min.js"></script>
<script src="js/d3.v3.min.js"></script>
<script src="js/script.js"></script>
</body>
</html>

我的腳本代碼在這里。

    (function() {

      d3.json("data.json", function(error, json){
        if(error) return console.warn(error);
        var data = json;  // you store your json in data variable here..

        var format = d3.time.format("%a %b %d %Y").parse; // you don't need to this...
        var amountFn = function(d){return d.amount; };

        data.forEach(function(d){
            d.date = new Date(d.date); // you convert your d.date value in date string Object 
            d.amount = d.amount;
        });

        var dateFn = function(d){
          return d.date;
        }


        var x = d3.time.scale()
          .range([10, 280])
          .domain(d3.extent(data, dateFn));

        var y = d3.scale.linear()
          .range([180, 10])
          .domain([0, d3.max(data, amountFn)]);

        var svg = d3.select('#demo').append("svg:svg")
          .attr("width", 300)
          .attr("height", 200)

        svg.selectAll("circle").data(data).enter()

          .append("svg:circle")
          .attr("r", 4)
          .attr("cx", function(d){ return x(d.date); })
          .attr("cy", function(d){return y(d.amount); })
      });

 })();

我用了這些數據。

[{“ date”:“ 2015-08-24T00:00:00”,“ amount”:“ 30”},{“ date”:“ 2015-08-25T00:00:00”,“ amount”:“ 40 “},{” date“:” 2015-08-26T00:00:00“,” amount“:” 50“},{” date“:” 2015-08-27T00:00:00“,” amount“: “ 60”},{“ date”:“ 2015-08-28T00:00:00”,“ amount”:“ 70”},{“ date”:“ 2015-08-29T00:00:00”,“ “:” 80“},{” date“:” 2015-08-30T00:00:00“,” amount“:” 90“},{” date“:” 2015-08-31T00:00:00“, “ amount”:“ 100”}
]

希望這是您的問題的答案。 所以我的輸出在這里...

在此處輸入圖片說明

您的代碼中有兩個錯誤。

  1. 在格式字符串中,您必須將要提供的所有字段添加到格式字符串中。 因此,您應該使用d3.time.format("%Y-%m-%dT%H:%M:%S"); 而不是d3.time.format("%a %b %d %Y")

  2. dateFn函數需要一個對象作為參數,而不是日期字符串。 因此將x(dateFn(d.draw_date))替換為x(dateFn(d))

這是工作代碼段。

 var data = [{ "date": "2015-08-26T00:00:00", "amount": "30" }, { "date": "2015-07-26T00:00:00", "amount": "40" }]; var format = d3.time.format("%Y-%m-%dT%H:%M:%S"); var amountFn = function(d) { return d.amount }; var dateFn = function(d) { console.log(d.bonus); return format.parse(d.date) } var x = d3.time.scale() .range([10, 280]) .domain(d3.extent(data, dateFn)); var y = d3.scale.linear() .range([180, 10]) .domain(d3.extent(data, amountFn)); var svg = d3.select('#demo').append("svg:svg") .attr("width", 300) .attr("height", 200) svg.selectAll("circle").data(data).enter() .append("svg:circle") .attr("r", 4) .attr("cx", function(d) { return x(dateFn(d)) }) .attr("cy", function(d) { return y(amountFn(d)) }) 
 div{ height: 800px; width: 1200px; } 
 <script src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.4.11/d3.min.js"></script> <div id="demo"></div> 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM