|
2 | 2 | <head> |
3 | 3 | <title>Calendar</title> |
4 | 4 | <script type="text/javascript" src="../../d3.js"></script> |
| 5 | + <script type="text/javascript" src="csv.js"></script> |
| 6 | + <script type="text/javascript" src="nest.js"></script> |
5 | 7 | <style type="text/css"> |
6 | 8 |
|
7 | 9 | body { |
|
25 | 27 | <body> |
26 | 28 | <script type="text/javascript"> |
27 | 29 |
|
28 | | -var color = d3.interpolateRgb("#Feffc3", "#D80223"); |
| 30 | +var c0 = d3.interpolateRgb("#Feffc3", "#D80223"), |
| 31 | + c1 = d3.interpolateRgb("#Feffc3", "#B5E28B"); |
| 32 | + |
| 33 | +function color(d) { |
| 34 | + if (isNaN(d)) return "none"; |
| 35 | + d *= 40; // TODO quantile scale |
| 36 | + return d > 0 ? c1(d) : c0(-d); |
| 37 | +} |
| 38 | + |
| 39 | +var dow = nest(csv("dow.csv")) |
| 40 | + .key(function(d) { return d.Date; }) |
| 41 | + .rollup(function(d) { return (d[0].Close - d[0].Open) / d[0].Open; }); |
29 | 42 |
|
30 | 43 | var w = 960, |
31 | 44 | h = 150, |
32 | | - p = 10, |
| 45 | + p = 14, |
33 | 46 | z = ~~Math.min((h - p * 2) / 7, (w - p * 2) / 53); |
34 | 47 |
|
35 | 48 | var vis = d3.select("body") |
36 | 49 | .selectAll("svg") |
37 | | - .data(range(1987, 2000)) |
| 50 | + .data(range(1990, 2011)) |
38 | 51 | .enter.append("svg:svg") |
39 | 52 | .attr("width", w) |
40 | 53 | .attr("height", h) |
41 | 54 | .append("svg:g") |
42 | 55 | .attr("transform", "translate(" + p + "," + p + ")"); |
43 | 56 |
|
| 57 | +vis.append("svg:text") |
| 58 | + .attr("transform", "translate(-6," + h/2 + ")rotate(-90)") |
| 59 | + .text(function(d) { return d; }); |
| 60 | + |
44 | 61 | vis.selectAll("rect.day") |
45 | 62 | .data(dates) |
46 | 63 | .enter.append("svg:rect") |
47 | 64 | .attr("x", function(d) { return d.week * z; }) |
48 | 65 | .attr("y", function(d) { return d.day * z; }) |
49 | 66 | .attr("class", function(d) { return "day q" + d.month; }) |
50 | | - .attr("fill", function(d) { return color(Math.random()); }) |
| 67 | + .attr("fill", function(d) { return color(dow[d.Date]); }) |
51 | 68 | .attr("width", z) |
52 | | - .attr("height", z); |
| 69 | + .attr("height", z) |
| 70 | + .append("svg:title") |
| 71 | + .text(function(d) { return d.Date + ": " + (dow[d.Date] * 100).toFixed(1) + "%"; }); |
53 | 72 |
|
54 | 73 | vis.selectAll("path.month") |
55 | 74 | .data(months) |
|
82 | 101 | return range; |
83 | 102 | } |
84 | 103 |
|
| 104 | +function pad(n) { |
| 105 | + return n < 10 ? "0" + n : n; |
| 106 | +} |
| 107 | + |
| 108 | +function format(d) { |
| 109 | + var month = d.getMonth() + 1, |
| 110 | + date = d.getDate(); |
| 111 | + return d.getFullYear() + "-" + pad(month) + "-" + pad(date); |
| 112 | +} |
| 113 | + |
85 | 114 | function dates(year) { |
86 | 115 | var dates = [], |
87 | 116 | date = new Date(year, 0, 1), |
|
91 | 120 | dates.push({ |
92 | 121 | day: day = date.getDay(), |
93 | 122 | week: week, |
94 | | - month: date.getMonth() |
| 123 | + month: date.getMonth(), |
| 124 | + Date: format(date) |
95 | 125 | }); |
96 | 126 | date.setDate(date.getDate() + 1); |
97 | 127 | if (day == 6) week++; |
|
0 commit comments