2016-03-02 5 views
1

Я мог бы использовать некоторую помощь в решении связанной с d3js проблемы. Я делал все, что знал и искал всюду, но до сих пор не могу понять решение. У меня простая база данных, как показано ниже. при выполнении кода он считывает все данные, и все в порядке, когда он обновляется, он обновляет график температуры, но не влажность ... Я пробовал много вещей, включая добавление valueline2 к функции обновления, но он все еще не работает ... Любая помощь была бы очень благодарна.d3js multigraph auto update

dtg | температура | гул
2016-03-02 09:14:00 23 40
2016-03-02 09:10:00 22 45

<!DOCTYPE html> 
<meta charset="utf-8"> 
<style> /* set the CSS */ 

body { font: 14px Arial;} 

path { 
    stroke: steelblue; 
    stroke-width: 2; 
    fill: none; 
} 

.axis path, 
.axis line { 
    fill: none; 
    stroke: grey; 
    stroke-width: 1; 
    shape-rendering: crispEdges; 
} 
/* Addon 5,6,7 - part 1*/ 
.grid .tick { 
    stroke: lightgrey; 
    stroke-opacity: 0.7; 
    shape-rendering: crispEdges; 
} 
.grid path { 
     stroke-width: 0; 
} 


</style> 
<body> 

<!-- load the d3.js library -->  
<script src="http://d3js.org/d3.v3.min.js"></script> 

<script> 

// Set the dimensions of the canvas/graph 
var margin = {top: 30, right: 60, bottom: 50, left: 50}, 
    width = 600 - margin.left - margin.right, 
    height = 300 - margin.top - margin.bottom; 

// Parse the date/time 
/* var parseDate = d3.time.format("%d-%b-%y").parse; */ 
var parseDate = d3.time.format("%Y-%m-%d %H:%M:%S").parse; 

// Set the ranges 
var x = d3.time.scale().range([0, width]); 
var y = d3.scale.linear().range([height, 0]); 

// Define the axes 
var xAxis = d3.svg.axis().scale(x) 
    .orient("bottom").ticks(6); 

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

// Define the line 
var valueline = d3.svg.line() 
    .interpolate("basis") 
    .x(function(d) { return x(d.dtg); }) 
    .y(function(d) { return y(d.temperature); }); 

// Define the 2nd line -- Addon 9 part 1 
var valueline2 = d3.svg.line() 
    .interpolate("basis") 
    .x(function(d) { return x(d.dtg); }) 
    .y(function(d) { return y(d.hum); }); 

// Adds the svg canvas 
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 + ")"); 

// Addon 5,6,7 - part 2 
function make_x_axis() {   
    return d3.svg.axis() 
    .scale(x) 
    .orient("bottom") 
    .ticks(8) 
} 

function make_y_axis() {   
    return d3.svg.axis() 
    .scale(y) 
    .orient("left") 
    .ticks(8) 
} 


// Get the data 
d3.json("data.php", function(error, data) { 
    data.forEach(function(d) { 
    d.dtg = parseDate(d.dtg); 
    d.temperature = +d.temperature; 
     d.hum = +d.hum; // Addon 9 part 3 
    }); 

    // Scale the range of the data 
    x.domain(d3.extent(data, function(d) { return d.dtg; })); 
    y.domain([0, d3.max(data, function(d) { return Math.max(d.temperature, d.hum)+5; })]); 
    // y.domain([0, d3.max(data, function(d) { return d.temperature; })]); 

    // Add the valueline path. 
    svg.append("path") 
    .attr("class", "line") 
    .attr("d", valueline(data)); 

    // Add the valueline2 path - Addon 9 part 2 
    svg.append("path")  
    .attr("class", "line") 
    .style("stroke", "red") 
    .attr("d", valueline2(data)); 

    // Add the X Axis 
    svg.append("g") 
    .attr("class", "x axis") 
    .attr("transform", "translate(0," + height + ")") 
    .call(xAxis); 

    // Add the Y Axis 
    svg.append("g") 
    .attr("class", "y axis") 
    .call(yAxis); 

// Addon 4 
    svg.append("g")    // Add the Y Axis 
    .attr("class", "y axis") 
    .call(yAxis); 

// Addon 5,6,7 - part 3 
    svg.append("g")   
    .attr("class", "grid") 
    .attr("transform", "translate(0," + height + ")") 
    .call(make_x_axis() 
     .tickSize(-height, 0, 0) 
     .tickFormat("") 
    ) 

    svg.append("g")   
    .attr("class", "grid") 
    .call(make_y_axis() 
     .tickSize(-width, 0, 0) 
     .tickFormat("") 
    ) 

}); 


var inter = setInterval(function() { 
      updateData(); 
    }, 5000); 

// ** Update data section (Called from the onclick) 
function updateData() { 

    // Get the data again 
    d3.json("data.php", function(error, data) { 
    data.forEach(function(d) { 
    d.dtg = parseDate(d.dtg); 
    d.temperature = +d.temperature; 
    d.hum = +d.hum; 
    }); 

    // Scale the range of the data again 
    x.domain(d3.extent(data, function(d) { return d.dtg; })); 
    y.domain([0, d3.max(data, function(d) { return Math.max(d.temperature, d.hum) + 5; })]); // Addon 9 part 4 

    // Select the section we want to apply our changes to 
    var svg = d3.select("body").transition(); 

    // Make the changes 
    svg.select(".line").duration(750).attr("d", valueline(data)); 
    svg.select("x.axis").duration(750).call(xAxis); 
    svg.select("y.axis").duration(750).call(yAxis); 


    }); 
} 

</script> 
</body> 
+0

что-нибудь появляется в консоли? –

+0

hi ooo, предлагаемое решение ниже работает! – badatz

+0

Тогда вы можете принять этот ответ (зеленый V) и проголосовать за него;) –

ответ

0

Вы должны дать различные имена для ваших различных линий. Сейчас обе линии имеют только один класс: «.line».

// Add the valueline path. 
svg.append("path") 
.attr("class", "line") 
.attr("id", "line1") //new id 
.attr("d", valueline(data)); 

// Add the valueline2 path - Addon 9 part 2 
svg.append("path")  
.attr("class", "line") 
.attr("id", "line2") //new id 
.style("stroke", "red") 
.attr("d", valueline2(data)); 

Затем в обновлении, вам нужно на самом деле обновить обе строки:

// Make the changes 
svg.select("#line1").duration(750).attr("d", valueline(data)); //update line 1 
svg.select("#line2").duration(750).attr("d", valueline2(data)); //update line 2 
svg.select("x.axis").duration(750).call(xAxis); 
svg.select("y.axis").duration(750).call(yAxis); 

Еще более «D3 дружественный» подход будет давать данные о температуре на свой первый путь, данные влажности ко второму, а затем на каждом пути вызывается вариант valueline, каждый из которых имеет свои соответствующие данные.

+0

Работали как шарм. Большое вам спасибо за помощь в этом. – badatz