Mercurial > hg > webaudioevaluationtool
comparison analysis/analysis.js @ 1273:227ca4d00ab1
Added box plot chart to analysis.
author | Nicholas Jillings <n.g.r.jillings@se14.qmul.ac.uk> |
---|---|
date | Thu, 24 Mar 2016 10:36:38 +0000 |
parents | 5946b03fffe5 |
children | b4a0244bf5ed |
comparison
equal
deleted
inserted
replaced
1272:6798b5afa2c9 | 1273:227ca4d00ab1 |
---|---|
43 if (value > max) { | 43 if (value > max) { |
44 max = value; | 44 max = value; |
45 } | 45 } |
46 } | 46 } |
47 return max; | 47 return max; |
48 } | |
49 | |
50 function boxplotRow(array) { | |
51 // Take an array of element values and return array of computed intervals | |
52 var result = { | |
53 median : percentile(array,50), | |
54 pct25 : percentile(array,25), | |
55 pct75 : percentile(array,75), | |
56 IQR : null, | |
57 min: null, | |
58 max: null, | |
59 outliers: new Array() | |
60 } | |
61 result.IQR = result.pct75-result.pct25; | |
62 var rest = []; | |
63 var pct75_IQR = result.pct75+1.5*result.IQR; | |
64 var pct25_IQR = result.pct25-1.5*result.IQR; | |
65 for (var i=0; i<array.length; i++) { | |
66 //outliers, ranger above pct75+1.5*IQR or below pct25-1.5*IQR | |
67 var point = array[i]; | |
68 if (point > pct75_IQR || point < pct25_IQR) { | |
69 result.outliers.push(point); | |
70 } else { | |
71 rest.push(point); | |
72 } | |
73 } | |
74 result.max = arrayMax(rest); | |
75 result.min = arrayMin(rest); | |
76 return result; | |
77 | |
48 } | 78 } |
49 | 79 |
50 function arrayHistogram(values,steps,min,max) { | 80 function arrayHistogram(values,steps,min,max) { |
51 if (steps == undefined) { | 81 if (steps == undefined) { |
52 steps = 0.25; | 82 steps = 0.25; |
170 table.border = "1"; | 200 table.border = "1"; |
171 var numRows = this.data.getNumberOfRows(); | 201 var numRows = this.data.getNumberOfRows(); |
172 var numColumns = this.data.getNumberOfColumns(); | 202 var numColumns = this.data.getNumberOfColumns(); |
173 for (var columnIndex=0; columnIndex<numColumns; columnIndex++) | 203 for (var columnIndex=0; columnIndex<numColumns; columnIndex++) |
174 { | 204 { |
175 var table_row = document.createElement('tr'); | 205 var tableTitle = this.data.getColumnLabel(columnIndex); |
176 table.appendChild(table_row); | 206 if (tableTitle != "") { |
177 var row_title = document.createElement('td'); | 207 var table_row = document.createElement('tr'); |
178 table_row.appendChild(row_title); | 208 table.appendChild(table_row); |
179 row_title.textContent = this.data.getColumnLabel(columnIndex); | 209 var row_title = document.createElement('td'); |
180 for (var rowIndex=0; rowIndex<numRows; rowIndex++) | 210 table_row.appendChild(row_title); |
181 { | 211 row_title.textContent = tableTitle; |
182 var row_entry = document.createElement('td'); | 212 for (var rowIndex=0; rowIndex<numRows; rowIndex++) |
183 table_row.appendChild(row_entry); | |
184 var entry = this.data.getValue(rowIndex,columnIndex); | |
185 if (isFinite(Number(entry))) | |
186 { | 213 { |
187 entry = String(Number(entry).toFixed(4)); | 214 var row_entry = document.createElement('td'); |
188 } | 215 table_row.appendChild(row_entry); |
189 row_entry.textContent = entry; | 216 var entry = this.data.getValue(rowIndex,columnIndex); |
217 if (isFinite(Number(entry))) | |
218 { | |
219 entry = String(Number(entry).toFixed(4)); | |
220 } | |
221 row_entry.textContent = entry; | |
222 } | |
190 } | 223 } |
191 } | 224 } |
192 this.tableDOM.appendChild(table); | 225 this.tableDOM.appendChild(table); |
193 }; | 226 }; |
194 this.writeLatex = function() { | 227 this.writeLatex = function() { |
205 start.textContent = start.textContent+"c|"; | 238 start.textContent = start.textContent+"c|"; |
206 } | 239 } |
207 start.textContent = start.textContent.concat("}"); | 240 start.textContent = start.textContent.concat("}"); |
208 // Now write the rows: | 241 // Now write the rows: |
209 for (var rIndex=0; rIndex<numColumns; rIndex++) { | 242 for (var rIndex=0; rIndex<numColumns; rIndex++) { |
210 var row = document.createElement("p"); | 243 var tableTitle = this.data.getColumnLabel(rIndex); |
211 row.textContent = this.data.getColumnLabel(rIndex).concat(" & "); | 244 if(tableTitle != "") |
212 for (var cIndex=0; cIndex<numRows; cIndex++) { | 245 { |
213 var entry = this.data.getValue(cIndex,rIndex); | 246 var row = document.createElement("p"); |
214 if (isFinite(Number(entry))) | 247 row.textContent = tableTitle.concat(" & "); |
215 { | 248 for (var cIndex=0; cIndex<numRows; cIndex++) { |
216 entry = String(Number(entry).toFixed(4)); | 249 var entry = this.data.getValue(cIndex,rIndex); |
217 } | 250 if (isFinite(Number(entry))) |
218 row.textContent = row.textContent.concat(entry); | 251 { |
219 if (cIndex < numRows-1) { | 252 entry = String(Number(entry).toFixed(4)); |
220 row.textContent = row.textContent.concat(" & "); | 253 } |
221 } | 254 row.textContent = row.textContent.concat(entry); |
222 } | 255 if (cIndex < numRows-1) { |
223 holder.appendChild(row); | 256 row.textContent = row.textContent.concat(" & "); |
257 } else { | |
258 row.textContent = row.textContent.concat(" \\\\ \\hline"); | |
259 } | |
260 } | |
261 holder.appendChild(row); | |
262 } | |
224 } | 263 } |
225 // Table end | 264 // Table end |
226 var end = document.createElement("p"); | 265 var end = document.createElement("p"); |
227 end.textContent = "\\" + "end{tabular}"; | 266 end.textContent = "\\" + "end{tabular}"; |
228 holder.appendChild(end); | 267 holder.appendChild(end); |
252 for (var element of page.elements) { | 291 for (var element of page.elements) { |
253 for (var axis of element.axis) { | 292 for (var axis of element.axis) { |
254 // Find the axis | 293 // Find the axis |
255 var axisChart = chartList.find(function(element,index,array){ | 294 var axisChart = chartList.find(function(element,index,array){ |
256 if (element.name == this) {return true;} else {return false;} | 295 if (element.name == this) {return true;} else {return false;} |
257 },"mean-test-"+axis.id); | 296 },"mean-test-"+axis.name); |
258 if (axisChart == null) { | 297 if (axisChart == null) { |
259 axisChart = new this.chartObject("mean-test-"+axis.id); | 298 axisChart = new this.chartObject("mean-test-"+axis.name); |
260 axisChart.options = { | 299 axisChart.options = { |
261 'title':'Mean of axis: '+axis.name, | 300 'title':'Mean of axis: '+axis.name, |
262 'width':window.innerWidth*0.9, | 301 'width':window.innerWidth*0.9, |
263 'height':(window.innerWidth*0.9)/1.77 | 302 'height':(window.innerWidth*0.9)/1.77 |
264 } | 303 } |
274 } | 313 } |
275 | 314 |
276 // Build and push charts | 315 // Build and push charts |
277 for (var chart of chartList) { | 316 for (var chart of chartList) { |
278 chart.chart = new google.visualization.ColumnChart(chart.chartDOM); | 317 chart.chart = new google.visualization.ColumnChart(chart.chartDOM); |
318 chart.chart.draw(chart.data,chart.options); | |
319 chart.buildTable(); | |
320 chart.writeLatex(); | |
321 this.charts.push(chart); | |
322 } | |
323 } | |
324 | |
325 this.drawTestBoxplot = function() { | |
326 if (this.valueData == null) { | |
327 console.log("Error - Data not loaded"); | |
328 return; | |
329 } | |
330 var chartList = []; | |
331 | |
332 // Creates one chart per axis | |
333 | |
334 // Create the data table | |
335 for (var page of this.valueData.pages) { | |
336 for (var element of page.elements) { | |
337 for (var axis of element.axis) { | |
338 // Find the axis | |
339 var axisChart = chartList.find(function(element,index,array){ | |
340 if (element.name == this) {return true;} else {return false;} | |
341 },"boxplot-test-"+axis.name); | |
342 if (axisChart == null) { | |
343 // Axis chart doesn't exist | |
344 axisChart = new this.chartObject("boxplot-test-"+axis.name); | |
345 axisChart.options = { | |
346 'title':'Boxplot of axis '+axis.name, | |
347 'width':window.innerWidth*0.9, | |
348 'height':(window.innerWidth*0.9)/1.77, | |
349 legend: {position: 'none'}, | |
350 lineWidth: 0, | |
351 series: [{'color': '#D3362D'}], | |
352 intervals: { | |
353 barWidth: 1, | |
354 boxWidth: 1, | |
355 lineWidth: 2, | |
356 style: 'boxes' | |
357 }, | |
358 interval: { | |
359 max: { | |
360 style: 'bars', | |
361 fillOpacity: 1, | |
362 color: '#777' | |
363 }, | |
364 min: { | |
365 style: 'bars', | |
366 fillOpacity: 1, | |
367 color: '#777' | |
368 } | |
369 } | |
370 }; | |
371 axisChart.data.addColumn('string','id'); | |
372 axisChart.data.addColumn('number','median'); | |
373 axisChart.data.addColumn({id:'max',type:'number',role:'interval'}); | |
374 axisChart.data.addColumn({id:'min',type:'number',role:'interval'}); | |
375 axisChart.data.addColumn({id:'firstQuartile',type:'number',role:'interval'}); | |
376 axisChart.data.addColumn({id:'median',type:'number',role:'interval'}); | |
377 axisChart.data.addColumn({id:'thirdQuartile',type:'number',role:'interval'}); | |
378 chartList.push(axisChart); | |
379 document.getElementById("test-pages").appendChild(axisChart.root); | |
380 } | |
381 var result = boxplotRow(axis.values); | |
382 axisChart.data.addRow([element.id,result.median,result.max,result.min,result.pct25,result.median,result.pct75]); | |
383 } | |
384 } | |
385 } | |
386 // Build and push charts | |
387 for (var chart of chartList) { | |
388 chart.chart = new google.visualization.LineChart(chart.chartDOM); | |
279 chart.chart.draw(chart.data,chart.options); | 389 chart.chart.draw(chart.data,chart.options); |
280 chart.buildTable(); | 390 chart.buildTable(); |
281 chart.writeLatex(); | 391 chart.writeLatex(); |
282 this.charts.push(chart); | 392 this.charts.push(chart); |
283 } | 393 } |