【问题标题】:D3.js update bar chart from jsonD3.js 从 json 更新条形图
【发布时间】:2012-05-06 01:50:21
【问题描述】:

我正在使用 d3.js 制作条形图,条形图应该能够对应于新的 json 数据。

var m = [30, 5, 5, 5],
    w = 375 - m[1] - m[3],
    h = 260 - m[0] - m[2];

var format = d3.format(",.0f");

var wdthnew = d3.scale.linear().range([0, w]),
    wdth = d3.scale.linear().range([0, w]).domain([0, 25000]),
    hght = d3.scale.ordinal().rangeRoundBands([0, h], .1);

var svg = d3.select("body").append("svg")
    .attr("width", w + m[1] + m[3])
    .attr("height", h + m[0] + m[2])
  .append("g")
    .attr("transform", "translate(" + m[3] + "," + m[0] + ")");

d3.json("barchartjson.php", function(data) {

  data.sort(function(a, b) { return b.value - a.value; });
  hght.domain(data.map(function(d) { return d.orientation; }));

  var bar = svg.selectAll("g.bar")
      .data(data)
    .enter().append("g")
      .attr("class", "bar")
      .attr("transform", function(d) { return "translate(0," + hght(d.orientation) + ")"; });

  bar.append("rect")
      .attr("id", "activebar") 
      .attr("width", 0)
      .attr("height", hght.rangeBand())
    .transition()
    .delay(100)
    .duration(1000)    
      .attr("width", function(d) { return wdth(d.value); });    
});

function makebar(date1, date2) {
var barchartjson = "barchartjson.php?df="+date1+"&dl="+date2;

d3.json(barchartjson , function(datanew) { 

  datanew.sort(function(a, b) { return b.jumlah - a.jumlah; });

  wdthnew.domain([0, d3.sum(datanew, function(d) { return d.value; })]);

  console.log("SUM datanew: "+ d3.sum(datanew, function(d) { return d.value; }));
  console.log("Array datanew: ");
  console.log(datanew);
  var updatebar = svg.selectAll("#activebar");

  updatebar.transition().duration(1000)
        .attr("width", function(a) { console.log("update width: wdthnew("+a.value+") = "+wdthnew(a.value));
        return wdthnew(a.value); });  
});
}

这是第一次使用的barchartjson.php中的json:

[{"orientation":"negatif","value":"15964"},{"orientation":"netral","value":"2788"},{"orientation":"positif","value":"9701"}]

该栏首次正确显示。 问题是在调用 makebar() 时,会使用新的 json 数据更新条形宽度。每个条形宽度都会更新,但在某些情况下它们超出范围。 这是 console.log 的输出:

SUM datanew: 2520
Array datanew: 
[Object
value: "1411"
orientation: "negatif"
__proto__: Object
, 
Object
value: "846"
orientation: "positif"
__proto__: Object
, 
Object
value: "263"
orientation: "netral"
__proto__: Object
]
update width: wdthnew(15964) = 2312.246031746032
update width: wdthnew(9701) = 1405.1051587301588
update width: wdthnew(2788) = 403.81746031746036

一个新的 json 成功调用,但是日志显示 wdthnew 正在不断扩展旧的 json。

 updatebar.transition().duration(1000)
        .attr("width", function(a) { console.log("update width: wdthnew("+a.value+") = "+wdthnew(a.value));
        return wdthnew(a.value); }); 

结果:

update width: wdthnew(15964) = 2312.246031746032

尽管 15694 来自旧的 json, wdthnew(d.value) 实际上是从 wdthnew(1411) 返回一个值,它是 2312,它超出了范围..

有人可以帮我解决这个问题吗?或者指出我做错了什么?我是 d3.js 和 javascript 的新手。 我很抱歉语法不好。英语不是我的母语。

jsFiddle 在这里:http://jsfiddle.net/saido/5mREA/

【问题讨论】:

    标签: javascript charts bar-chart d3.js


    【解决方案1】:

    原来问题出在function makebar(): 在这一行我应该附加新数据:

    var updatebar = svg.selectAll("#activebar").data(datanew);
    

    现在 console.log 显示和计算正确的值。

    抱歉,我不知道如何更详细地解释技术问题。

    【讨论】:

      【解决方案2】:

      也许创建一个缓冲区数组/对象,在使用它之前存储数据......然后创建一个在新数据到达之前不会更新的更新间隔。

      更新:这是一个例子

      var data = [{x: 1, y: 3},
                  {x: 2, y: 4},
                  {x: 3, y: 5},
                  ...
                  ];
      
      var incomingData = [];
      
      /* incoming data gets .pushed(...) in every 1 or
          2 seconds, depending on network traffic */
      
      var updateDelay = 3000;
      
      setInterval(function() {
              for (var index = 0; index < data.length; index++) {
                  seriesData.shift();
                  seriesData.push(incomingData.shift());
                  redrawGraph();
              }
          }, updateDelay);
      

      【讨论】:

      • 感谢您的回复,奥古斯都。您能否更具体地了解创建更新间隔?
      • 我发现问题了!再次感谢您,奥古斯都。
      猜你喜欢
      • 2019-08-24
      • 1970-01-01
      • 1970-01-01
      • 2014-03-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-09
      • 1970-01-01
      相关资源
      最近更新 更多