Skip to content

Commit 7e01fcf

Browse files
committed
Added time-axis, gridline, and legends
Added time-axis, gridline, and legends
1 parent dfa29fc commit 7e01fcf

3 files changed

Lines changed: 81 additions & 164 deletions

File tree

index.html

Lines changed: 74 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -68,46 +68,64 @@
6868
});
6969

7070
function draw(data){
71-
var width = 800, height = 800;
71+
var width = 1200, height = 600;
72+
var interpolation = "cardinal";
73+
var margins = {left: 10, top: 20, right: 10, bottom: 30};
7274
var ws = d3.layout.wordStream()
7375
.size([width, height])
76+
.interpolate(interpolation)
7477
.data(data);
7578
var boxes = ws.boxes();
76-
79+
7780
//Displaying the streams
7881
var area = d3.svg.area()
79-
.interpolate('cardinal')
82+
.interpolate(interpolation)
8083
.x(function(d){return (d.x);})
8184
.y0(function(d){return d.y0;})
8285
.y1(function(d){return (d.y0 + d.y); });
83-
8486
var color = d3.scale.category10();
8587
var svg = d3.select("body").append('svg').attr({
86-
width: width,
87-
height: height
88+
width: width + margins.left + margins.top,
89+
height: height + margins.top + margins.bottom,
8890
});
89-
90-
svg.selectAll('path')
91+
//Display time axes
92+
var dates = [];
93+
boxes.data.forEach(row =>{
94+
dates.push(row.date);
95+
});
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);
100+
styleAxis(axisNodes);
101+
//Display the vertical gridline
102+
var xGridlineScale = d3.scale.ordinal().domain(d3.range(0, dates.length+1)).rangeBands([0, width+width/boxes.data.length]);
103+
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(''));
106+
styleGridlineNodes(gridlineNodes);
107+
//Main group
108+
var mainGroup = svg.append('g').attr('transform', 'translate(' + margins.left + ',' + margins.top + ')');
109+
mainGroup.selectAll('path')
91110
.data(boxes.layers)
92111
.enter()
93112
.append('path')
94113
.attr('d', area)
95-
.style('fill', function () {
96-
return color(Math.random());
114+
.style('fill', function (d, i) {
115+
return color(i);
97116
})
98117
.attr({
99118
'fill-opacity': 0.1,
100119
stroke: 'black',
101120
'stroke-width': 0.3
102121
});
103-
//For each box
104122
var allWords = [];
105123
d3.map(boxes.data, function(row){
106124
boxes.topics.forEach(topic=>{
107125
allWords = allWords.concat(row.words[topic]);
108126
});
109127
});
110-
allWords = allWords.filter(d=> d.placed==true);
128+
allWords = allWords.filter(d=> d.placed==true);//Filter out not placable words
111129

112130
//Display text
113131
var topics = boxes.topics;
@@ -124,7 +142,7 @@
124142
.domain(uniqueTerms)
125143
.range(c20.range());
126144

127-
svg.selectAll('g').data(allWords).enter().append('g')
145+
mainGroup.selectAll('g').data(allWords).enter().append('g')
128146
.attr({
129147
transform: function(d){return 'translate('+d.x+', '+d.y+')rotate('+d.rotate+')';}
130148
}).append('text')
@@ -138,7 +156,50 @@
138156
'text-anchor': 'middle',
139157
'alignment-baseline': 'middle'
140158
});
159+
//Display legends
160+
var legendFontSize = 12;
161+
var legendGroup = svg.append('g').attr('transform', 'translate(' + margins.left + ',' + 5 + ')');
162+
var legendNodes = legendGroup.selectAll('g').data(boxes.topics).enter().append('g')
163+
.attr('transform', function(d, i){return 'translate(' + 10 + ',' + (i*legendFontSize) + ')';});
164+
legendNodes.append('circle').attr({
165+
x: 0,
166+
y: 0,
167+
r: 5,
168+
fill: function(d, i){return color(i);},
169+
'fill-opacity': 0.1,
170+
stroke: 'black',
171+
'stroke-width': 0.3,
172+
});
173+
legendNodes.append('text').text(function(d){return d;}).attr({
174+
'font-size': legendFontSize,
175+
'alignment-baseline': 'middle',
176+
dx: 8
177+
});
178+
141179
};
180+
function styleAxis(axisNodes){
181+
axisNodes.selectAll('.domain').attr({
182+
fill: 'none',
183+
'stroke-width': 1,
184+
stroke: 'black'
185+
});
186+
axisNodes.selectAll('.tick line').attr({
187+
fill: 'none',
188+
'stroke-width': 1,
189+
stroke: 'black'
190+
});
191+
}
192+
function styleGridlineNodes(gridlineNodes){
193+
gridlineNodes.selectAll('.domain').attr({
194+
fill: 'none',
195+
stroke: 'none'
196+
});
197+
gridlineNodes.selectAll('.tick line').attr({
198+
fill: 'none',
199+
'stroke-width': 0.7,
200+
stroke: 'lightgray'
201+
});
202+
}
142203
</script>
143204
</body>
144205
</html>

lib/d3.layout.wordstream.js

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,15 @@
22
// Also referenced to the implementation: by Jason Davies, https://www.jasondavies.com/wordcloud/
33
d3.layout.wordStream = function(){
44
var data = [],
5-
size = [1200, 800],
5+
size = [1200, 400],
66
maxFontSize = 40,
77
minFontSize = 4,
88
fontScale = d3.scale.linear(),
99
frequencyScale = d3.scale.linear(),
1010
spiral = achemedeanSpiral,
11-
minBoxHeight = 100,
1211
font = "Impact",
13-
canvas = cloudCanvas;
12+
canvas = cloudCanvas,
13+
interpolation = "cardinal";
1414
var wordStream = {};
1515

1616
var cloudRadians = Math.PI / 180,
@@ -215,7 +215,7 @@ d3.layout.wordStream = function(){
215215
var catIndex = boxes.topics.indexOf(topic);
216216

217217
var area1 = d3.svg.area()
218-
.interpolate('cardinal')
218+
.interpolate(interpolation)
219219
.x(function(d){return d.x; })
220220
.y0(0)
221221
.y1(function(d){return d.y0; });
@@ -430,6 +430,9 @@ d3.layout.wordStream = function(){
430430
//#endregion
431431
//Exporting the functions to set configuration data
432432
//#region setter/getter functions
433+
wordStream.interpolate = function(_){
434+
return arguments.length ? (interpolation = _, wordStream) : interpolation;
435+
}
433436
wordStream.streamPath1 = function(_){
434437
return arguments.length ? (streamPath1 = _, wordStream) : streamPath1;
435438
}
@@ -439,9 +442,6 @@ d3.layout.wordStream = function(){
439442
wordStream.font = function(_){
440443
return arguments.length ? (font = _, wordStream): font;
441444
}
442-
wordStream.minBoxHeight = function(_){
443-
return arguments.length ? (minBoxHeight = _, wordStream) : minBoxHeight;
444-
}
445445
wordStream.frequencyScale = function(_){
446446
return arguments.length ? (frequencyScale = _, wordStream) : frequencyScale;
447447
}

test/wordstream.html

Lines changed: 0 additions & 144 deletions
This file was deleted.

0 commit comments

Comments
 (0)