2016-05-03 3 views
-2

Я пытаюсь обновить гистограмму на основе объектов массива, и кажется, что мой бар не обновляется.Обновление диаграммы d3 не работает

могли бы вы, пожалуйста, дайте мне знать, где я буду неправильно Ниже приведен фрагмент кода folllowing

<!DOCTYPE html> 
 
<meta charset="utf-8"> 
 
<style> 
 

 
body { 
 
    font: 10px sans-serif; 
 
} 
 

 
.axis path, 
 
.axis line { 
 
    fill: none; 
 
    stroke: #000; 
 
    shape-rendering: crispEdges; 
 
} 
 

 
.bar { 
 
    fill: steelblue; 
 
} 
 

 
.x.axis path { 
 
    display: none; 
 
} 
 

 
</style> 
 
<body> 
 
<h1> Monthly Trend Based on Folder</h1> 
 
<select onchange="updateData()" id="metric"> 
 
    <option >SP_Sterling</option> 
 
    <option >IWH</option> 
 
    <option >IWH_BreakFix</option> 
 
</select> 
 
<div id="chart"> 
 
</div> 
 
<script src="http://d3js.org/d3.v3.min.js"></script> 
 
<script> 
 

 
var margin = {top: 20, right: 20, bottom: 30, left: 40}, 
 
    width = 760 - margin.left - margin.right, 
 
    height = 500 - margin.top - margin.bottom; 
 

 
var svg = d3.select("body").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 + ")"); 
 
\t 
 
\t // Update the bar chart 
 
//i'm trying to Update the bar chart based on array objects and it seems that my bar is not getting refreshed 
 

 

 
var x0 = d3.scale.ordinal() 
 
    .rangeRoundBands([0, width], .1); 
 

 
var x1 = d3.scale.ordinal(); 
 

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

 
var color = d3.scale.ordinal() 
 
    .range(["#00a65a", "#f56954"]); 
 

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

 
var yAxis = d3.svg.axis() 
 
    .scale(y) 
 
    .orient("left") 
 
    .tickFormat(d3.format(".2s")); 
 

 
function loadData() { \t 
 
\t 
 
var metric = document.getElementById('metric').selectedOptions[0].text; 
 
var dataFile = metric + '.csv'; 
 
return dataFile; 
 
}; 
 

 

 
d3.csv(loadData(), function(error, data) { 
 

 

 
console.log("Inside load function"); 
 
    if (error) throw error; 
 

 
    var monthvalues = d3.keys(data[0]).filter(function(key) { return key !== "Month"; }); 
 

 
    data.forEach(function(d) { 
 
    d.monthdata = monthvalues.map(function(name) { return {name: name, value: +d[name]}; }); 
 
    }); 
 

 
    x0.domain(data.map(function(d) { return d.Month; })); 
 
    x1.domain(monthvalues).rangeRoundBands([0, x0.rangeBand()]); 
 
    y.domain([0, d3.max(data, function(d) { return d3.max(d.monthdata, function(d) { return d.value; }); })]); 
 
    
 
    svg.append("g") 
 
     .attr("class", "x axis") 
 
     .attr("transform", "translate(0," + height + ")") 
 
     .call(xAxis); 
 

 
    svg.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("Count"); 
 
\t 
 
//enter 
 
    var bar = svg.selectAll(".bar") 
 
    .data(data); 
 
    bar.enter() 
 
\t .append("g") 
 
    .attr("class", "bar") 
 
    .attr("transform", function(d) { return "translate(" + x0(d.Month) + ",0)"; }); 
 

 
//update() 
 
    bar.selectAll("rect") 
 
     .data(function(d) { return d.monthdata; }) 
 
     .enter() 
 
\t .append("rect") 
 
\t .attr("width", x1.rangeBand()) 
 
     .attr("x", function(d) { return x1(d.name); }) 
 
     .attr("y", function(d) { return y(d.value); }) 
 
     .attr("height", function(d) { return height - y(d.value); }) 
 
     .style("fill", function(d) { return color(d.name); }); 
 
    //remove() 
 
    
 
var legend = svg.selectAll(".legend") 
 
     .data(monthvalues.slice().reverse()) 
 
     .enter().append("g") 
 
     .attr("class", "legend") 
 
     .attr("transform", function(d, i) { return "translate(0," + i * 20 + ")"; }); 
 

 
    legend.append("rect") 
 
     .attr("x", width - 18) 
 
     .attr("width", 18) 
 
     .attr("height", 18) 
 
     .style("fill", color) 
 
\t .append("rect"); 
 

 
    legend.append("text") 
 
     .attr("x", width - 24) 
 
     .attr("y", 9) 
 
     .attr("dy", ".35em") 
 
     .style("text-anchor", "end") 
 
     .text(function(d) { return d; }); 
 
}); 
 
loadData(); 
 

 
function updateData(){ 
 

 
console.log(loadData()); 
 
d3.csv(loadData(), function(error, data) { 
 

 
    if (error) throw error; 
 

 
    var monthvalues = d3.keys(data[0]).filter(function(key) { return key !== "Month"; }); 
 
    console.log(monthvalues); 
 
    
 
    data.forEach(function (d) { 
 
\t \t d.monthdata = monthvalues.map(function(name) { return {name: name, value: +d[name]}; }); 
 
\t \t console.log("Month Data:"+d.monthdata); 
 
\t \t 
 
    }); 
 
\t 
 
    x0.domain(data.map(function(d) { return d.Month; })); 
 
    x1.domain(monthvalues).rangeRoundBands([0, x0.rangeBand()]); 
 
    y.domain([0, d3.max(data, function(d) { return d3.max(d.monthdata, function(d) { return d.value; }); })]); 
 
    
 
    
 
     svg.selectAll("g.y.axis") 
 
     .call(yAxis); 
 
\t \t svg.selectAll("g.x.axis") 
 
     .call(xAxis); 
 

 
var bar = svg.selectAll(".bar") 
 
    .data(data) 
 
\t .append("g") 
 
    .attr("class", "bar") 
 
    .attr("transform", function(d) { return "translate(" + x0(d.Month) + ",0)"; }); 
 

 
//update() 
 
    bar.selectAll("rect") 
 
     .data(data) 
 
     .enter() 
 
\t .append("rect") 
 
\t .attr("width", x1.rangeBand()) 
 
     .attr("x", function(d) { return x1(d.name); }) 
 
     .attr("y", function(d) { return y(d.value); }) 
 
     .attr("height", function(d) { return height - y(d.value); }) 
 
     .style("fill", function(d) { return color(d.name); }); 
 

 
    }); 
 
    
 

 
}; 
 

 

 
</script> 
 
</body> 
 
</html>

`

+0

data.csv Месяц, Success_Count, Failure_Count Jan, 35,5 Feb, 5,2 March, 40,2 –

+0

У вас есть несколько проблем с кодом. Общая идея обновления сюжета с новыми данными заключается в том, чтобы просто обновлять свои домены после применения новых данных. Кроме того, если количество баров (точек данных) остается неизменным при обновлении данных, вам не нужно вызывать .enter(). Другое дело, вы должны сначала настроить свои оси, весы и т. Д., Вне функции d3.csv(). Проверьте это: https://bl.ocks.org/RandomEtc/cff3610e7dd47bef2d01 – rby

ответ

0

Спасибо Sidd, за помощь ,, в том, что заказ можно было бы заменить newData на чтение из csv-файла , так что newData заменяется объектами массива d.monthdata из приведенного ниже описания

Текущий жестко закодированы массив объектов вар NewData = [ { "Месяц": "Февраль", "SUCCESS_COUNT": 49, "FAILURE_COUNT": 10 }, { "Месяц": «Jan ", " Success_Count ": 35, " Failure_Count ": 5 } ];

Предлагаемое заявление -

вар метрика = document.getElementById ('метрика') selectedOptions [0] .text. var dataFile = метрика + '.csv';

d3.csv (DATAFILE, функция (ошибка, данные) {

console.log ("Внутри функции нагрузки"); , если (ошибка) Ошибка броска;

вар monthvalues ​​= d3.keys (данные [0]). filter (function (key) {return key! == "Month";});

data.forEach (функция (d) { d.monthdata = monthvalues.map (функция (функция имя): {return {name: name, value: + d [name]};}); })

+0

См. Ответ на [вопрос] (http://stackoverflow.com/questions/37017158/enhancing-d3-code-in-assigning- data-from-csv-file-to-a-array-variable), который вы задали. Пожалуйста, не стесняйтесь принять ответ, если он отвечает на ваш вопрос. Кроме того, пожалуйста, напишите новый вопрос или прокомментируйте ответ в случае дальнейших сомнений, так как этот ответ - это новый вопрос, который вы разместили в разделе ответов на вопрос, который вызывает недоумение. – SiddP

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