Plot entry breakdown piecharts.
authorCMDR furrycat <elite@furrycat.net>
Fri, 29 Jan 2016 15:16:03 +0000 (10:16 -0500)
committerCMDR furrycat <elite@furrycat.net>
Fri, 29 Jan 2016 15:16:03 +0000 (10:16 -0500)
lib/race.php
race.js

index b3d0266..f09895a 100644 (file)
@@ -1,3 +1,4 @@
+<script src="plotly-latest.min.js"></script>
 <h2>Races</h2>
 <?php
 
     return $ret;
   }
 
+  function pull($values) {
+    $ret = array();
+    $max = 0;
+    foreach ($values as $value) {
+      $ret[] = 0;
+      if ($value < $max) continue;
+      $max = $value;
+    }
+    for ($i = 0; $values[$i]; $i++) {
+      if ($values[$i] == $max) $ret[$i] = 0.2;
+    }
+    return $ret;
+  }
+
   function module_race($action) {
     if ($_POST['add_race']) {
       if (add_race($_POST["name"], $_POST["allotted_time"])) unset($_POST);
         echo "<p>" . $race->getLink() . "</p>\n";
         continue;
       }
-      if (! count($entries)) {
+      if (count($entries)) {
+        $prizewinners = find_prizewinners($entries, $allotted_time);
+        $plots = array(
+          "cmdr" => array(
+            "values" => array(),
+            "labels" => array(),
+            "text" => "By pilot",
+            "textinfo" => "label+percent",
+            "name" => "CMDR",
+            "scalegroup" => "entries",
+            "type" => "pie",
+            "domain" => array(
+              "x" => array(0, .23),
+              "y" => array(0, .48)
+            )
+          ),
+          "hull" => array(
+            "values" => array(),
+            "labels" => array(),
+            "name" => "Ship",
+            "text" => "By ship",
+            "textinfo" => "label+percent",
+            "scalegroup" => "entries",
+            "type" => "pie",
+            "domain" => array(
+              "x" => array(.61, .73),
+              "y" => array(0, .48)
+            )
+          ),
+          "lap_distance" => array(
+            "values" => array(),
+            "labels" => array(),
+            "name" => "Lap distance",
+            "text" => "By lap distance",
+            "textinfo" => "label+percent",
+            "scalegroup" => "entries",
+            "type" => "pie",
+            "domain" => array(
+              "x" => array(.35, .48),
+              "y" => array(.51, 1)
+            )
+          ),
+          "lap_count" => array(
+            "values" => array(),
+            "labels" => array(),
+            "name" => "Complete laps",
+            "text" => "By lap count",
+            "textinfo" => "label+percent",
+            "scalegroup" => "entries",
+            "type" => "pie",
+            "domain" => array(
+              "x" => array(.75, 1),
+              "y" => array(.51, 1)
+            )
+          )
+        );
+        $cmdrs = array();
+        $hulls = array();
+        $lap_counts = array();
+        $lap_distances = array();
+        foreach ($entries as $entry) {
+          $ship = $entry->getShip();
+          $cmdr_name = $ship->getCompetitor()->getCmdrName();
+          $hull_name = $ship->getHull()->getName();
+          $lap_count = $entry->getCompleteLaps();
+          $lap_count = sprintf("%d lap%s", $lap_count, ($lap_count == 1) ? "" : "s");
+          $lap_distance = format_distance($entry->getLapDistance()) . "Ly";
+          if (! in_array($cmdr_name, array_keys($cmdrs))) $cmdrs[$cmdr_name] = 0;
+          $cmdrs[$cmdr_name]++;
+          if (! in_array($hull_name, array_keys($hulls))) $hulls[$hull_name] = 0;
+          $hulls[$hull_name]++;
+          if (! in_array($lap_count, array_keys($lap_counts))) $lap_counts[$lap_count] = 0;
+          $lap_counts[$lap_count]++;
+          if (! in_array($lap_distance, array_keys($lap_distances))) $lap_distances[$lap_distance] = 0;
+          $lap_distances[$lap_distance]++;
+        }
+        foreach ($cmdrs as $cmdr_name => $count) {
+          $plots["cmdr"]["values"][] = $count;
+          $plots["cmdr"]["labels"][] = $cmdr_name;
+        }
+        $plots["cmdr"]["pull"] = pull($plots["cmdr"]["values"]);
+        foreach ($hulls as $hull_name => $count) {
+          $plots["hull"]["values"][] = $count;
+          $plots["hull"]["labels"][] = $hull_name;
+        }
+        $plots["hull"]["pull"] = pull($plots["hull"]["values"]);
+        foreach ($lap_counts as $lap_count => $count) {
+          $plots["lap_count"]["values"][] = $count;
+          $plots["lap_count"]["labels"][] = $lap_count;
+        }
+        $plots["lap_count"]["pull"] = pull($plots["lap_count"]["values"]);
+        foreach ($lap_distances as $lap_distance => $count) {
+          $plots["lap_distance"]["values"][] = $count;
+          $plots["lap_distance"]["labels"][] = $lap_distance;
+        }
+        $plots["lap_distance"]["pull"] = pull($plots["lap_distance"]["values"]);
+        echo "<script type=\"text/javascript\"><!--\n";
+        echo "var pies = " . json_encode(array_values($plots)) . ";\n";
+        echo "//--></script>\n";
+      }
+      else {
         echo "<p>No entries.</p>\n";
         continue;
       }
-      $prizewinners = find_prizewinners($entries, $allotted_time);
 
       echo "<h3>$name</h3>\n";
+      echo "<div id=\"plot\"></div>\n";
       echo "<div class=\"classification\">\n";
       foreach (array('html', 'bbcode') as $type) {
         echo "<div class=\"$type\">\n";
diff --git a/race.js b/race.js
index 84917ce..099f757 100644 (file)
--- a/race.js
+++ b/race.js
@@ -150,6 +150,10 @@ function loaded() {
     }
     validate();
   }
+  var canvas = document.getElementById('plot');
+  if (canvas && pies) Plotly.plot(canvas, pies, {
+    title: 'Entry distribution'
+  });
 }
 
 document.onload = loaded();