Изменить размер SVG в соответствии с размером устройства в D3.js?
Я пытаюсь визуализировать карту и графики, используя leaflet.js и d3.js. Я хочу сделать совместимым устройство просмотра. Но мои диаграммы и карты не совместимы с устройствами. Код показа простой гистограммы ниже:
function updateCharts(data){
var margin = {top: 20, right: 20, bottom: 70, left: 40},
width = 400 - margin.left - margin.right,
height = 250 - margin.top;
var x = d3.scale.ordinal().rangeRoundBands([ 0, width ], .05);
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").ticks(20);
x.domain(data.map(function(d) { return d.time; }));
y.domain([0, d3.max(data, function(d) { return d.speed1; })]);
var svg=d3.select("#bar").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 transition = svg.transition().duration(750), delay = function(d, i) {
return i * 50;
};
svg.append("text").attr("x", width / 2).attr("y", 0).style("text-anchor",
"middle").text("Speed of Lane1 Vs Time");
//Create X axis label
svg.append("text")
.attr("x", width / 2 )
.attr("y", height + margin.bottom)
.style("text-anchor", "middle")
.text("Time");
svg.append("text")
.attr("transform", "rotate(-90)")
.attr("y", 0-margin.left)
.attr("x",0 - (height / 2))
.attr("dy", "1em")
.style("text-anchor", "middle")
.text("Speed");
svg.append("g")
.attr("class", "x axis")
.attr("transform", "translate(0," + height + ")")
.call(xAxis)
.selectAll("text")
.style("text-anchor", "end")
.attr("dx", "-.8em")
.attr("dy", "-.55em")
.attr("transform", "rotate(-90)" );
svg.append("g")
.attr("class", "y axis")
.call(yAxis)
.append("text")
.attr("transform", "rotate(-90)")
.attr("y", 6)
.attr("dy", ".71em")
.attr("x",5)
.style("text-anchor", "middle");
svg.selectAll("rect")
.data(data)
.enter().append("rect").transition().delay(0)
.style("fill", "red")
.attr("x", function(d,i) { return x(d.time); }) //v
.attr("width", x.rangeBand())
.attr("y", function(d) { return y(d.speed1); })
.attr("height", function(d) { return height - y(d.speed1); });
//function(d){return " "+d.datetime;}
//transition.select(".y.axis").call(yAxis);
// New SVG
}
В HTML я также добавил метатег для совместимости устройств, как показано ниже:
<meta name="viewport" content="width=device-width, initial-scale=1.0">
Даже если размер устройства небольшой, появляется горизонтальная полоса прокрутки. Но я не хочу видеть такую полосу прокрутки по горизонтали. Я хочу, чтобы графики и карты соответствовали ширине устройства. Может ли кто-нибудь любезно помочь мне решить эту проблему?
1 ответ
Пример (примечание: использует jQuery):
var $graphic = $('#graphic');
function drawGraphic() {
var margin = { top: 10, right: 10, bottom: 30, left: 30 };
var width = $graphic.width() - margin.left - margin.right;
$graphic.empty();
// ... code to create the chart ...
}
d3.csv("data.csv", function(data) { //loading data, may differ
// ... manipulate data here ...
drawGraphic();
window.onresize = drawGraphic;
}
Метод, основанный на адаптивных диаграммах D3, описан здесь: http://blog.apps.npr.org/2014/05/19/responsive-charts.html
Мой пример описан здесь: http://bl.ocks.org/michalskop/2fa7d4c0ae029c36ba4e
Смотрите это в действии здесь: http://bl.ocks.org/michalskop/raw/2fa7d4c0ae029c36ba4e/
Моя демоверсия для адаптивной карты на основе Leaflet: http://bl.ocks.org/michalskop/raw/001f6182db52d08f4925/