Use Stddev to better frame graphs
Use Stddev to better frame graphs

<?php <?php
$service_periods = Array( $service_periods = Array(
'sunday', 'sunday',
'saturday', 'saturday',
'weekday' 'weekday'
); );
   
function service_period($date = "") function service_period($date = "")
{ {
if (isset($_SESSION['service_period'])) return $_SESSION['service_period']; if (isset($_SESSION['service_period'])) return $_SESSION['service_period'];
$override = getServiceOverride($date); $override = getServiceOverride($date);
if ($override['service_id']){ if ($override['service_id']){
return $override['service_id']; return $override['service_id'];
} }
   
switch (date('w',($date != "" ? $date : time()))) { switch (date('w',($date != "" ? $date : time()))) {
case 0: case 0:
return 'sunday'; return 'sunday';
case 6: case 6:
return 'saturday'; return 'saturday';
default: default:
return 'weekday'; return 'weekday';
} }
} }
function midnight_seconds() function midnight_seconds($time = "")
{ {
// from http://www.perturb.org/display/Perlfunc__Seconds_Since_Midnight.html // from http://www.perturb.org/display/Perlfunc__Seconds_Since_Midnight.html
  if ($time != "") {
  return (date("G", $time) * 3600) + (date("i", $time) * 60) + date("s", $time);
  }
if (isset($_SESSION['time'])) { if (isset($_SESSION['time'])) {
$time = strtotime($_SESSION['time']); $time = strtotime($_SESSION['time']);
return (date("G", $time) * 3600) + (date("i", $time) * 60) + date("s", $time); return (date("G", $time) * 3600) + (date("i", $time) * 60) + date("s", $time);
} }
return (date("G") * 3600) + (date("i") * 60) + date("s"); return (date("G") * 3600) + (date("i") * 60) + date("s");
} }
function midnight_seconds_to_time($seconds) function midnight_seconds_to_time($seconds)
{ {
if ($seconds > 0) { if ($seconds > 0) {
$midnight = mktime(0, 0, 0, date("n") , date("j") , date("Y")); $midnight = mktime(0, 0, 0, date("n") , date("j") , date("Y"));
return date("h:ia", $midnight + $seconds); return date("h:ia", $midnight + $seconds);
} }
else { else {
return ""; return "";
} }
} }
?> ?>
   
<?php <?php
include ('../include/common.inc.php'); include ('../include/common.inc.php');
include_header("MyWay Deltas", "mywayDelta"); include_header("MyWay Deltas", "mywayDelta");
//collect all observation not in delta  
$query = "select * from myway_timingdeltas";  
debug($query, "database");  
$query = $conn->prepare($query);  
$query->execute();  
if (!$query) {  
databaseError($conn->errorInfo());  
return Array();  
}  
   
?> ?>
   
<!--[if lte IE 8]><script language="javascript" type="text/javascript" src="../js/flot/excanvas.min.js"></script><![endif]--> <!--[if lte IE 8]><script language="javascript" type="text/javascript" src="../js/flot/excanvas.min.js"></script><![endif]-->
<script language="javascript" type="text/javascript" src="../js/flot/jquery.flot.js"></script> <script language="javascript" type="text/javascript" src="../js/flot/jquery.flot.js"></script>
<div id="placeholder" style="width:800px;height:600px"></div> <div id="placeholder" style="width:800px;height:600px"></div>
<script type="text/javascript"> <script type="text/javascript">
$(function () { $(function () {
  var d = new Date();
  d.setUTCMinutes(0);
  d.setUTCHours(0);
  var midnight = d.getTime();
var d1 = []; var d1 = [];
<?php <?php
$i=0; //$query = "select * from myway_timingdeltas order by time";
foreach($query->fetchAll() as $delta) { $query = "select * from myway_timingdeltas where abs(timing_delta) < 2*(select stddev(timing_delta) from myway_timingdeltas) order by time;";
echo "d1.push([$i, {$delta['timing_delta']}]); \n"; $query = $conn->prepare($query);
$i++; $query->execute();
  if (!$query) {
  databaseError($conn->errorInfo());
  return Array();
  }
  $i = 0;
  foreach ($query->fetchAll() as $delta) {
  echo "d1.push([ midnight+ (1000*" . midnight_seconds(strtotime($delta['time'])) . "), {$delta['timing_delta']}]); \n";
  $i++;
}; };
?> ?>
   
$.plot($("#placeholder"), [ var d2 = [];
  <?php
  //$query = "select * from myway_timingdeltas order by route_full_name";
  $query = "select * from myway_timingdeltas where abs(timing_delta) < 2*(select stddev(timing_delta) from myway_timingdeltas) order by route_full_name";
  $query = $conn->prepare($query);
  $query->execute();
  if (!$query) {
  databaseError($conn->errorInfo());
  return Array();
  }
  $i = 0;
  foreach ($query->fetchAll() as $delta) {
  // echo "d2.push([$i, {$delta['timing_delta']}]); \n";
  $i++;
  };
  ?>
  var placeholder = $("#placeholder");
   
  var plot = $.plot(placeholder, [
{ {
data: d1, data: d1,
points: { show: true } points: { show: true }
}, },
  {
  data: d2,
  points: { show: true }
  },
], ],
{ {
  xaxis: {
  mode: "time",
  min: midnight + (1000*60*60*8),
  max: midnight + (1000*60*60*23.5)
  },
  yaxis: {
  tickFormatter: yformatter
  },
grid: { hoverable: true, clickable: true }, grid: { hoverable: true, clickable: true },
}); });
}); var o;
  o = plot.pointOffset({ x: midnight+ (9*60*60*1000), y: -1.2});
  placeholder.append('<div style="position:absolute;left:' + (o.left + 4) + 'px;top:' + o.top + 'px;color:#666;font-size:smaller">9am</div>');
  o = plot.pointOffset({ x: midnight+ (16*60*60*1000), y: -1.2});
  placeholder.append('<div style="position:absolute;left:' + (o.left + 4) + 'px;top:' + o.top + 'px;color:#666;font-size:smaller">4pm</div>');
   
  });
  function yformatter(v) {
  return Math.floor(v/60) + " minutes " + (v == 0 ? "" : (v >0 ? "early":"late"))
  }
function showTooltip(x, y, contents) { function showTooltip(x, y, contents) {
$('<div id="tooltip">' + contents + '</div>').css( { $('<div id="tooltip">' + contents + '</div>').css( {
position: 'absolute', position: 'absolute',
display: 'none', display: 'none',
top: y + 5, top: y + 5,
left: x + 5, left: x + 5,
border: '1px solid #fdd', border: '1px solid #fdd',
padding: '2px', padding: '2px',
'background-color': '#fee', 'background-color': '#fee',
opacity: 0.80 opacity: 0.80
}).appendTo("body").fadeIn(200); }).appendTo("body").fadeIn(200);
} }
var previousPoint = null; var previousPoint = null;
$("#placeholder").bind("plothover", function (event, pos, item) { $("#placeholder").bind("plothover", function (event, pos, item) {
$("#x").text(pos.x.toFixed(2)); $("#x").text(pos.x.toFixed(2));
$("#y").text(pos.y.toFixed(2)); $("#y").text(pos.y.toFixed(2));
if (item) { if (item) {
if (previousPoint != item.dataIndex) { if (previousPoint != item.dataIndex) {
previousPoint = item.dataIndex; previousPoint = item.dataIndex;
$("#tooltip").remove(); $("#tooltip").remove();
var x = item.datapoint[0].toFixed(2), var x = item.datapoint[0].toFixed(2),
y = item.datapoint[1].toFixed(2); y = item.datapoint[1].toFixed(2);
  var d = new Date();
  d.setTime(x);
  var time = d.getUTCHours() +':'+ (d.getUTCMinutes().toString().length == 1 ? '0'+ d.getMinutes(): d.getUTCMinutes())
   
   
showTooltip(item.pageX, item.pageY, showTooltip(item.pageX, item.pageY,
item.series.label + " of " + x + " = " + y +" ( "+ y/60+" minutes )"); item.series.label + " of " + x + " "+ time +" = " + y +" ( "+ y/60+" minutes )");
} }
} }
else { else {
$("#tooltip").remove(); $("#tooltip").remove();
previousPoint = null; previousPoint = null;
} }
}); });
   
</script> </script>