【问题标题】:Using data from Socket.io for data visualisation with d3使用来自 Socket.io 的数据通过 d3 进行数据可视化
【发布时间】:2014-11-17 00:02:04
【问题描述】:

我想知道如何使用通过 Socket.io 从 Node.js 服务器接收到的数据库中的数据来使用 d3 进行数据可视化。 我已经阅读了一些关于为此使用 PHP 和 JSON 的文章。我真的需要 JSON 吗?我怎么能在不需要 PHP 的情况下做到这一点?实际上,从 Socket.io 接收到的数据已经存储在数组values_array 中。但是这个数组不被 d3 接受。 到目前为止,我尝试了一个 getter 函数并尝试重写数组——但没有成功。 任何意见,将不胜感激。 下面是客户端 HTML 代码:

!doctype html>
<html>
    <head>

        <script src='//code.jquery.com/jquery-1.7.2.min.js'></script>
        <script src='//localhost:3000/socket.io/socket.io.js'></script>
        <script type="text/javascript" src="d3.v3.min.js"></script>
        <script>

            window.onload=function(){

            var socket = io();
            var values_array = new Array();


            socket.on('server2browser', function(data)      //  receive
            {
                fkt_values_array(data);   
            });



            function fkt_values_array(data)
            {
                 $.each(data, function(i, obj) 
                 {
                     values_array[i] = obj.numbers;     
                 });

                 $('#arrayprint_values').text(values_array); 
            }


            setTimeout(function() 
            {
                dynamicData = values_array;
            }, Math.random() * 1000);


            dynamicData = [22,33,33];       // This works
            // dynamicData = values_array;  // But I can´t get data from Socket.io into d3






            // Data visualisation (d3)

            var dataset = dynamicData;

            //Width and height
            var w = 500;
            var h = 200;
            var barPadding = 1;

            var svg = d3.select("#diagram")
                .append("svg")
                .attr("width", w)
                .attr("height", h);

            svg.selectAll("rect")
                .data(dataset)
                .enter()
                .append("rect")
                .attr("y", function(d) {
                    return h - (d * 4);  //Höher
                })
                .attr("width", w / dataset.length - barPadding)
                .attr("height", function(d) {
                    return d * 4;
                })
                .attr("x", function(d, i) {
                    return i * (w / dataset.length);
                })
                .attr("fill", function(d) {
                    return "rgb(" + (d * 10) + ", 0, " + (d * 10) + ")";
                });


            svg.selectAll("text")
                .data(dataset)
                .enter()
                .append("text")
                .text(function(d) {
                    return d;
                })
                .attr("x", function(d, i) {
                    return i * (w / dataset.length) + (w / dataset.length - barPadding) / 2;
                })
                .attr("y", function(d) {
                    return h - (d * 4) + 14;  //15 is now 14
                })
                .attr("font-family", "sans-serif")
                .attr("font-size", "11px")
                .attr("fill", "white")
                .attr("text-anchor", "middle");
            }
        </script>
    </head>
    <body>
        <div id='arrayprint_values'> Placeholder Text</div>   // Here the array is successfully printed out
        <div id="diagram"> Placeholder </div>                 // Here the diagram is displayed, but only with static data            
    </body>
</html>

【问题讨论】:

    标签: javascript database node.js asynchronous d3.js


    【解决方案1】:

    好吧,JavaScript 中的所有内容都是 JSON,所以使用它有点意义。

    而且您不需要 PHP。您似乎已经有一个节点服务器,只需使用它:)。但是,您的 valuesArray 被实例化为一个空列表,然后多次重新分配给其他对象。您可能想要更改它以提高代码清晰度。一个可能的错误来源是 D3 需要一个数字数组,但您的函数正在获取字符串或 JSON。也就是说,["1", "2"][{number : 1}, {number : 2}][1,2] 相对。将console.log(obj.numbers) 放入fkt_values_array 看看它是什么样子的

    【讨论】:

    • 当我将 console.log(obj.numbers) 放入 fkt_values_array 时,Chrome 的控制台显示 20,在下一行显示 18,依此类推,我在 socket.io 连接的另一侧定义了所有数字.我看不到任何“20”或带引号的类似内容。如何准备数组 values_array 以便 d3 接受它?有可能有演示吗?
    • 当您尝试将数组传递给 d3 时,具体会抛出什么错误?你能展示一下服务器上发生了什么吗?
    • 我没有看到来自 d3 的任何错误消息。我应该在哪里看到它?我应该提一下,在这种情况下 d3 是客户端。 d3 应该与数组 valuesArrayfrom 已经在客户端上的 Socket.io 中的数据相处。
    • 您会在控制台中看到错误。如果没有错误,那么您遇到的任何问题都可能在代码的其他地方
    猜你喜欢
    • 2012-07-09
    • 2021-02-17
    • 1970-01-01
    • 2015-06-11
    • 1970-01-01
    • 2021-09-18
    • 2018-10-23
    • 1970-01-01
    • 2011-10-23
    相关资源
    最近更新 更多