Изменить размер 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/

Другие вопросы по тегам