【问题标题】:What is the best way to update d3 charts using - AJAX使用 AJAX 更新 d3 图表的最佳方法是什么
【发布时间】:2014-05-12 03:00:44
【问题描述】:

我已经学会了几块d3。我在 jquery 的帮助下制作了一个响应式 d3 直方图。

现在我想进一步使用 ajax 更新 d3 图表。

我刚刚进入 jquery。

并了解一些 ajax 的工作原理。

搜索了很长时间,但我在 d3 官方网站或其他任何地方都找不到任何工作示例。

任何帮助都会让我了解通过 ajax 更新 d3 图表的基本块。

提前致谢!!

【问题讨论】:

  • 没有。我还没有尝试过任何与 ajax 相关的东西。但是我建立的直方图。我想添加一个下拉列表并通过 AJAX 更新它。而且您提供的链接我只会收到错误,因为创建您的联系人时出错并且也没有图表可见。
  • @iJay 我得到的只是 500 条内部服务器错误警报消息...
  • 我已经导航到该页面。有一个文本可以输入一些东西。当我输入内容并按回车键时,我得到了错误,正如我之前提到的那样。
  • @iJay - 我没有找到任何通过 ajax 更新的内容。
  • @UnknownUser 要了解如何使用 AJAX 根据实时数据动态更新内容,请参阅我的 Dynamic-table github project 在本地服务器上托管项目。 (可以是任何 WAMP/LAMP/Tomcat)并打开 sample.html 现在,更改 datafile.json 中的内容。您将立即看到桌子上呈现的变化。您想实现相同的功能,但使用 d3 图表。但是我如何获取数据并定期处理它的想法保持不变。希望对您有所帮助。

标签: javascript jquery ajax d3.js


【解决方案1】:

我知道 OP 指定了 jQuery,但是对于那些不想要另一个框架的 Google 人来说,有一种原生 D3 方法可以做到这一点,使用 requestjson

d3.request(url, function(error, response) {
    // Now use response to do some d3 magic
});

d3.json(url, function(error, response) {
    // Now use response to do some d3 magic
});

【讨论】:

    【解决方案2】:

    您只需要在您的 ajax 成功中调用您的 d3 函数:

        $.ajax({
                type: "POST",
                contentType: "application/json; charset=utf-8",
                url: 'url to your web servise',
                dataType: 'json',
                async: true,
                data: "{}", 
                success: function (data) {
                   var pos_data = data;
                   div_name = "div.histogram";
    
            draw_histogram(div_name, pos_data);
    
                },
                error: function (result) {
    
    
    
    }
        })
    
    
    
    //The drawing of the histogram has been broken out from the data retrial 
        // or computation. (In this case the 'Irwin-Hall distribution' computation above)
    
        function draw_histogram(reference, pos_data){
    
            $(reference).empty()
    
            //The drawing code needs to reference a responsive elements dimneions
            var width = $(reference).width();
            // var width = $(reference).empty().width(); we can chain for effeicanecy as jquery returns jquery.
    
            // var height = 230;  // We don't want the height to be responsive.
    
            var margin = {top: 10, right: 30, bottom: 40, left: 30},
            // width = 960 - margin.left - margin.right,
            height = 270 - margin.top - margin.bottom;
    
    
            var histogram = d3.layout.histogram() (pos_data);
            //var neg_histogram = d3.layout.histogram()(neg_data);
    
            var x = d3.scale.ordinal()
                .domain(histogram.map(function(d) { return d.x; }))
                .rangeRoundBands([0, width]);
    
            var xAxis = d3.svg.axis()
            .scale(x)
            .orient("bottom");
    
    
            var y = d3.scale.linear()
                .domain([0, d3.max(histogram.map(function(d) { return d.y; }))])
                .range([0, height]);
    
            //var ny = d3.scale.linear()
            //    .domain([0, d3.max(neg_histogram.map(function(d) { return d.y; }))])
            //    .range([0, height]);
    
            var svg = d3.select(reference).append("svg")
                .attr("width", width)
                .attr("height", height + 20);
    
    
    
            svg.selectAll("rect")
                .data(histogram)
              .enter().append("rect")
                .attr("width", x.rangeBand())
                .attr("x", function(d) { return x(d.x); })
                .attr("y", function(d) { return height - y(d.y); })
                .attr("height", function(d) { return y(d.y); });
    
    
            svg.append("line")
                .attr("x1", 0)
                .attr("x2", width)
                .attr("y1", height)
                .attr("y2", height);
    
            svg.append("g")
                .attr("class", "x axis")
                .attr("transform", "translate(0," + (height)  + ")")
                .call(xAxis);
        };
    
        //Bind the window resize to the draw method.
        //A simple bind example is
    
        //A better idom for binding with resize is to debounce
        var debounce = function(fn, timeout) 
        {
          var timeoutID = -1;
          return function() {
            if (timeoutID > -1) {
              window.clearTimeout(timeoutID);
            }
            timeoutID = window.setTimeout(fn, timeout);
          }
        };
    
        var debounced_draw = debounce(function() {
          draw_histogram(div_name, pos_data);
        }, 125);
    
        $(window).resize(debounced_draw);
    

    【讨论】:

    • 让我试一试然后回来。
    • 如果您在一次又一次地调用 draw_histogram() 之前检查现有的 Pos_data,在浏览器上会更便宜。
    【解决方案3】:

    任何 AJAX 请求的想法都是向页面发送请求,该页面将生成可供客户端使用的 HTML 标记或数据。当您希望通过 AJAX 更新下拉列表时,请确保服务器将下拉项目列表作为 XML/JSON 或 HTML 标记发送,并且您的调用函数将 HTML 放置在适当的位置。

    如果您想要实时更新,请考虑定期向服务器请求数据,然后将数据与您的上一个副本进行匹配,看看是否有新数据到达。如果有,请重新渲染。

    要了解如何使用 AJAX 实时动态更新内容,请查看我的Dynamic-table github project

    在您的本地服务器上托管项目。 (可以是任何 WAMP/LAMP/Tomcat)并打开 sample.html

    现在,更改 datafile.json 中的内容。您将立即看到桌子上呈现的变化。

    您想实现相同的功能,但使用 d3 图表。但是我如何获取内容并定期处理它的想法保持不变。

    希望有所帮助。

    【讨论】:

    • 感谢您的回答。但我正在寻找的是小提琴。我想通过 AJAX 更新使用 d3 创建的图表。
    • 是的,我得到了你想要的。为了实现您想要的,您应该将图表的创建和用于绘制图表的数据提取分成两个不同的功能。有一个函数定期向服务器发出 AJAX 请求。并将您从服务器获得的数据与您的 pos_data 变量进行比较。如果数据不同,您将调用 draw_histogram() 方法。要了解如何进行定期调用,请查看我的 github 链接中的 dynamic_table.js::poll() 方法。然后做一个 setInterval(poll(), )
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-04
    • 1970-01-01
    • 2014-02-14
    • 1970-01-01
    相关资源
    最近更新 更多