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 }