d3.js d3.json不工作 - 如何使这个功能工作?

时间:2016-02-25 03:55:12

标签: d3.js

尝试使用d3.js开发数据可视化应用程序 使用名为" yelp_test_set_business.json"的本地json文件; 当我尝试使用d3.json加载这些数据时,没有任何内容被传递给回调函数,该回调函数也会在crossfilter.js库中触发错误。

这是我的整个文件:

<!DOCTYPE html>
<html lang='en'>
<head>
    <meta charset='utf-8'>

    <script src='javascript/d3.js' type='text/javascript'></script>
    <script src='javascript/crossfilter.js' type='text/javascript'></script>
    <script src='javascript/dc.js' type='text/javascript'></script>
    <script src='javascript/jquery-1.12.1.min.js' type='text/javascript'></script>
    <script type='text/javascript'>
        /********************************************************
         *                                                       *
         *   dj.js example using Yelp Kaggle Test Dataset        *
         *   Eol 9th May 2013                        *
         *                                                       *
         ********************************************************/

        /********************************************************
         *                                                       *
         *   Step0: Load data from json file                     *
         *                                                       *
         ********************************************************/
        d3.json("data/yelp_test_set_business.json", function (yelp_data) {

            /********************************************************
             *                                                       *
             *   Step1: Create the dc.js chart objects & ling to div *
             *                                                       *
             ********************************************************/
            var bubbleChart = dc.bubbleChart("#dc-bubble-graph");
            var pieChart = dc.pieChart("#dc-pie-graph");
            var volumeChart = dc.barChart("#dc-volume-chart");
            var lineChart = dc.lineChart("#dc-line-chart");
            var dataTable = dc.dataTable("#dc-table-graph");
            var rowChart = dc.rowChart("#dc-row-graph");

            /********************************************************
             *                                                       *
             *   Step2:  Run data through crossfilter                *
             *                                                       *
             ********************************************************/
            var ndx = crossfilter(yelp_data);

            /********************************************************
             *                                                       *
             *   Step3:  Create Dimension that we'll need            *
             *                                                       *
             ********************************************************/

            // for volumechart
            var cityDimension = ndx.dimension(function (d) { return d.city; });
            var cityGroup = cityDimension.group();
            var cityDimensionGroup = cityDimension.group().reduce(
                    //add
                    function(p,v){
                        ++p.count;
                        p.review_sum += v.review_count;
                        p.star_sum += v.stars;
                        p.review_avg = p.review_sum / p.count;
                        p.star_avg = p.star_sum / p.count;
                        return p;
                    },
                    //remove
                    function(p,v){
                        --p.count;
                        p.review_sum -= v.review_count;
                        p.star_sum -= v.stars;
                        p.review_avg = p.review_sum / p.count;
                        p.star_avg = p.star_sum / p.count;
                        return p;
                    },
                    //init
                    function(p,v){
                        return {count:0, review_sum: 0, star_sum: 0, review_avg: 0, star_avg: 0};
                    }
            );

            // for pieChart
            var startValue = ndx.dimension(function (d) {
                return d.stars*1.0;
            });
            var startValueGroup = startValue.group();

            // For datatable
            var businessDimension = ndx.dimension(function (d) { return d.business_id; });
            /********************************************************
             *                                                       *
             *   Step4: Create the Visualisations                    *
             *                                                       *
             ********************************************************/

            bubbleChart.width(650)
                    .height(300)
                    .dimension(cityDimension)
                    .group(cityDimensionGroup)
                    .transitionDuration(1500)
                    .colors(["#a60000","#ff0000", "#ff4040","#ff7373","#67e667","#39e639","#00cc00"])
                    .colorDomain([-12000, 12000])

                    .x(d3.scale.linear().domain([0, 5.5]))
                    .y(d3.scale.linear().domain([0, 5.5]))
                    .r(d3.scale.linear().domain([0, 2500]))
                    .keyAccessor(function (p) {
                        return p.value.star_avg;
                    })
                    .valueAccessor(function (p) {
                        return p.value.review_avg;
                    })
                    .radiusValueAccessor(function (p) {
                        return p.value.count;
                    })
                    .transitionDuration(1500)
                    .elasticY(true)
                    .yAxisPadding(1)
                    .xAxisPadding(1)
                    .label(function (p) {
                        return p.key;
                    })
                    .renderLabel(true)
                    .renderlet(function (chart) {
                        rowChart.filter(chart.filter());
                    })
                    .on("postRedraw", function (chart) {
                        dc.events.trigger(function () {
                            rowChart.filter(chart.filter());
                        });
                    });
            ;


            pieChart.width(200)
                    .height(200)
                    .transitionDuration(1500)
                    .dimension(startValue)
                    .group(startValueGroup)
                    .radius(90)
                    .minAngleForLabel(0)
                    .label(function(d) { return d.data.key; })
                    .on("filtered", function (chart) {
                        dc.events.trigger(function () {
                            if(chart.filter()) {
                                console.log(chart.filter());
                                volumeChart.filter([chart.filter()-.25,chart.filter()-(-0.25)]);
                            }
                            else volumeChart.filterAll();
                        });
                    });

            volumeChart.width(230)
                    .height(200)
                    .dimension(startValue)
                    .group(startValueGroup)
                    .transitionDuration(1500)
                    .centerBar(true)
                    .gap(17)
                    .x(d3.scale.linear().domain([0.5, 5.5]))
                    .elasticY(true)
                    .on("filtered", function (chart) {
                        dc.events.trigger(function () {
                            if(chart.filter()) {
                                console.log(chart.filter());
                                lineChart.filter(chart.filter());
                            }
                            else
                            {lineChart.filterAll()}
                        });
                    })
                    .xAxis().tickFormat(function(v) {return v;});

            console.log(startValueGroup.top(1)[0].value);

            lineChart.width(230)
                    .height(200)
                    .dimension(startValue)
                    .group(startValueGroup)
                    .x(d3.scale.linear().domain([0.5, 5.5]))
                    .valueAccessor(function(d) {
                        return d.value;
                    })
                    .renderHorizontalGridLines(true)
                    .elasticY(true)
                    .xAxis().tickFormat(function(v) {return v;});   ;

            rowChart.width(340)
                    .height(850)
                    .dimension(cityDimension)
                    .group(cityGroup)
                    .renderLabel(true)
                    .colors(["#a60000","#ff0000", "#ff4040","#ff7373","#67e667","#39e639","#00cc00"])
                    .colorDomain([0, 0])
                    .renderlet(function (chart) {
                        bubbleChart.filter(chart.filter());
                    })
                    .on("filtered", function (chart) {
                        dc.events.trigger(function () {
                            bubbleChart.filter(chart.filter());
                        });
                    });


            dataTable.width(800).height(800)
                    .dimension(businessDimension)
                    .group(function(d) { return "List of all Selected Businesses"
                    })
                    .size(100)
                    .columns([
                        function(d) { return d.name; },
                        function(d) { return d.city; },
                        function(d) { return d.stars; },
                        function(d) { return d.review_count; },
                        function(d) { return '<a href=\"http://maps.google.com/maps?z=12&t=m&q=loc:' + d.latitude + '+' + d.longitude +"\" target=\"_blank\">Map</a>"}
                    ])
                    .sortBy(function(d){ return d.stars; })
                    // (optional) sort order, :default ascending
                    .order(d3.ascending);
            /********************************************************
             *                                                       *
             *   Step6:  Render the Charts                           *
             *                                                       *
             ********************************************************/

            dc.renderAll();
        });
    </script>

    <link href='stylesheets/bootstrap.min.css' rel='stylesheet' type='text/css'>
    <!--<link href='stylesheets/dc.css' rel='stylesheet' type='text/css'>-->

    <!--<script src='simple_vis.js' type='text/javascript'></script>-->
</head>

<body>
<div class='container' id='main-container'>
    <div class='content'>
        <div class='container' style='font: 10px sans-serif;'>
            <h3>Visualisation of <a href="http://www.kaggle.com/c/yelp-recruiting">Kaggle Yelp Test Business Data</a> set (using <a href="http://nickqizhu.github.io/dc.js/">dc.js</a>)</h3>
            <h4>Demo for the <a href="http://www.meetup.com/Dublin-Data-Visualisation/">Dublin Data Visualisation Meetup Group</a></h4>
            <div class='row-fluid'>
                <div class='remaining-graphs span8'>
                    <div class='row-fluid'>
                        <div class='bubble-graph span12' id='dc-bubble-graph'>
                            <h4>Average Rating (x-axis), Average Number of Reviews (y-axis), Number of Business' (Size)</h4>
                        </div>
                    </div>
                    <div class='row-fluid'>
                        <div class='pie-graph span4' id='dc-pie-graph'>
                            <h4>Average Rating in Stars (Pie)</h4>
                        </div>
                        <div class='pie-graph span4' id='dc-volume-chart'>
                            <h4>Average Rating in Stars / Number of Reviews (Bar)</h4>
                        </div>
                        <div class='pie-graph span4' id='dc-line-chart'>
                            <h4>Average Rating in Stars / Number of Reviews (Line)</h4>
                        </div>
                    </div>
                    <!-- /other little graphs go here -->
                    <div class='row-fluid'>
                        <div class='span12 table-graph'>
                            <h4>Data Table for Filtered Businesses</h4>
                            <table class='table table-hover dc-data-table' id='dc-table-graph'>
                                <thead>
                                <tr class='header'>
                                    <th>Name</th>
                                    <th>City</th>
                                    <th>Review Score (in Stars)</th>
                                    <th>Total Reviews</th>
                                    <th>Location</th>
                                </tr>
                                </thead>
                            </table>
                        </div>
                    </div>
                </div>
                <div class='remaining-graphs span4'>
                    <div class='row-fluid'>
                        <div class='row-graph span12' id='dc-row-graph' style='color:black;'>
                            <h4>Reviews Per City</h4>
                        </div>
                    </div>
                </div>
            </div>
        </div>

    </div>
</div>
</body>
</html>

以下电话:

d3.json("data/yelp_test_set_business.json", function (yelp_data) { ...}

在yelp_data

中不返回任何内容

有谁知道为什么这是hapenning?

2 个答案:

答案 0 :(得分:1)

大多数情况下,此错误与您只是在浏览器中打开html文件有关,然后尝试使用json协议打开file:///文件,导致交叉来源违规。

requests上的D3文档。

解决此问题的一种方法是使用网络服务器来投放.html.json

如果您安装了python,只需转到文件所在的文件夹并运行python -m SimpleHTTPServer,然后使用浏览器导航至http://localhost:8080。这样,.html.json将从同一来源(即localhost:8080)投放,您将能够通过d3.json,{{1}加载文件等等...

答案 1 :(得分:1)

而不是像这样加载你的JSON:

 d3.json("data/yelp_test_set_business.json", function (yelp_data) {

应该是:

 d3.json("data/yelp_test_set_business.json", function (error, yelp_data) {

阅读this