2016-08-08 3 views
0

У меня есть диаграмма D3, но я не знаю, как ее обновить. Сама по себе информация обновляется, но когда я пытаюсь запустить содержимое .enter() и .exit(), я чаще всего получаю разные ошибки, что моя функция .exit() не существует. Я считаю, что я не уверен, как правильно обновить svg моего диаграммы.D3 Простая диаграмма не обновляется

Я предоставил codepen here, но все соответствующие коды указаны ниже.

var b_margin = {top: 20, right: 20, bottom: 30, left: 100}, 
     b_width = 450 - b_margin.left - b_margin.right, 
     b_height = 200 - b_margin.top - b_margin.bottom; 

    var x = d3.scale.ordinal() 
     .rangeRoundBands([0, b_width], .1); 

    var y = d3.scale.linear() 
     .range([b_height, 0]); 

    var xAxis = d3.svg.axis() 
     .scale(x) 
     .orient("bottom"); 

    var yAxis = d3.svg.axis() 
     .scale(y) 
     .orient("left"); 

    var barsvg = d3.select("body").append("svg") 
     .attr("width", b_width + b_margin.left + b_margin.right) 
     .attr("height", b_height + b_margin.top + b_margin.bottom) 
     .append("g") 
     .attr("transform", "translate(" + b_margin.left + "," + b_margin.top + ")"); 

createBarChart = function() 
{ 
    x.domain(bardata.map(function(d) { return d.age; })); 
    y.domain([0, d3.max(bardata, function(d) { return d.population; })]); 

    barsvg.append("g") 
     .attr("class", "x axis") 
     .attr("transform", "translate(0," + b_height + ")") 
     .call(xAxis); 

    barsvg.append("g") 
     .attr("class", "y axis") 
     .call(yAxis) 
    .append("text") 
     .attr("transform", "rotate(-90)") 
     .attr("y", 6) 
     .attr("dy", ".71em") 
     .style("text-anchor", "end") 
     .text("Frequency"); 

    barsvg.selectAll(".bar") 
     .data(bardata) 
    .enter().append("rect") 
     .attr("class", "bar") 
     .attr("x", function(d) { return x(d.age) + 25; }) 
     .attr("width", x.rangeBand() - 50) 
     .attr("y", function(d) { return y(d.population); }) 
     .attr("height", function(d) { return b_height - y(d.population); }); 

    function type(d) { 
    d.population = +d.population; 
    return d; 
    } 
} 

updateBarChart = function() 
{ 
    // Bar chart svg update 
    bardata = [ 
    {age: "title1", population: 50}, 
    {age: "title2", population: 25}, 
    {age: "title3", population: 70} 
    ] 

    barsvg.append("g") 
     .attr("class", "x axis") 
     .attr("transform", "translate(0," + b_height + ")") 
     .call(xAxis); 

    barsvg.append("g") 
     .attr("class", "y axis") 
     .call(yAxis) 
    .append("text") 
     .attr("transform", "rotate(-90)") 
     .attr("y", 6) 
     .attr("dy", ".71em") 
     .style("text-anchor", "end") 
     .text("Frequency"); 

    barsvg.selectAll(".bar") 
     .data(bardata) 
    .enter().append("rect") 
     .attr("class", "bar") 
     .attr("x", function(d) { return x(d.age) + 25; }) 
     .attr("width", x.rangeBand() - 50) 
     .attr("y", function(d) { return y(d.population); }) 
     .attr("height", function(d) { return b_height - y(d.population); }); 

    barsvg.exit().remove(); 

    barsvg.attr("y", function(d) { return y(d.value); }) 
     .attr("height", function(d) { return height - y(d.value); }); 
} 

EDIT: Моя функция updateBarData выглядит следующим образом:

+0

вы не определили функцию updateBarData –

+0

Ах, у меня есть. Данные не являются проблемой. Моя информация была скопирована и вставлена ​​из гораздо большего файла. Я больше пытаюсь выяснить, как правильно обновлять данные svg с учетом новых данных. Я добавлю отредацию всего за секунду с тем, как выглядит моя 'updateBarData'. –

ответ

1

Удивительный учебник here

Идея заключается в том, Сначала создайте пустой выбор и привязки данных к нему.

var bars = barsvg.selectAll(".bar") 
.data(bardata) // bars is empty but data is binded to it 

Теперь нам необходимо создать элементы на основе прилагаемых данных.

var newBars = bars.enter(); // creates new elements 
newBars.apped("rect")......... // we do all the manipulation here 

Чтобы удалить старые элементы, мы используем выделение на Exit

var obsoletebars = bars.exit(); //contains excess bars 
obsoletebars.remove(); // removes them 

Надеются, что это помогает.

\t \t var b_margin = {top: 20, right: 20, bottom: 30, left: 100}, 
 
    b_width = 450 - b_margin.left - b_margin.right, 
 
    b_height = 200 - b_margin.top - b_margin.bottom; 
 

 
var x = d3.scale.ordinal() 
 
.rangeRoundBands([0, b_width], .1); 
 

 
var y = d3.scale.linear() 
 
.range([b_height, 0]); 
 

 
var xAxis = d3.svg.axis() 
 
.scale(x) 
 
.orient("bottom"); 
 

 
var yAxis = d3.svg.axis() 
 
.scale(y) 
 
.orient("left"); 
 

 
var barsvg = d3.select("body").append("svg") 
 
.attr("width", b_width + b_margin.left + b_margin.right) 
 
.attr("height", b_height + b_margin.top + b_margin.bottom) 
 
.append("g") 
 
.attr("transform", "translate(" + b_margin.left + "," + b_margin.top + ")"); 
 

 
var bardata = [ 
 
    { age: "Public", population: 50 }, 
 
    { age: "Private, for-profit", population: 100 }, 
 
    { age: "Nonprofit", population: 25 } 
 
]; 
 

 
createBarChart(); 
 

 
$('#btn').click(function() { 
 
    updateBarChart(); 
 
}); 
 

 
function createBarChart() 
 
{ 
 
    x.domain(bardata.map(function(d) { return d.age; })); 
 
    y.domain([0, d3.max(bardata, function(d) { return d.population; })]); 
 

 
    barsvg.append("g") 
 
    .attr("class", "x axis") 
 
    .attr("transform", "translate(0," + b_height + ")") 
 
    .call(xAxis); 
 

 
    barsvg.append("g") 
 
    .attr("class", "y axis") 
 
    .call(yAxis) 
 
    .append("text") 
 
    .attr("transform", "rotate(-90)") 
 
    .attr("y", 6) 
 
    .attr("dy", ".71em") 
 
    .style("text-anchor", "end") 
 
    .text("Frequency"); 
 

 
    barsvg.selectAll(".bar") 
 
    .data(bardata) 
 
    .enter().append("rect") 
 
    .attr("class", "bar") 
 
    .attr("x", function(d) { return x(d.age) + 25; }) 
 
    .attr("width", x.rangeBand() - 50) 
 
    .attr("y", function(d) { return y(d.population); }) 
 
    .attr("height", function(d) { return b_height - y(d.population); }); 
 

 
    function type(d) { 
 
    d.population = +d.population; 
 
    return d; 
 
    } 
 
} 
 

 
function updateBarChart() 
 
{ 
 
\t 
 
var random = function() { return Math.floor(Math.random() * 70) + 30 }; \t 
 
    // Bar chart svg update 
 
    bardata = [ 
 
    { age: "Public", population: random() }, 
 
    { age: "Private, for-profit", population: random() }, 
 
    { age: "Nonprofit", population: random() } 
 
]; 
 

 
    barsvg.append("g") 
 
    .attr("class", "x axis") 
 
    .attr("transform", "translate(0," + b_height + ")") 
 
    .call(xAxis); 
 

 
    barsvg.append("g") 
 
    .attr("class", "y axis") 
 
    .call(yAxis) 
 
    .append("text") 
 
    .attr("transform", "rotate(-90)") 
 
    .attr("y", 6) 
 
    .attr("dy", ".71em") 
 
    .style("text-anchor", "end") 
 
    .text("Frequency"); 
 

 
    var bars = barsvg.selectAll(".bar") 
 
    .data(bardata); 
 
\t 
 
    bars.enter().append("rect") 
 
    .attr("class", "bar") 
 
    .attr("x", function(d) { return x(d.age) + 25; }) 
 
    .attr("width", x.rangeBand() - 50) 
 
    .attr("y", function(d) { return y(d.population); }) 
 
    .attr("height", function(d) { return b_height - y(d.population); }); 
 

 
    bars.exit().remove(); \t 
 
\t 
 
    bars.attr("y", function(d) { 
 
\t return y(d.population); }) 
 
    .attr("height", function(d) { return b_height - y(d.population); }); 
 
}
#btn { 
 
    border: 2px solid #212121; 
 
    width: 150px; 
 
    text-align: center; 
 
    padding: 15px; 
 
    cursor: pointer; 
 
}
<script src="https://d3js.org/d3.v3.min.js"></script> 
 
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script> 
 
<div id='btn'>Update</div> \t

+0

Большое вам спасибо за видео. Это было очень полезно. –

1

D3 не требует переписывания новых баров. просто выполните следующие действия по обновлению:

updateBarChart = function() 
 
{ 
 
    // Bar chart svg update 
 
    bardata = [ 
 
    {age: "title1", population: 50}, 
 
    {age: "title2", population: 25}, 
 
    {age: "title3", population: 70} 
 
    ] 
 

 
    barsvg.selectAll(".bar") 
 
     .data(bardata) 
 
     .attr("x", function(d) { return x(d.age) + 25; }) 
 
     .attr("width", x.rangeBand() - 50) 
 
     .attr("y", function(d) { return y(d.population); }) 
 
     .attr("height", function(d) { return b_height - y(d.population); }); 
 
}

Смежные вопросы