質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.01%

JavaScriptを使ってxmlファイルを読み込み、正規分布グラフにする方法

受付中

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 962

前提・実現したいこと

ここに質問したいことを詳細に書いてください

javascriptでxmlファイルを読み込んで、d3.jsを使って、正規分布のグラフが書きたいのですが、どのように書けばよろしいでしょうか?

発生している問題・エラーメッセージ

ReferenceError: data is not defined

エラーメッセージ

ReferenceError: data is not defined

該当のソースコード

javascript
normal distribution_test.html]

ここにご自身が実行したソースコードを書いてください
<!DOCTYPE html>
<html>

<head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
    <title>Normal Plot</title>
    <meta name="description" content="">
    <script src="http://d3js.org/d3.v3.min.js" charset="utf-8"></script>
    <script type="text/javascript" src="d3.js"></script>
    <style type="text/css">
    body {
        font: 10px sans-serif;
    }
    .axis path,
    .axis line {
        fill: none;
        stroke: #000;
        shape-rendering: crispEdges;
    }
    /*.x.axis path {
        display: none;
    }*/
    .line {
        fill: none;
        stroke: steelblue;
        stroke-width: 1.5px;
    }
    </style>
</head>

<body>
<form action="/cgi-bin/demo.py" method="POST">
</form>
<script type="text/javascript">
//setting up empty data array



d3.xml("normal distribution.xml",function(error,xmlRoot){

   var xmlData   = xmlRoot.querySelectorAll("datalist");
   var salesRoot = xmlData[0];
   var salesData = salesRoot.querySelectorAll("name");
   var arrData= [];

        for( var i=0 ; i < salesData.length ; i++){

            var d = salesData[i].firstChild.nodeValue;

            arrData.push( d );
        }



});


// line chart based on http://bl.ocks.org/mbostock/3883245
var margin = {
        top: 20,
        right: 20,
        bottom: 30,
        left: 50
    },
    width = 960 - margin.left - margin.right,
    height = 500 - margin.top - margin.bottom;

var x = d3.scale.linear()
    .range([0, width]);

var y = d3.scale.linear()
    .range([height, 0]);

var xAxis = d3.svg.axis()
    .scale(x)
    .orient("bottom");

var yAxis = d3.svg.axis()
    .scale(y)
    .orient("left");

var line = d3.svg.line()
    .x(function(d) {
        return x(d.q);
    })
    .y(function(d) {
        return y(d.p);
    });

var svg = d3.select("body").append("svg")
    .attr("width", width + margin.left + margin.right)
    .attr("height", height + margin.top + margin.bottom)
    .append("g")
    .attr("transform", "translate(" + margin.left + "," + margin.top + ")");

x.domain(d3.extent(data, function(d) {
    return d.q;
}));
y.domain(d3.extent(data, function(d) {
    return d.p;
}));

svg.append("g")
    .attr("class", "x axis")
    .attr("transform", "translate(0," + height + ")")
    .call(xAxis);

svg.append("g")
    .attr("class", "y axis")
    .call(yAxis);

svg.append("path")
    .datum(data)
    .attr("class", "line")
    .attr("d", line);

function getData() {

// loop to populate data array with 
// probabily - quantile pairs

    q = normal(d)// calc random draw from normal dist
    p = gaussian(q)// calc prob of rand draw
    el = {
       "q":q,
       "p":p
    }
   data.push(el)
};

// need to sort for plotting
//https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort
data.sort(function(x, y) {
    return x.q - y.q;
});    


// from http://bl.ocks.org/mbostock/4349187
// Sample from a normal distribution with mean 0, stddev 1.
function normal() {
    var x = 0,
        y = 0,
        rds, c;
    do {
        x = Math.random() * 2 - 1;
        y = Math.random() * 2 - 1;
        rds = x * x + y * y;
    } while (rds == 0 || rds > 1);
    c = Math.sqrt(-2 * Math.log(rds) / rds); // Box-Muller transform
    return x * c; // throw away extra sample y * c
}

//taken from Jason Davies science library
// https://github.com/jasondavies/science.js/
function gaussian(x) {
    var gaussianConstant = 1 / Math.sqrt(2 * Math.PI),
        mean = 0,
        sigma = 1;

    x = (x - mean) / sigma;
    return gaussianConstant * Math.exp(-.5 * x * x) / sigma;
};
</script>
</body>
</html>

読み込もうしているxmlファイル

xml
[normal distribution.xml]

ここにご自身が実行したソースコードを書いてください
<?xml version="1.0" encoding="utf-8" ?>
<datalist>
<data>
    <name>1</name><mean>0</mean>
</data>
</datalist>
###試したこと
課題に対してアプローチしたことを記載してください

dataが定義されていないという事でarrDataに変えたりしましが、同じように定義されていないとでます。

###補足情報(言語/FW/ツール等のバージョンなど)

"http://d3js.org/d3.v3.min.js""d3.js"を読み込んでいます。
そちらは、ちゃんと読み込めているので、問題ないかと思います。

より詳細な情報

元々、下記の部分が、
d3.xml("normal distribution.xml",function(error,xmlRoot){

   var xmlData   = xmlRoot.querySelectorAll("datalist");
   var salesRoot = xmlData[0];
   var salesData = salesRoot.querySelectorAll("name");
   var arrData= [];

        for( var i=0 ; i < salesData.length ; i++){

            var d = salesData[i].firstChild.nodeValue;

            arrData.push( d );
        }



});
ではなく、
この下記の部分でした。(これならグラフが出ます。)
var data = [];

getData(); // popuate data
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • kei344

    2017/11/08 15:40

    質問は編集することが出来るので、再投稿はしないでください。

    キャンセル

  • kei344

    2017/11/08 15:46

    PCであれば記入エリアの右部分あたりにリアルタイムに結果が表示されていると思うので、そこを見ながら調整してください。

    キャンセル

  • hidetakahashi

    2017/11/08 15:47

    何度も申し訳ありません。修正致しましたので、よろしくお願い致します。

    キャンセル

回答 1

+2

こうかな。

var data = [];
d3.xml("normal distribution.xml",function(error,xmlRoot){

   var xmlData   = xmlRoot.querySelectorAll("datalist");
   var salesRoot = xmlData[0];
   var salesData = salesRoot.querySelectorAll("name");
   var arrData= [];

   for( var i=0 ; i < salesData.length ; i++){
      var d = salesData[i].firstChild.nodeValue;
      arrData.push( d );
   }
   data = arrData;
   getData(); // popuate data
});

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/11/08 18:23

    「salesData[i]」をconsole.logで内容確認してみては?

    【JavascriptのChromeでのデバッグ方法個人的まとめ2016 - Qiita】
    https://qiita.com/snoguchi/items/8f6bb62a3166eca23ac3

    キャンセル

  • 2017/11/08 18:52

    確認してみます。ありがとうございます。

    キャンセル

  • 2017/11/08 19:03

    う~ん、試してみると、
    ReferenceError: salesData is not definedって出ますね。
    もうちょっと調べてみます。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.01%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる