var margin = {top: 20, right: 20, bottom: 30, left: 50}, width = 600 - margin.left - margin.right, height = 300 - margin.top - margin.bottom; var data = ['profile.json', 'profile_short.json', 'profile_long_flat.json', 'profile_long_not_flat.json']; d3.json(data[0], function(data) { drawChart(data); }); function drawChart(data) { d3.select("#chart").html(""); var x = d3.scale.linear() .range([0, width]); var y = d3.scale.linear() .range([height, 0]); var xAxis = d3.svg.axis() .scale(x) .orient("bottom"); var yAxis = d3.svg.axis() .scale(y) .orient("left"); var area = d3.svg.area() .x(function(d) { return x(d.dist); }) .y0(height) .y1(function(d) { return y(d.alts.DTM25); }); var svg = d3.select("#chart").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 xDomain = d3.extent(data, function(d) { return d.dist; }); x.domain(xDomain); var yDomain = [d3.min(data, function(d) { return d.alts.DTM25; }), d3.max(data, function(d) { return d.alts.DTM25; })]; y.domain(yDomain); var xResolution = (xDomain[1] - xDomain[0]) / width; var yResolution = (yDomain[1] - yDomain[0]) / height; var ratioXY = yResolution / xResolution; var ratios = [0.05, 0.1, 0.2]; // determine the more appropriate ratio for (var i = 0; i < ratios.length; i++) { if (ratioXY <= ratios[i]) { ratioXY = ratios[i]; break; } } // change the domain accordingly var mean = (yDomain[1] - yDomain[0]) / 2 + yDomain[0]; y.domain([mean - (xResolution * ratioXY) * height / 2, mean + (xResolution * ratioXY) * height / 2]); svg.append("path") .datum(data) .attr("class", "area") .attr("d", area); svg.append("g") .attr("class", "x axis") .attr("transform", "translate(0," + height + ")") .call(xAxis); svg.append("g") .attr("class", "y axis") .call(yAxis); d3.select('#ratio').text(1 / ratioXY); }