javascript - D3 : Resize bar chart according to window width

标签 javascript d3.js responsive-design

我有一个 D3 条形图,我正在尝试根据浏览器窗口大小调整其宽度。下面是图表脚本,其中宽度变量根据 SVG 父 div 的宽度 (#chart1) 设置,该宽度在 css 中设置了百分比宽度:

var $chartWidth= $('#chart1').width();
var margin = {top:20, right:35, bottom:30, left:35};
var height = 180 - margin.top - margin.bottom;
var width = $chartWidth - margin.left - margin.right;
var parseDate = d3.time.format("%m/%Y").parse;

var yScaleBar = d3.scale.linear()
    .domain([0,100])
    .range([height, 0]);    

var xBarScale = d3.scale.ordinal()
    .rangeRoundBands([0, width], .1);   

var yAxisBar = d3.svg.axis()
    .scale(yScaleBar)
    .ticks(4)
    .tickSize(-width, 0, 0)
    .orient("left");        

var xBarAxis = d3.svg.axis()
    .scale(xBarScale)
    .ticks(4)
    .orient("bottom");

var canvasBars = d3.select("#chart1").append("svg")
    .attr("width", width + margin.left + margin.right)
    .attr("height", height + margin.top + margin.bottom)    
    .append("g")
    .attr("transform", "translate("+margin.left+","+margin.top+")");

var data = [
    {date:"01/2009",bar2:"50",bar:"10",q:"1Q 2009"},
    {date:"04/2009",bar2:"56",bar:"32",q:"2Q"},
    {date:"07/2009",bar2:"57",bar:"70",q:"3Q"},
    {date:"10/2009",bar2:"58",bar:"60",q:"4Q"},
    {date:"01/2010",bar2:"52",bar:"45",q:"1Q '10"}
];

  data.forEach(function(d) {
    d.date = parseDate(d.date);
    d.bar2 = +d.bar2;
    d.bar = +d.bar;
  });

xBarScale.domain(d3.range(data.length));

xBarAxis.tickValues([data[0].q,data[1].q,data[2].q,data[3].q,data[4].q]);  

canvasBars.append("g")
      .attr("class", "xaxis")
      .attr("transform", "translate(0," + height + ")")
      .call(xBarAxis);            


canvasBars.append("g")
      .attr("class", "yaxis")
      .call(yAxisBar); 


canvasBars.selectAll("rect")
                .data(data)
                .enter()
                .append("rect")
                .attr({
                "x": function(d) {return xBarScale(d.date);},  
                "y": function(d) {return yScaleBar(d.bar);},  
                "height": function(d) {return height -yScaleBar(d.bar);},
                "width": xBarScale.rangeBand(),
                "fill": "steelblue"
                }); 

当窗口调整大小时,宽度变量发生变化并调用resize();

$( window ).resize(function() {
  $chartWidth = $('#chart1').width();
  width = $chartWidth - margin.left - margin.right;
  resize();
});

然后我的调整大小函数应该更改 SVG 的宽度属性、yAxisBar 刻度线的宽度和 xBarScale rangeRoundBands.....然后我认为我需要选择所有条形(矩形)并更改它们的宽度属性根据新的 xBarScale.rangeRoundBands。但我不确定如何正确选择这三件事。到目前为止,只是条形宽度随窗口一起调整大小 - 而不是刻度线或 SVG。这是我尝试过的:

function resize(){
    canvasBars.attr("width", width + margin.left + margin.right);
        yAxisBar.tickSize(-width, 0, 0);
        xBarScale.rangeRoundBands([0, width], .1);
        canvasBars.selectAll("rect").attr("width", xBarScale.rangeBand());
}

最佳答案

最直接的方法是在 css 中将元素的 width 设置为 100%。

关于javascript - D3 : Resize bar chart according to window width,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23526856/

相关文章:

javascript - 在圆弧中放置点

css - 如何使用 d3.js 为 rect 应用 "background: repeating-linear-gradient"样式

javascript - 在 D3JS 中显示线性和对数刻度之间的动画转换的示例?

html - 背景图像大小响应式设计

css - Google Recaptcha 无响应大小

javascript - symfony 使用 id 在 javascript 中调用 Controller 操作

javascript - 如何检测html文件中的所有mso书签?

javascript - 使书签执行它下载的功能

css - 单击时更改 li 背景颜色

javascript - vuejs 将数据返回到嵌套变量