的调整大小我学习d3.js库和SVG。我有问题调整一个简单的条形图为svg-wrapper的宽度(或窗口的宽度)的功能,在我的情况下,它是div.barchart。d3.js条形图
我想要什么来实现?我需要:
SVG的高度=常数(在我的情况下,我使它作为对象的量的函数在我的数据阵列)
宽度SVG的=可变 - 电流的函数div.barchart的宽度(当用户调整浏览器的窗口大小时)。
我在寻求帮助如何做到这一点。我的代码是低于或这里http://codepen.io/Balzzac/pen/ZWEOGa:
HTML/CSS
<div class="barchart"></div>
.barchart
{
width: calc(100%);
height: auto;
}
JS
var myArrayOfObjects = [
{kind: 1, name: "A", y: 400},
{kind: 1, name: "B", y: 400},
{kind: 2, name: "C", y: 350},
{kind: 2, name: "D", y: 350},
{kind: 2, name: "E", y: 350},
{kind: 3, name: "G", y: 300},
{kind: 4, name: "I", y: 250},
{kind: 4, name: "J", y: 250},
{kind: 5, name: "K", y: 200}
];
var lengthOfArray = myArrayOfObjects.length;
var width = $(".barchart").width();
var height = Math.round(lengthOfArray * 40);
var barPadding = 0.1;
//margin
var marginLeft = 120;
var marginTop = 0;
var marginRight = 200;
var marginBottom = 0;
var margin = { left: marginLeft , top: marginTop, right: marginRight, bottom: marginBottom};
//data
var yColumn = "name";
var xColumn = "y";
var colorColumn = "kind";
//size of canvas
var innerWidth = width - margin.left - margin.right;
var innerHeight = height - margin.top - margin.bottom;
var svg = d3.select(".barchart").append("svg")
.attr("width", width)
.attr("height", height);
var group = svg.append("g")
.attr("transform", "translate(" + margin.left + "," + margin.top + ")");
var xAxisG = group.append("g")
.attr ("class", "x axis")
.attr("transform", "translate(0," + innerHeight + ")");
var yAxisG = group.append("g")
.attr ("class", "y axis");
//scales
var xScale = d3.scale.linear().range([0, innerWidth]);
var yScale = d3.scale.ordinal().rangeBands([0, innerHeight], barPadding);
var colorScale = d3.scale.category10();
//axes
var xAxis = d3.svg.axis().scale(xScale).orient("bottom")
.ticks(5)
.outerTickSize(0);
var yAxis = d3.svg.axis().scale(yScale).orient("left")
.outerTickSize(0);
function render(data)
{
xScale.domain([0, d3.max(data, function (d){ return d[xColumn]; })]);
yScale.domain(data.map(function (d){ return d[yColumn]; }));
//xAxisG.call(xAxis);
yAxisG.call(yAxis);
//bind data
var bars = group.selectAll("rect").data(data);
//enter
bars.enter().append("rect")
.attr("height", yScale.rangeBand());
//update
bars
.attr("x", 0)
.attr("y", function (d){ return yScale(d[yColumn]); })
.attr("width", function (d){ return xScale(d[xColumn]); })
.attr("fill" , function (d) {return colorScale(d[colorColumn]);});
//exit
bars.exit().remove();
}
render(myArrayOfObjects);