|
6 | 6 | <title>WordStream</title> |
7 | 7 | <script src="./lib/d3.min.js"></script> |
8 | 8 | <script src="./lib/d3.layout.wordstream.js"></script> |
| 9 | + <script src="./test/testutil.js"></script> |
9 | 10 | </head> |
10 | 11 | <body> |
11 | 12 | <script> |
|
55 | 56 | }).sort(function(a, b){//sort the terms by frequency |
56 | 57 | return b.frequency-a.frequency; |
57 | 58 | }).filter(function(d){return d.text; })//filter out empty words |
58 | | - .slice(0, 30); |
| 59 | + .slice(0, 20); |
59 | 60 | }); |
60 | 61 | return { |
61 | 62 | date: date, |
|
66 | 67 | }); |
67 | 68 | draw(data); |
68 | 69 | }); |
69 | | - |
| 70 | + // var data = getDummyData(); |
| 71 | + // draw(data); |
70 | 72 | function draw(data){ |
71 | | - var width = 1200, height = 600; |
| 73 | + //Layout data |
| 74 | + var width = 1200, height = 400; |
72 | 75 | var interpolation = "cardinal"; |
73 | | - var margins = {left: 10, top: 20, right: 10, bottom: 30}; |
| 76 | + var axisPadding = 10; |
| 77 | + var margins = {left: 20, top: 20, right: 10, bottom: 30}; |
74 | 78 | var ws = d3.layout.wordStream() |
75 | 79 | .size([width, height]) |
76 | 80 | .interpolate(interpolation) |
77 | 81 | .data(data); |
78 | 82 | var boxes = ws.boxes(); |
79 | 83 |
|
80 | | - //Displaying the streams |
| 84 | + //Display data |
| 85 | + var legendFontSize = 12; |
| 86 | + var legendHeight = boxes.topics.length*legendFontSize; |
81 | 87 | var area = d3.svg.area() |
82 | 88 | .interpolate(interpolation) |
83 | 89 | .x(function(d){return (d.x);}) |
|
86 | 92 | var color = d3.scale.category10(); |
87 | 93 | var svg = d3.select("body").append('svg').attr({ |
88 | 94 | width: width + margins.left + margins.top, |
89 | | - height: height + margins.top + margins.bottom, |
| 95 | + height: height + margins.top + margins.bottom + axisPadding + legendHeight, |
90 | 96 | }); |
91 | 97 | //Display time axes |
92 | 98 | var dates = []; |
93 | 99 | boxes.data.forEach(row =>{ |
94 | 100 | dates.push(row.date); |
95 | 101 | }); |
96 | | - var yAxisScale = d3.scale.ordinal().domain(dates).rangeBands([0, width]); |
97 | | - var yAxis = d3.svg.axis().orient('bottom').scale(yAxisScale); |
98 | | - var axisGroup = svg.append('g').attr('transform', 'translate(' + (margins.left) + ',' + (height+margins.top) + ')'); |
99 | | - var axisNodes = axisGroup.call(yAxis); |
| 102 | + |
| 103 | + var xAxisScale = d3.scale.ordinal().domain(dates).rangeBands([0, width]); |
| 104 | + var xAxis = d3.svg.axis().orient('bottom').scale(xAxisScale); |
| 105 | + var axisGroup = svg.append('g').attr('transform', 'translate(' + (margins.left) + ',' + (height+margins.top+axisPadding+legendHeight) + ')'); |
| 106 | + var axisNodes = axisGroup.call(xAxis); |
100 | 107 | styleAxis(axisNodes); |
101 | 108 | //Display the vertical gridline |
102 | 109 | var xGridlineScale = d3.scale.ordinal().domain(d3.range(0, dates.length+1)).rangeBands([0, width+width/boxes.data.length]); |
103 | 110 | var xGridlinesAxis = d3.svg.axis().orient('bottom').scale(xGridlineScale); |
104 | | - var xGridlinesGroup = svg.append('g').attr('transform', 'translate(' + (margins.left-width/boxes.data.length/2) + ',' + (height+margins.top) + ')'); |
105 | | - var gridlineNodes = xGridlinesGroup.call(xGridlinesAxis.tickSize(-height, 0, 0).tickFormat('')); |
| 111 | + var xGridlinesGroup = svg.append('g').attr('transform', 'translate(' + (margins.left-width/boxes.data.length/2) + ',' + (height+margins.top + axisPadding+legendHeight) + ')'); |
| 112 | + var gridlineNodes = xGridlinesGroup.call(xGridlinesAxis.tickSize(-height-axisPadding-legendHeight, 0, 0).tickFormat('')); |
106 | 113 | styleGridlineNodes(gridlineNodes); |
107 | 114 | //Main group |
108 | 115 | var mainGroup = svg.append('g').attr('transform', 'translate(' + margins.left + ',' + margins.top + ')'); |
|
156 | 163 | 'text-anchor': 'middle', |
157 | 164 | 'alignment-baseline': 'middle' |
158 | 165 | }); |
159 | | - //Display legends |
160 | | - var legendFontSize = 12; |
161 | | - var legendGroup = svg.append('g').attr('transform', 'translate(' + margins.left + ',' + 5 + ')'); |
| 166 | + //Build the legends |
| 167 | + var legendGroup = svg.append('g').attr('transform', 'translate(' + margins.left + ',' + (height+margins.top) + ')'); |
162 | 168 | var legendNodes = legendGroup.selectAll('g').data(boxes.topics).enter().append('g') |
163 | 169 | .attr('transform', function(d, i){return 'translate(' + 10 + ',' + (i*legendFontSize) + ')';}); |
164 | 170 | legendNodes.append('circle').attr({ |
165 | | - x: 0, |
166 | | - y: 0, |
167 | 171 | r: 5, |
168 | 172 | fill: function(d, i){return color(i);}, |
169 | 173 | 'fill-opacity': 0.1, |
170 | 174 | stroke: 'black', |
171 | | - 'stroke-width': 0.3, |
| 175 | + 'stroke-width': .5, |
172 | 176 | }); |
173 | 177 | legendNodes.append('text').text(function(d){return d;}).attr({ |
174 | 178 | 'font-size': legendFontSize, |
175 | 179 | 'alignment-baseline': 'middle', |
176 | 180 | dx: 8 |
177 | 181 | }); |
178 | | - |
179 | 182 | }; |
180 | 183 | function styleAxis(axisNodes){ |
181 | 184 | axisNodes.selectAll('.domain').attr({ |
|
0 commit comments