[ Launch: WindRose D3 ] c9b544741577d4117137 by miguelvb
-
-
Save miguelvb/c9b544741577d4117137 to your computer and use it in GitHub Desktop.
WindRose D3
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{"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"} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
//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" }) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
"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