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 ;
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' )
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 >
0 commit comments