2016-04-03 7 views
0

Ich arbeite an einer Grafik, die die Temperatur, Datum und Uhrzeit zeigt. Bis jetzt funktioniert alles ziemlich gut, aber um die neuen Werte aus meiner MySQL-Datenbank zu bekommen, muss ich meine Seite komplett auffrischen. Ich möchte in der Lage sein, die Grafik zu aktualisieren, ohne die Refresh-Taste zu drücken. Dies ist der Code:Wie man eine Grafik in D3.js aktualisiert, wenn man eine Taste drückt?

<?php require($_SERVER['DOCUMENT_ROOT'] . '/assets/php/getTemp.php'); ?> 

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

<head> 
    <title>RPi</title> 
</head> 

<style> 

div.tooltip { 
    position: absolute; 
    text-align: center; 
    width: 120px; 
    height: 28px; 
    padding: 3px; 
    font: 12px sans-serif; 
    background: lightgrey; 
    border: 0px; 
    border-radius: 8px; 
    pointer-events: none; 
} 


body { font: 14px Arial;} 

path { 
    stroke: #FF8C00; 
    stroke-width: 3; 
    fill: none; 
} 

.axis path, 
.axis line { 
    fill: none; 
    stroke: black; 
    stroke-width: 2; 
    shape-rendering: crispEdges; 
} 

.grid .tick { 
    stroke: grey; 
    stroke-opacity: 0.3; 
    shape-rendering: geometricPrecision; 
} 
.grid path { 
      stroke-width: 0; 
} 


</style> 
<body> 


<div id="option"> 
    <input name="updateButton" 
      type="button" 
      value="Update" 
      onclick="updateData()" 
    /> 
</div> 


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

<script> 


var margin = {top: 30, right: 20, bottom: 30, left: 50}, 
    width = 800 - margin.left - margin.right, 
    height = 270 - margin.top - margin.bottom; 

var parseDate = d3.time.format("%Y-%m-%d %H:%M:%S").parse; 
var formatTime = d3.time.format("%d-%m-%Y %H:%M:%S"); 

var x = d3.time.scale().range([0, width]); 
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(5); 

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

var div = d3.select("body").append("div") 
    .attr("class", "tooltip") 
    .style("opacity", 0); 

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 + ")"); 

function make_x_axis() { 
    return d3.svg.axis() 
     .scale(x) 
     .orient("bottom") 
     .ticks(5) 
} 

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

<?php echo "data=".$json_data.";" ?> 
data.forEach(function(d) { 
d.datetime = parseDate(d.datetime); 
d.temperature = +d.temperature; 
}); 

x.domain(d3.extent(data, function(d) { return d.datetime; })); 
y.domain([0, d3.max(data, function(d) { return d.temperature; })]); 


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


svg.selectAll("dot") 
    .data(data) 
.enter().append("circle") 
    .attr("r", 4) 
    .attr("cx", function(d) { return x(d.datetime); }) 
    .attr("cy", function(d) { return y(d.temperature); }) 
    .on("mouseover", function(d) { 
     div.transition() 
      .duration(200) 
      .style("opacity", 1); 
     div.html(formatTime(d.datetime) + "<br/>" + d.temperature + " &#8451") 
      .style("left", (d3.event.pageX + 16) + "px") 
      .style("top", (d3.event.pageY + 16) + "px") 
     .style("position", "absolute"); 
     }) 
    .on("mouseout", function(d) { 
     div.transition() 
      .duration(50) 
      .style("opacity", 0); 
}); 

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("") 
) 

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

svg.append("g") 
.attr("class", "y axis") 
.call(yAxis); 


</script> 
</body> 

Ich habe versucht, dies zu tun:

function updateData() { 

//d3.json("/assets/php/getTemp.php", function(error, data) { 
     <?php echo "data=".$json_data.";" ?> 
     data.forEach(function(d) { 
     d3.select("body").selectAll("svg") 
     d.datetime = parseDate(d.datetime); 
     d.temperature = +d.temperature; 
}); 

x.domain(d3.extent(data, function(d) { return d.datetime; })); 
y.domain([0, d3.max(data, function(d) { return d.temperature; })]); 

var svg = d3.select("body").transition(); 

    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); 
}; 

aber nichts passiert, nicht einmal ein Fehler auf.

Wenn es darauf ankommt dies den PHP-Code wird verwendet, um die Temperaturen und Zeit Form MySQL zu erhalten:

<?php 
$hostname = 'localhost'; 
$username = 'root'; 
$password = 'admin'; 

try { 
    $dbh = new PDO("mysql:host=$hostname;dbname=temp_database", 
           $username, $password); 


    $sth = $dbh->prepare(" 
     SELECT `datetime`, `temperature` FROM `tempLog` 
    "); 
    $sth->execute(); 


    $result = $sth->fetchAll(PDO::FETCH_ASSOC); 


    $dbh = null; 

} 
catch(PDOException $e) 
    { 
     echo $e->getMessage(); 
    } 

$json_data = json_encode($result); 
?> 

Was ich tun muss?

+0

Sieht gut aus für mich. Könntest du das vielleicht mit einem Beispiel für die Art von Daten, die du benutzt, in ein Spiel stecken? – BHouwens

+0

Natürlich: https://jsfiddle.net/zzmoL7Le/4/ Ich hoffe, der Link ist in Ordnung. –

+0

Problem scheint die Formatierung zu sein, die Sie an den Daten in der 'updateData' Funktion ausführen. Wenn Sie diesen Abschnitt kommentieren, wird der Code ausgeführt – BHouwens

Antwort

0

Schauen Sie sich die Funktion d3.json an. Dies ermöglicht es Ihnen, json von PHP-Skripten zu erhalten, ohne die gesamte Seite von Grund auf neu zu laden. Es ist AJAX-Zeug, aber die d3-Hilfsfunktionen verbergen die Details.

https://github.com/mbostock/d3/wiki/Requests

PS. Denken Sie daran, es wird ein asynchroner Aufruf sein, so finden Sie in der akzeptierte Antwort auch hier: JSON output from PHP using d3.json


Wie, warum es nicht zur Zeit nicht funktioniert, meine Vermutung *, obwohl es nicht genug Informationen, um zu bestätigen, ist dass es keine Änderung ist, weil es immer die gleichen Daten sind, so wird nichts

<?php echo "data=".$json_data.";" ?> 

Diese Linie ^^^ in updateData ändern, wenn zu Beginn ausgewertet wird und dann wird die gesamte Funktion in den JavaScript-Bereich plonked. Wie oft Sie dann updateData aufrufen, ändert sich die zuvor generierte Javascript-Variable (data={some_json}) nicht, ohne die php-Seite neu zu laden, die updateData generiert hat, selbst wenn Sie den php aufrufen, der die serverseitige Variable generiert.

* könnte Unsinn sein, aber das Bit über der Linie ist immer noch richtig

Verwandte Themen