D3.js图表响应行为

D3.js chart responsive behavior

本文关键字:响应 js D3      更新时间:2023-09-26

我试图设置侦听器改变图表宽度与jQuery,当窗口宽度改变:

// Get width of parent div with jQuery
var widthContainer = $( ".chart" ).parent().width();
//set margins
// margin conventions https://bl.ocks.org/mbostock/3019563
var margin = {top: 0, right: 0, bottom: 30, left: 40};
var width = widthContainer - margin.left - margin.right;
var height = 211 - margin.top - margin.bottom;
// set chart dimensions
var chart = d3.select(".chart")
    .attr("width", width + margin.left + margin.right)
    .attr("height", height + margin.top + margin.bottom)
    .append("g")
    .attr("transform", "translate(" + margin.left + "," + margin.top + ")");

// listener
function changeWidth(){
   widthContainer = $( ".chart" ).parent().width();
   width = widthContainer - margin.left - margin.right;
}
$(window).resize(function(){
  changeWidth();
  console.log(widthContainer);
});

changeWidth()函数改变了widthContainer变量,但图表维度没有改变。为什么?

这是一个工作的代码依赖(第13到40行):http://codepen.io/aitormendez/pen/LbRyWa?editors=0011

提前感谢

当前的changeWidth()只计算新的宽度。您需要将新宽度设置为您想要的元素。你还需要更新你的图表的x刻度并重新绘制图表。

快速更新你的代码(我移动了changeWidth和resize到底部,并添加了重绘功能)。

var redraw = function(newWidth) {
  // update xscale
  escalax.range([0, newWidth]);
  d3.select('.xaxis').call(xAxis);
  deuda.selectAll("rect")
    .attr("width", function(d) {
      return rr(escalax(d[1]));
    });
  recono.selectAll("rect")
    .attr("x", function(d) {
      return rr(escalax(d[1]));
    })
    .attr("width", function(d) {
      return rr(escalax(d[2]));
    });
  provee.selectAll("rect")
    .attr("x", function(d) {
      return rr(escalax(d[1] + d[2]));
    })
    .attr("width", function(d) {
      return rr(escalax(d[3]));
    });
  credito.selectAll("rect")
    .attr("x", function(d) {
      return rr(escalax(d[1] + d[2] + d[3]));
    })
    .attr("width", function(d) {
      return rr(escalax(d[3]));
    });
}
function changeWidth() {
  widthContainer = $(".chart").parent().width();
  width = widthContainer - margin.left - margin.right;
  // update chart width
  d3.select('.chart')
    .attr('width', width);
  // redraw chart
  redraw(width);
}
$(window).resize(function() {
  changeWidth();
  console.log(widthContainer);
});

http://codepen.io/anon/pen/JbboQL?编辑= 1010