// Generated by CoffeeScript 1.10.0 (function() { var INNER_RADIUS, OUTER_RADIUS, arc_generator, height, prec_radius, r_temp, refs, refs_data, refs_labels_north, refs_labels_south, svg, temp_color, width; svg = d3.select('svg'); width = svg.node().getBoundingClientRect().width; height = svg.node().getBoundingClientRect().height; svg.attr({ viewBox: (-width / 2) + " " + (-height / 2) + " " + width + " " + height }); OUTER_RADIUS = 200; INNER_RADIUS = 60; r_temp = d3.scale.linear().domain([-20, 40]).range([INNER_RADIUS, OUTER_RADIUS]); prec_radius = d3.scale.sqrt().domain([0, 100]).range([0, 32]); temp_color = d3.scale.linear().domain([-20, 0, 20, 40]).range([d3.hcl(290, 70, 15), d3.hcl(230, 70, 45), d3.hcl(80, 70, 75), d3.hcl(10, 70, 45)]).interpolate(d3.interpolateHcl); arc_generator = d3_shape.arc(); refs_data = d3.range(-20, 40, 10); refs = svg.selectAll('.ref').data(refs_data); refs.enter().append('circle').attr({ "class": 'ref', r: function(d) { return r_temp(d); }, stroke: function(d) { if (d === 0) { return '#CCC'; } else { return '#EEE'; } } }); refs_labels_north = svg.selectAll('.ref_label_north').data(refs_data); refs_labels_north.enter().append('text').text(function(d) { return d + "°C"; }).attr({ "class": 'ref_label_north', y: function(d) { return -r_temp(d); }, dy: '0.35em', fill: function(d) { if (d === 0) { return '#BBB'; } else { return '#DDD'; } } }); refs_labels_south = svg.selectAll('.ref_label_south').data(refs_data); refs_labels_south.enter().append('text').text(function(d) { return d + "°C"; }).attr({ "class": 'ref_label_south', y: function(d) { return r_temp(d); }, dy: '0.35em', fill: function(d) { if (d === 0) { return '#BBB'; } else { return '#DDD'; } } }); svg.append('circle').attr({ "class": 'prec_ref', r: OUTER_RADIUS }); svg.append('text').text('PISA').attr({ "class": 'title', dy: '0.35em' }); d3.csv('pisa_2014_weather.csv', function(days) { var angle, enter_prec_bubbles, enter_temp_bars, prec_bubbles, temp_bars; days.forEach(function(d) { d['Min TemperatureC'] = +d['Min TemperatureC']; d['Max TemperatureC'] = +d['Max TemperatureC']; d['Mean TemperatureC'] = +d['Mean TemperatureC']; return d['Precipitationmm'] = +d['Precipitationmm']; }); angle = d3.scale.ordinal().domain(days.map(function(d) { return d['CET']; })).range(d3.range(Math.PI / 2, 2 * Math.PI + Math.PI / 2, 2 * Math.PI / days.length)); temp_bars = svg.selectAll('.temp_bar').data(days); enter_temp_bars = temp_bars.enter().append('path').attr({ "class": 'bar temp_bar', d: function(d, i) { return arc_generator({ innerRadius: r_temp(d['Min TemperatureC']), outerRadius: r_temp(d['Max TemperatureC']), startAngle: i * 2 * Math.PI / days.length, endAngle: (i + 1) * 2 * Math.PI / days.length }); }, fill: function(d) { return temp_color(d['Mean TemperatureC']); } }); enter_temp_bars.append('title').text(function(d) { return (d3.time.format('%Y, %B %e')(new Date(d['CET']))) + "\nTemperature:\n Min: " + d['Min TemperatureC'] + " °C\n Max: " + d['Max TemperatureC'] + " °C\n Mean: " + d['Mean TemperatureC'] + " °C"; }); prec_bubbles = svg.selectAll('.prec_bubble').data(days.sort(function(a, b) { return d3.descending(a['Precipitationmm'], b['Precipitationmm']); })); enter_prec_bubbles = prec_bubbles.enter().append('circle').attr({ "class": 'prec_bubble', r: function(d) { return prec_radius(d['Precipitationmm']); }, cx: function(d) { return -OUTER_RADIUS * Math.cos(angle(d['CET'])); }, cy: function(d) { return -OUTER_RADIUS * Math.sin(angle(d['CET'])); } }); enter_prec_bubbles.append('title').text(function(d) { return (d3.time.format('%Y, %B %e')(new Date(d['CET']))) + "\nPrecipitation: " + d['Precipitationmm'] + " mm"; }); svg.append('line').attr({ "class": 'hand', x1: 0, x2: 0, y1: -INNER_RADIUS + 10, y2: -OUTER_RADIUS - 40 }); return svg.append('text').text('2014').attr({ "class": 'hand_label', x: 4, y: -OUTER_RADIUS - 40, dy: '0.6em' }); }); }).call(this);