Skip to content

Instantly share code, notes, and snippets.

@miguelvb
Last active August 29, 2015 14:14
Show Gist options
  • Save miguelvb/c9b544741577d4117137 to your computer and use it in GitHub Desktop.
Save miguelvb/c9b544741577d4117137 to your computer and use it in GitHub Desktop.
WindRose D3
{"editor_editor":{"coffee":false,"vim":false,"emacs":false,"width":560,"height":680,"hide":false},"endpoint":"","editor_json0":{"vim":false,"emacs":false,"width":813,"height":457,"hide":true},"description":"WindRose D3","display":"svg","public":true,"require":[],"fileconfigs":{"_.md":{"default":true,"vim":false,"emacs":false,"fontSize":12},"config.json":{"default":true,"vim":false,"emacs":false,"fontSize":12},"inlet.js":{"default":true,"vim":false,"emacs":false,"fontSize":12},"inlet.svg":{"default":true,"vim":false,"emacs":false,"fontSize":12},"ksfo.json":{"default":true,"vim":false,"emacs":false,"fontSize":12}},"fullscreen":true,"play":false,"loop":false,"restart":false,"autoinit":true,"pause":true,"loop_type":"pingpong","bv":false,"nclones":15,"clone_opacity":0.4,"duration":3000,"ease":"linear","dt":0.01,"ajax-caching":true,"thumbnail":"http://i.imgur.com/HYvYNyY.png"}
//Live example from: https://gist.github.com/3589712
//https://groups.google.com/forum/?fromgroups=#!searchin/d3-js/windhistory.com/d3-js/0fYBKF8mYvE/0VXPUCBBtXsJ
//ksfo is taken from windhistory.com server
var data = tributary.ksfo;
//scroll to bottom to see how we call the drawBigWindrose function with the data
//we don't have a selectedMonthControl so we just turn on all the months
//var months = [true,true,false,true,false,true,false,false,false,false,false,true];
var months = []
for(var i = 0; i < 12; i++) {
months.push(true);
}
//months = [false,false,false,false,false,true,false,false,false,false,false,false];
var svg = d3.select("svg");
//setup some containers to put the plots inside
var big = svg.append("g")
.attr("id", "windrose")
.attr("transform", "translate(" + [34, 100] + ")");
var avg = svg.append("g")
.attr("id", "avg")
.attr("transform", "translate(" + [464, 100] + ")");
// This is the core Javascript code for http://windhistory.com/
// I haven't done a full open source release, but I figured I'd put the most important
// D3 code out there for people to learn from. [email protected]
/** Common wind rose code **/
// Function to draw a single arc for the wind rose
// Input: Drawing options object containing
// width: degrees of width to draw (ie 5 or 15)
// from: integer, inner radius
// to: function returning the outer radius
// Output: a function that when called, generates SVG paths.
// It expects to be called via D3 with data objects from totalsToFrequences()
var arc = function(o) {
return d3.svg.arc()
.startAngle(function(d) { return (d.d - o.width) * Math.PI/180; })
.endAngle(function(d) { return (d.d + o.width) * Math.PI/180; })
.innerRadius(o.from)
.outerRadius(function(d) { return o.to(d) });
};
/** Code for data manipulation **/
// Convert a dictionary of {direction: total} to frequencies
// Output is an array of objects with three parameters:
// d: wind direction
// p: probability of the wind being in this direction
// s: average speed of the wind in this direction
function totalsToFrequencies(totals, speeds) {
var sum = 0;
// Sum all the values in the dictionary
for (var dir in totals) {
sum += totals[dir];
}
if (sum == 0) { // total hack to work around the case where no months are selected
sum = 1;
}
// Build up an object containing frequencies
var ret = {};
ret.dirs = []
ret.sum = sum;
for (var dir in totals) {
var freq = totals[dir] / sum;
var avgspeed;
if (totals[dir] > 0) {
avgspeed = speeds[dir] / totals[dir];
} else {
avgspeed = 0;
}
if (dir == "null") { // winds calm is a special case
ret.calm = { d: null, p: freq, s: null };
} else {
ret.dirs.push({ d: parseInt(dir), p: freq, s: avgspeed });
}
}
return ret;
}
// Filter input data, giving back frequencies for the selected month
function rollupForMonths(d, months) {
var totals = {}, speeds = {};
for (var i = 10; i < 361; i += 10) { totals[""+i] = 0; speeds[""+i] = 0 }
totals["null"] = 0; speeds["null"] = 0;
for (var key in d.data) {
var s = key.split(":")
if (s.length == 1) {
var direction = s[0];
} else {
var month = s[0];
var direction = s[1];
}
if (months && !months[month-1]) { continue; }
// count up all samples with this key
totals[direction] += d.data[key][0];
// add in the average speed * count from this key
speeds[direction] += d.data[key][0] * d.data[key][1];
}
return totalsToFrequencies(totals, speeds);
}
/** Code for big visualization **/
// Transformation to place a mark on top of an arc
function probArcTextT(d) {
var tr = probabilityToRadius(d);
return "translate(" + visWidth + "," + (visWidth-tr) + ")" +
"rotate(" + d.d + ",0," + tr + ")"; };
function speedArcTextT(d) {
var tr = speedToRadius(d);
return "translate(" + visWidth + "," + (visWidth-tr) + ")" +
"rotate(" + d.d + ",0," + tr + ")"; };
// Return a string representing the wind speed for this datum
function speedText(d) { return d.s < 10 ? "" : d.s.toFixed(0); };
// Return a string representing the probability of wind coming from this direction
function probabilityText(d) { return d.p < 0.02 ? "" : (100*d.p).toFixed(0); };
// Map a wind speed to a color
var speedToColorScale = d3.scale.linear()
.domain([8, 16])
.range(["hsl(220, 70%, 90%)", "hsl(220, 70%, 30%)"])
.interpolate(d3.interpolateHsl);
function speedToColor(d) { return speedToColorScale(d.s); }
// Map a wind probability to a color
var probabilityToColorScale = d3.scale.linear()
.domain([0, 0.09])
.range(["hsl(0, 70%, 99%)", "hsl(0, 70%, 40%)"])
.interpolate(d3.interpolateHsl);
function probabilityToColor(d) { return probabilityToColorScale(d.p); }
// Width of the whole visualization; used for centering
var visWidth = 200;
// Map a wind probability to an outer radius for the chart
var probabilityToRadiusScale = d3.scale.linear().domain([0, 0.15]).range([34, visWidth-20]).clamp(true);
function probabilityToRadius(d) { return probabilityToRadiusScale(d.p); }
// Map a wind speed to an outer radius for the chart
var speedToRadiusScale = d3.scale.linear().domain([0, 20]).range([34, visWidth-20]).clamp(true);
function speedToRadius(d) { return speedToRadiusScale(d.s); }
// Options for drawing the complex arc chart
var windroseArcOptions = {
width: 5,
from: 34,
to: probabilityToRadius
}
var windspeedArcOptions = {
width: 5,
from: 34,
to: speedToRadius
}
// Draw a complete wind rose visualization, including axes and center text
function drawComplexArcs(parent, plotData, colorFunc, arcTextFunc, complexArcOptions, arcTextT) {
// Draw the main wind rose arcs
parent.append("svg:g")
.attr("class", "arcs")
.selectAll("path")
.data(plotData.dirs)
.enter().append("svg:path")
.attr("d", arc(complexArcOptions))
.style("fill", colorFunc)
.attr("transform", "translate(" + visWidth + "," + visWidth + ")")
.append("svg:title")
.text(function(d) { return d.d + "\u00b0 " + (10*d.p).toFixed(1) + "% " + d.s.toFixed(0) + "km/h" });
// Annotate the arcs with speed in text
if (false) { // disabled: just looks like chart junk
parent.append("svg:g")
.attr("class", "arctext")
.selectAll("text")
.data(plotData.dirs)
.enter().append("svg:text")
.text(arcTextFunc)
.attr("dy", "-3px")
.attr("transform", arcTextT);
}
// Add the calm wind probability in the center
var cw = parent.append("svg:g").attr("class", "calmwind")
.selectAll("text")
.data([plotData.calm.p])
.enter();
cw.append("svg:text")
.attr("transform", "translate(" + visWidth + "," + visWidth + ")")
.text(function(d) { return Math.round(d * 100) + "%" });
cw.append("svg:text")
.attr("transform", "translate(" + visWidth + "," + (visWidth+14) + ")")
.attr("class", "calmcaption")
.text("calm");
}
// Update the page text after the data has been loaded
// Lots of template substitution here
function updatePageText(d) {
if (!('info' in d)) {
// workaround for stations missing in the master list
d3.selectAll(".stationid").text("????")
d3.selectAll(".stationname").text("Unknown station");
return;
}
}
// Update all diagrams to the newly selected months
function updateWindVisDiagrams(d) {
updateBigWindrose(d, "#windrose");
updateBigWindrose(d, "#windspeed");
}
// Update a specific digram to the newly selected months
function updateBigWindrose(windroseData, container) {
var vis = d3.select(container).select("svg");
var rollup = rollupForMonths(windroseData, selectedMonthControl.selected());
if (container == "#windrose") {
updateComplexArcs(vis, rollup, speedToColor, speedText, windroseArcOptions, probArcTextT);
} else {
updateComplexArcs(vis, rollup, probabilityToColor, probabilityText, windspeedArcOptions, speedArcTextT);
}
}
// Update drawn arcs, etc to the newly selected months
function updateComplexArcs(parent, plotData, colorFunc, arcTextFunc, complexArcOptions, arcTextT) {
// Update the arcs' shape and color
parent.select("g.arcs").selectAll("path")
.data(plotData.dirs)
.transition().duration(200)
.style("fill", colorFunc)
.attr("d", arc(complexArcOptions));
// Update the arcs' title tooltip
parent.select("g.arcs").selectAll("path").select("title")
.text(function(d) { return d.d + "\u00b0 " + (100*d.p).toFixed(1) + "% " + d.s.toFixed(0) + "km/h" });
// Update the calm wind probability in the center
parent.select("g.calmwind").select("text")
.data([plotData.calm.p])
.text(function(d) { return Math.round(d * 100) + "%" });
}
// Top level function to draw all station diagrams
function makeWindVis(station) {
var url = "data/" + station + ".json";
var stationData = null;
d3.json(url, function(d) {
stationData = d;
updatePageText(d);
drawBigWindrose(d, "#windrose", "Frequency by Direction");
drawBigWindrose(d, "#windspeed", "Average Speed by Direction");
selectedMonthControl.setCallback(function() { updateWindVisDiagrams(d); });
});
selectedMonthControl = new monthControl(null);
selectedMonthControl.install("#monthControlDiv");
}
// Draw a big wind rose, for the visualization
function drawBigWindrose(windroseData, container, captionText) {
// Various visualization size parameters
var w = 400,
h = 400,
r = Math.min(w, h) / 2, // center; probably broken if not square
p = 20, // padding on outside of major elements
ip = 34; // padding on inner circle
// The main SVG visualization element
var vis = d3.select(container)
.append("svg:svg")
.attr("width", w + "px").attr("height", (h + 30) + "px");
// Set up axes: circles whose radius represents probability or speed
if (container == "#windrose") {
var ticks = d3.range(0.025, 0.151, 0.025);
var tickmarks = d3.range(0.05,0.101,0.05);
var radiusFunction = probabilityToRadiusScale;
var tickLabel = function(d) { return "" + (d*100).toFixed(0) + "%"; }
} else {
var ticks = d3.range(5, 20.1, 5);
var tickmarks = d3.range(5, 15.1, 5);
var radiusFunction = speedToRadiusScale;
var tickLabel = function(d) { return "" + d + "km/h"; }
}
// Circles representing chart ticks
vis.append("svg:g")
.attr("class", "axes")
.selectAll("circle")
.data(ticks)
.enter().append("svg:circle")
.attr("cx", r).attr("cy", r)
.attr("r", radiusFunction);
// Text representing chart tickmarks
vis.append("svg:g").attr("class", "tickmarks")
.selectAll("text")
.data(tickmarks)
.enter().append("svg:text")
.text(tickLabel)
.attr("dy", "-2px")
.attr("transform", function(d) {
var y = visWidth - radiusFunction(d);
return "translate(" + r + "," + y + ") " })
// Labels: degree markers
vis.append("svg:g")
.attr("class", "labels")
.selectAll("text")
.data(d3.range(30, 361, 30))
.enter().append("svg:text")
.attr("dy", "-4px")
.attr("transform", function(d) {
return "translate(" + r + "," + p + ") rotate(" + d + ",0," + (r-p) + ")"})
.text(function(dir) { return dir; });
//var rollup = rollupForMonths(windroseData, selectedMonthControl.selected());
var rollup = rollupForMonths(windroseData, months);
if (container == "#windrose") {
drawComplexArcs(vis, rollup, speedToColor, speedText, windroseArcOptions, probArcTextT);
} else {
drawComplexArcs(vis, rollup, probabilityToColor, probabilityText, windspeedArcOptions, speedArcTextT);
}
vis.append("svg:text")
.text(captionText)
.attr("class", "caption")
.attr("transform", "translate(" + w/2 + "," + (h + 20) + ")");
}
/** Code for small wind roses **/
// Plot a small wind rose with the specified percentage data
// parent: the SVG element to put the plot on
// plotData: a list of 12 months, each a list of 13 numbers. plotData[month][0] is winds calm percentage,
// plotData[month][1, 2, 3...] is percentage of winds at 30 degrees, 60, 90, ...
var smallArcScale = d3.scale.linear().domain([0, 0.15]).range([5, 30]).clamp(true)
var smallArcOptions = {
width: 15,
from: 5,
to: function(d) { return smallArcScale(d.p); }
}
function plotSmallRose(parent, plotData) {
var winds = [];
//var months = selectedMonthControl.selected();
// For every wind direction (note: skip plotData[0], winds calm)
for (var dir = 1; dir < 13; dir++) {
// Calculate average probability for all selected months
var n = 0; sum = 0;
for (var month = 0; month < 12; month++) {
if (months[month]) {
n += 1;
sum += plotData[month][dir];
}
}
var avg = sum/n;
winds.push({d: dir * 30, p: avg / 10});
}
parent.append("svg:g")
.selectAll("path")
.data(winds)
.enter().append("svg:path")
.attr("d", arc(smallArcOptions));
parent.append("svg:circle")
.attr("r", smallArcOptions.from);
}
drawBigWindrose(data, "#windrose", "Paris, 2000-2014, Wind Direction")
drawBigWindrose(data, "#avg", "Paris, 2000-2014, Wind Speed")
//need to reformat the data to get smallPlot to work, not sure how yet
//var rollup = rollupForMonths(data, months);
//var small = svg.append("g")
//.attr("id", "small");
//plotSmallRose(small, rollup)
//Style the plots, this doesn't capture everything from windhistory.com
svg.selectAll("text").style( { font: "14px sans-serif", "text-anchor": "middle" });
svg.selectAll(".arcs").style( { stroke: "#000000", "stroke-width": "0.5px", "fill-opacity": 0.9 })
svg.selectAll(".caption").style( { font: "18px sans-serif" });
svg.selectAll(".axes").style( { stroke: "#aaa", "stroke-width": "0.5px", fill: "none" })
svg.selectAll("text.labels").style( { "letter-spacing": "1px", fill: "#444", "font-size": "12px" })
svg.selectAll("text.arctext").style( { "font-size": "9px" })
{
"info": {
"lat": 48.43,
"lon": 2.23,
"name": "PARIS",
"id": "LFPO"
},
"data":{
"1:260": [ 15,12.533 ],
"1:210": [ 35,15.286 ],
"1:200": [ 27, 13.63 ],
"1:230": [ 34, 17 ],
"1:220": [ 33,17.152 ],
"1:360": [ 10, 14.2 ],
"1:60": [ 16,12.312 ],
"1:40": [ 15, 14.4 ],
"1:50": [ 11,13.182 ],
"1:30": [ 15,16.067 ],
"1:350": [ 5, 14.4 ],
"1:320": [ 6, 12.5 ],
"1:310": [ 4, 18.5 ],
"1:70": [ 6, 13 ],
"1:100": [ 12,7.0833 ],
"1:170": [ 11,9.0909 ],
"1:250": [ 16,15.375 ],
"1:240": [ 31,17.806 ],
"2:220": [ 32,15.469 ],
"2:270": [ 14,20.071 ],
"2:260": [ 15, 15.8 ],
"2:210": [ 32,14.688 ],
"2:180": [ 16, 10.75 ],
"2:240": [ 28,17.179 ],
"2:280": [ 8,14.875 ],
"2:230": [ 29,16.724 ],
"2:300": [ 9,9.6667 ],
"2:250": [ 17,15.647 ],
"2:200": [ 11,11.091 ],
"2:290": [ 8,11.875 ],
"2:320": [ 9,16.222 ],
"2:350": [ 3,12.667 ],
"5:40": [ 21,13.429 ],
"5:50": [ 27,12.889 ],
"5:190": [ 7,9.2857 ],
"5:130": [ 5, 5 ],
"5:160": [ 8, 8.25 ],
"5:110": [ 10, 8.7 ],
"5:140": [ 6,8.3333 ],
"5:210": [ 22,11.955 ],
"5:80": [ 7,10.571 ],
"5:170": [ 4, 8.25 ],
"5:270": [ 17,13.882 ],
"5:240": [ 20, 13.05 ],
"5:260": [ 17,12.824 ],
"5:230": [ 28,14.107 ],
"5:180": [ 8, 10.75 ],
"5:250": [ 19,16.053 ],
"5:220": [ 21,16.667 ],
"5:10": [ 9,11.444 ],
"6:180": [ 9,8.3333 ],
"6:350": [ 12, 12.75 ],
"6:330": [ 13,11.231 ],
"6:290": [ 13,11.692 ],
"6:340": [ 16, 11 ],
"6:320": [ 11,12.364 ],
"6:70": [ 10, 10 ],
"6:110": [ 6, 9 ],
"6:120": [ 5, 9 ],
"6:200": [ 9,10.778 ],
"6:240": [ 25, 13.84 ],
"6:250": [ 19,11.737 ],
"6:270": [ 16, 10.5 ],
"6:300": [ 13,11.692 ],
"6:60": [ 10, 11.3 ],
"6:80": [ 7,10.857 ],
"6:50": [ 19,13.526 ],
"7:270": [ 27,12.963 ],
"7:240": [ 34,13.235 ],
"7:190": [ 8, 8.875 ],
"7:260": [ 24,13.958 ],
"7:250": [ 27,12.444 ],
"7:110": [ 1, 8 ],
"7:30": [ 20, 12.75 ],
"7:320": [ 15,10.733 ],
"7:310": [ 22,11.273 ],
"7:300": [ 16,10.812 ],
"7:330": [ 11,13.091 ],
"7:350": [ 11,11.091 ],
"7:40": [ 18,11.889 ],
"7:50": [ 18,10.833 ],
"7:60": [ 8,11.625 ],
"7:20": [ 18,11.389 ],
"7:230": [ 26,12.846 ],
"7:280": [ 23,12.348 ],
"7:290": [ 12,10.167 ],
"7:100": [ 3,11.333 ],
"8:200": [ 13,9.5385 ],
"8:300": [ 15,11.667 ],
"8:260": [ 22,10.909 ],
"8:310": [ 22,10.818 ],
"8:20": [ 7,13.571 ],
"8:350": [ 18,10.167 ],
"8:330": [ 13,10.231 ],
"8:320": [ 20, 10.65 ],
"8:190": [ 8, 8 ],
"8:50": [ 13,11.538 ],
"8:270": [ 18,10.556 ],
"9:250": [ 17,9.7059 ],
"9:280": [ 20, 13.3 ],
"9:340": [ 9,11.556 ],
"9:350": [ 14,9.7857 ],
"9:230": [ 23, 11 ],
"9:300": [ 14,11.429 ],
"9:100": [ 11,7.5455 ],
"9:70": [ 10, 9.5 ],
"9:260": [ 19,10.632 ],
"9:320": [ 10, 10.5 ],
"9:190": [ 10, 9.5 ],
"9:170": [ 10, 7.9 ],
"9:220": [ 14,10.857 ],
"9:210": [ 17,10.294 ],
"9:120": [ 5, 7 ],
"9:240": [ 22,12.227 ],
"9:200": [ 19,8.0526 ],
"9:180": [ 15, 7.8 ],
"10:180": [ 26,8.7692 ],
"10:270": [ 13,11.769 ],
"10:210": [ 26,15.077 ],
"10:280": [ 14,10.643 ],
"10:320": [ 6, 11 ],
"10:250": [ 16,14.688 ],
"10:240": [ 27,11.667 ],
"10:220": [ 36,12.917 ],
"10:200": [ 39, 12.41 ],
"10:230": [ 22,16.364 ],
"10:10": [ 9,13.778 ],
"10:20": [ 13,11.385 ],
"10:190": [ 24, 11 ],
"10:260": [ 15,13.533 ],
"10:140": [ 17,6.7647 ],
"10:170": [ 14,7.6429 ],
"11:230": [ 24,16.208 ],
"11:210": [ 37,14.135 ],
"11:170": [ 12,9.5833 ],
"11:190": [ 34,11.059 ],
"11:220": [ 32, 16.5 ],
"11:200": [ 32,11.969 ],
"11:260": [ 17,14.471 ],
"11:240": [ 29,13.931 ],
"11:180": [ 11,9.8182 ],
"12:190": [ 18,11.111 ],
"12:170": [ 6,11.667 ],
"12:220": [ 28,18.964 ],
"12:200": [ 32,14.156 ],
"12:180": [ 10, 10.3 ],
"12:150": [ 5, 6.8 ],
"12:230": [ 38,16.289 ],
"12:240": [ 35, 15.4 ],
"12:270": [ 19,12.842 ],
"12:250": [ 23,14.609 ],
"12:110": [ 12,6.8333 ],
"12:100": [ 6,6.8333 ],
"12:130": [ 1, 6 ],
"12:120": [ 7,6.1429 ],
"12:50": [ 19,14.316 ],
"12:360": [ 9,12.222 ],
"12:310": [ 3, 14 ],
"1:190": [ 15,13.067 ],
"1:180": [ 12,10.333 ],
"1:90": [ 10, 12.6 ],
"1:110": [ 4, 6.75 ],
"1:80": [ 7,7.8571 ],
"1:120": [ 4, 8.5 ],
"2:60": [ 16,12.312 ],
"2:50": [ 16,14.812 ],
"2:190": [ 9,13.667 ],
"2:30": [ 13,17.231 ],
"2:20": [ 16,14.125 ],
"2:40": [ 24,17.042 ],
"2:360": [ 7,10.571 ],
"2:310": [ 12,14.583 ],
"2:10": [ 6,12.667 ],
"3:260": [ 11,17.818 ],
"3:70": [ 12,12.583 ],
"3:60": [ 14, 15 ],
"3:250": [ 23,16.478 ],
"3:110": [ 4, 8.5 ],
"3:120": [ 5, 7.6 ],
"3:210": [ 25, 13.8 ],
"3:220": [ 27,13.556 ],
"3:230": [ 24,12.125 ],
"3:240": [ 25, 17.72 ],
"3:130": [ 4, 8.5 ],
"3:30": [ 14,16.071 ],
"3:330": [ 8,15.125 ],
"3:170": [ 2, 9 ],
"3:300": [ 13,12.538 ],
"4:170": [ 6,7.8333 ],
"4:180": [ 8, 12.25 ],
"4:240": [ 18,14.333 ],
"4:250": [ 12,14.917 ],
"4:230": [ 20, 14.35 ],
"4:330": [ 12,12.833 ],
"4:300": [ 16, 9.75 ],
"4:350": [ 7,12.571 ],
"4:20": [ 21,16.857 ],
"4:40": [ 24,14.875 ],
"4:10": [ 12,16.083 ],
"4:290": [ 14,11.643 ],
"4:360": [ 20, 13.45 ],
"4:310": [ 9,12.222 ],
"4:200": [ 16,11.125 ],
"4:60": [ 12,9.0833 ],
"4:210": [ 18,14.722 ],
"5:20": [ 19,12.737 ],
"5:30": [ 14,18.286 ],
"5:70": [ 11,12.909 ],
"5:100": [ 6,7.1667 ],
"5:60": [ 13,9.9231 ],
"5:200": [ 13,10.231 ],
"5:290": [ 13,13.154 ],
"5:340": [ 13,12.154 ],
"6:10": [ 21,13.429 ],
"6:210": [ 16,11.438 ],
"6:280": [ 20, 11.8 ],
"6:260": [ 13,13.231 ],
"6:160": [ 3, 8 ],
"6:190": [ 9,8.1111 ],
"6:220": [ 14,11.571 ],
"6:230": [ 20, 12.3 ],
"6:140": [ 3,6.3333 ],
"6:100": [ 8, 7.875 ],
"6:130": [ 3, 8 ],
"7:90": [ 6, 9.5 ],
"7:150": [ 3, 9 ],
"7:180": [ 6,9.8333 ],
"7:220": [ 26,12.346 ],
"7:170": [ 3,8.3333 ],
"7:360": [ 10, 12.8 ],
"7:10": [ 12, 13.25 ],
"8:40": [ 11,11.455 ],
"8:240": [ 24, 13.75 ],
"8:250": [ 27,10.926 ],
"8:220": [ 24,11.417 ],
"8:210": [ 17,12.412 ],
"8:230": [ 28,11.036 ],
"8:290": [ 15,12.867 ],
"8:140": [ 4, 7 ],
"8:180": [ 6,6.8333 ],
"8:160": [ 6,6.8333 ],
"8:130": [ 3, 5 ],
"8:100": [ 3,5.3333 ],
"8:360": [ 10, 9.3 ],
"8:150": [ 5, 5.8 ],
"8:10": [ 11,11.182 ],
"8:60": [ 12,10.167 ],
"9:310": [ 18,8.7778 ],
"9:290": [ 16, 10.5 ],
"9:270": [ 16,12.625 ],
"9:330": [ 5, 10.2 ],
"9:40": [ 21, 12.81 ],
"9:20": [ 16,12.812 ],
"9:130": [ 2, 8 ],
"10:130": [ 3,6.3333 ],
"10:120": [ 8, 7.375 ],
"10:160": [ 15,6.0667 ],
"10:100": [ 8, 8.375 ],
"10:110": [ 11,7.9091 ],
"10:350": [ 7,10.286 ],
"11:340": [ 6,11.167 ],
"11:30": [ 12,9.9167 ],
"11:360": [ 8,11.875 ],
"11:290": [ 9,13.111 ],
"11:40": [ 15, 10.6 ],
"11:10": [ 9,13.111 ],
"11:50": [ 6,13.833 ],
"11:60": [ 7,9.8571 ],
"11:250": [ 15,14.467 ],
"11:320": [ 6,10.167 ],
"11:350": [ 8,10.375 ],
"11:270": [ 11, 11 ],
"12:40": [ 19,14.105 ],
"12:20": [ 15, 14.8 ],
"12:60": [ 13,16.538 ],
"12:70": [ 8, 10.5 ],
"12:300": [ 8, 14 ],
"12:260": [ 25, 15.16 ],
"12:330": [ 4, 14.5 ],
"12:30": [ 17,13.412 ],
"1:130": [ 7,7.2857 ],
"1:140": [ 3,7.3333 ],
"1:160": [ 5, 7 ],
"1:300": [ 10, 11.6 ],
"2:340": [ 7,17.286 ],
"3:140": [ 4, 8 ],
"3:40": [ 26,13.462 ],
"3:100": [ 11,7.8182 ],
"3:10": [ 8, 9.875 ],
"3:270": [ 17,16.588 ],
"3:280": [ 6,16.167 ],
"3:80": [ 12,11.833 ],
"3:180": [ 4, 10.5 ],
"3:150": [ 6,6.1667 ],
"3:190": [ 12,10.333 ],
"3:310": [ 6, 12.5 ],
"3:50": [ 23,14.348 ],
"3:90": [ 5, 15.4 ],
"4:150": [ 3,8.6667 ],
"4:30": [ 23,14.391 ],
"4:90": [ 5, 14.8 ],
"4:80": [ 7,12.571 ],
"4:50": [ 17,14.294 ],
"4:320": [ 8, 10.5 ],
"4:280": [ 7,11.286 ],
"4:220": [ 18,10.444 ],
"4:260": [ 9,15.667 ],
"5:280": [ 16,12.375 ],
"5:360": [ 15, 11.6 ],
"5:350": [ 12,12.833 ],
"5:120": [ 2, 9 ],
"5:150": [ 5, 9 ],
"6:360": [ 9,11.778 ],
"6:170": [ 5, 7.4 ],
"6:40": [ 21,11.524 ],
"7:210": [ 19,10.632 ],
"7:200": [ 10, 10 ],
"7:340": [ 6, 10 ],
"7:80": [ 6,7.3333 ],
"7:70": [ 7,11.143 ],
"8:280": [ 27,12.185 ],
"8:70": [ 7,9.2857 ],
"8:110": [ 3,6.6667 ],
"8:30": [ 6,10.667 ],
"8:340": [ 13,11.308 ],
"9:160": [ 2, 9 ],
"9:50": [ 24,12.792 ],
"9:60": [ 17,12.765 ],
"9:360": [ 6, 11 ],
"9:30": [ 14,12.357 ],
"10:310": [ 7,10.429 ],
"10:340": [ 4, 10.25 ],
"10:40": [ 9,11.778 ],
"10:70": [ 10, 12.3 ],
"11:310": [ 12,11.583 ],
"11:300": [ 6,12.667 ],
"11:130": [ 9,5.5556 ],
"11:120": [ 9,8.1111 ],
"11:150": [ 6,8.3333 ],
"11:160": [ 11,8.2727 ],
"12:210": [ 29,14.034 ],
"12:80": [ 5, 13.2 ],
"12:90": [ 5, 11.8 ],
"12:280": [ 12, 14 ],
"1:10": [ 6,12.833 ],
"1:20": [ 8, 15.25 ],
"1:290": [ 8,12.375 ],
"1:330": [ 2, 13 ],
"2:170": [ 5, 8.2 ],
"2:110": [ 5, 7.6 ],
"2:100": [ 8, 7.125 ],
"2:90": [ 9, 9 ],
"2:70": [ 3, 9 ],
"2:80": [ 6, 11 ],
"2:120": [ 5, 8 ],
"2:130": [ 3,8.6667 ],
"3:200": [ 15, 10 ],
"3:350": [ 8, 10.75 ],
"3:360": [ 7,12.429 ],
"3:20": [ 20, 12.45 ],
"4:270": [ 14,12.214 ],
"4:70": [ 12,13.833 ],
"4:340": [ 7,10.286 ],
"4:130": [ 4, 9 ],
"4:190": [ 14,10.571 ],
"4:110": [ 8, 6.125 ],
"4:120": [ 7,7.7143 ],
"5:300": [ 16, 13.75 ],
"6:20": [ 18,14.944 ],
"6:30": [ 22,13.773 ],
"6:310": [ 16, 11 ],
"6:90": [ 4, 12.5 ],
"9:10": [ 10, 9.8 ],
"9:80": [ 8, 11.75 ],
"9:150": [ 6,5.6667 ],
"9:90": [ 4, 7 ],
"10:330": [ 4, 12.5 ],
"10:290": [ 8,11.625 ],
"10:80": [ 9, 11 ],
"10:60": [ 9,11.333 ],
"10:30": [ 7,12.571 ],
"11:70": [ 5, 7.6 ],
"11:90": [ 8, 7.875 ],
"11:100": [ 7,6.1429 ],
"12:290": [ 8,14.375 ],
"12:320": [ 6,12.167 ],
"2:330": [ 4, 12.5 ],
"3:290": [ 9,14.111 ],
"3:160": [ 8, 7.875 ],
"3:320": [ 8, 15.25 ],
"4:160": [ 5, 7.6 ],
"4:140": [ 4, 8.25 ],
"5:310": [ 9,9.3333 ],
"7:120": [ 2, 12 ],
"7:160": [ 6,6.8333 ],
"9:110": [ 6, 7.5 ],
"11:20": [ 11,14.364 ],
"12:160": [ 7,7.8571 ],
"12:140": [ 1, 6 ],
"1:280": [ 11,13.091 ],
"1:150": [ 5, 5.6 ],
"1:270": [ 12,16.667 ],
"3:340": [ 8, 13.75 ],
"5:330": [ 13,11.769 ],
"8:80": [ 6,7.8333 ],
"10:50": [ 10, 11.7 ],
"11:280": [ 7,12.429 ],
"11:110": [ 5, 11 ],
"12:350": [ 4, 10.75 ],
"12:340": [ 3,14.667 ],
"1:340": [ 3,6.6667 ],
"2:150": [ 7,8.8571 ],
"4:100": [ 3,11.333 ],
"5:320": [ 11,10.455 ],
"8:170": [ 5, 8.6 ],
"10:90": [ 5, 6.2 ],
"10:150": [ 5, 5.6 ],
"11:140": [ 5, 6.6 ],
"2:160": [ 3,8.6667 ],
"10:360": [ 7, 12 ],
"11:330": [ 6,10.167 ],
"12:10": [ 5, 14.6 ],
"5:90": [ 5, 9.8 ],
"6:150": [ 2, 6 ],
"7:130": [ 1, 8 ],
"8:120": [ 2, 6.5 ],
"10:300": [ 2, 12.5 ],
"11:80": [ 3,9.3333 ],
"2:140": [ 2, 8 ],
"8:90": [ 2, 6.5 ]
},
"samples": 2183
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment