comparison analysis/analysis.js @ 1227:f88e611cd3c7

Created mean test/page plots, element histogram plots. Latex and tables included. Can download charts as PNG
author Nicholas Jillings <n.g.r.jillings@se14.qmul.ac.uk>
date Wed, 24 Feb 2016 13:03:08 +0000
parents d9ffea1d1e55
children cd064dc97583
comparison
equal deleted inserted replaced
1226:d9ffea1d1e55 1227:f88e611cd3c7
7 // Load the Visualization API and the corechart package. 7 // Load the Visualization API and the corechart package.
8 google.charts.load('current', {'packages':['corechart']}); 8 google.charts.load('current', {'packages':['corechart']});
9 chartContext = new Chart(); 9 chartContext = new Chart();
10 } 10 }
11 11
12 function arrayMean(values) {
13 var mean = 0;
14 for (var value of values) {
15 mean += value;
16 }
17 mean /= values.length;
18 return mean;
19 }
20
21 function percentile(values, n) {
22 values.sort( function(a,b) {return a - b;} );
23 // get ordinal rank
24 var rank = Math.min(Math.floor(values.length*n/100), values.length-1);
25 return values[rank];
26 }
27
28 function arrayMin(array) {
29 // Return the minimum value of an array
30 var min = array[0];
31 for (var value of array) {
32 if (value < min) {
33 min = value;
34 }
35 }
36 return min;
37 }
38
39 function arrayMax(array) {
40 // Return the minimum value of an array
41 var max = array[0];
42 for (var value of array) {
43 if (value > max) {
44 max = value;
45 }
46 }
47 return max;
48 }
49
50 function arrayHistogram(values,steps,min,max) {
51 if (steps == undefined) {
52 steps = 0.25;
53 console.log("Warning: arrayHistogram called without steps size set, default to 0.25");
54 }
55 if (min == undefined) {min = arrayMin(values);}
56 if (max == undefined) {max = arrayMax(values);}
57 var histogram = [];
58 var index = min;
59 while(index < max) {
60 histogram.push({
61 marker: index,
62 lt: index,
63 rt: index+steps,
64 count: 0
65 });
66 index += steps;
67 }
68 for (var value of values) {
69 for (var entry of histogram) {
70 if (value >= entry.lt && value <= entry.rt) {
71 entry.count++;
72 break;
73 }
74 }
75 }
76 return histogram;
77 }
78
12 function Chart() { 79 function Chart() {
13 this.valueData = null; 80 this.valueData = null;
14 this.commentData = null; 81 this.commentData = null;
15 this.loadStatus = 0; 82 this.loadStatus = 0;
83 this.charts = [];
16 84
17 var XMLHttp = new XMLHttpRequest(); 85 var XMLHttp = new XMLHttpRequest();
18 XMLHttp.parent = this; 86 XMLHttp.parent = this;
19 XMLHttp.open("GET","../scripts/score_parser.php?format=JSON",true); 87 XMLHttp.open("GET","../scripts/score_parser.php?format=JSON",true);
20 XMLHttp.onload = function() { 88 XMLHttp.onload = function() {
31 this.parent.commentData = JSON.parse(this.responseText); 99 this.parent.commentData = JSON.parse(this.responseText);
32 this.parent.loadStatus++; 100 this.parent.loadStatus++;
33 } 101 }
34 XMLHttp2.send(); 102 XMLHttp2.send();
35 103
36 this.drawMean = function() { 104 this.chartObject = function(name) {
105 // Create the charting object
106 this.name = name;
107 this.root = document.createElement("div");
108 this.root.className = "chart-holder";
109 this.root.setAttribute("name",name);
110 this.chartDOM = document.createElement("div");
111 this.tableDOM = document.createElement("div");
112 this.latexDOM = document.createElement("div");
113 this.downloadDOM = document.createElement("div");
114 this.chart = undefined;
115 this.data = new google.visualization.DataTable();
116 this.options = {};
117 this.print = document.createElement("button");
118 this.handleEvent = function() {
119 // Only used to handle the chart.event.addListener(this,'ready') callback
120 this.downloadDOM.innerHTML = '<a href="' + this.chart.getImageURI() + '">Download</a>';
121 }
122
123 this.root.appendChild(this.chartDOM);
124 this.root.appendChild(this.tableDOM);
125 this.root.appendChild(this.latexDOM);
126 this.root.appendChild(this.print);
127 this.print.textContent = "Download";
128 this.print.addEventListener("click",this);
129 this.root.appendChild(this.downloadDOM);
130 this.buildTable = function() {
131 var table = document.createElement("table");
132 table.border = "1";
133 for (var rowIndex=0; rowIndex<this.data.If.length; rowIndex++) {
134 var row = document.createElement("tr");
135 table.appendChild(row);
136 var rowTitle = document.createElement("td");
137 rowTitle.textContent = this.data.If[rowIndex].label;
138 row.appendChild(rowTitle);
139 for (var cIndex=0; cIndex<this.data.cc.length; cIndex++) {
140 var column = document.createElement("td");
141 column.textContent = this.data.cc[cIndex][rowIndex].tf;
142 row.appendChild(column);
143 }
144 }
145 this.tableDOM.appendChild(table);
146 };
147 this.writeLatex = function() {
148 var root = document.createElement("div");
149 root.className = "code";
150 var holder = document.createElement("pre");
151 // Table start
152 var start = document.createElement("p");
153 start.textContent = "\\" + "begin{tabular}{|l|";
154 holder.appendChild(start);
155 for (var i=0; i<this.data.cc.length; i++) {
156 start.textContent = start.textContent+"c|";
157 }
158 // Now write the rows:
159 for (var rIndex=0; rIndex<this.data.If.length; rIndex++) {
160 var row = document.createElement("p");
161 row.textContent = this.data.If[rIndex].label.concat(" & ");
162 for (var cIndex=0; cIndex<this.data.cc.length; cIndex++) {
163 row.textContent = row.textContent.concat(this.data.cc[cIndex][rIndex].tf);
164 if (cIndex < this.data.cc.length-1) {
165 row.textContent = row.textContent.concat(" & ");
166 }
167 }
168 holder.appendChild(row);
169 }
170 // Table end
171 var end = document.createElement("p");
172 end.textContent = "\\" + "end{tabular}";
173 holder.appendChild(end);
174 root.appendChild(holder);
175 this.latexDOM.appendChild(root);
176 }
177 }
178
179 this.clear = function() {
180 var inject = document.getElementById("test-pages");
181 for (var chart of this.charts) {
182 inject.removeChild(chart.root);
183 }
184 this.charts = [];
185 }
186
187 this.drawTestMean = function() {
188 // This draws one bargraph per axis with every test element on
189 if (this.valueData == null) {
190 console.log("Error - Data not loaded");
191 return;
192 }
193 var chartList = [];
194
195 // Create the data table
196 for (var page of this.valueData.pages) {
197 for (var element of page.elements) {
198 for (var axis of element.axis) {
199 // Find the axis
200 var axisChart = chartList.find(function(element,index,array){
201 if (element.name == this) {return true;} else {return false;}
202 },"mean-test-"+axis.id);
203 if (axisChart == null) {
204 axisChart = new this.chartObject("mean-test-"+axis.id);
205 axisChart.options = {
206 'title':'Mean of axis: '+axis.name,
207 'width':window.innerWidth*0.9,
208 'height':(window.innerWidth*0.9)/1.77
209 }
210 axisChart.data.addColumn('string','id');
211 axisChart.data.addColumn('number',axis.name);
212 chartList.push(axisChart);
213 document.getElementById("test-pages").appendChild(axisChart.root);
214 }
215 var mean = arrayMean(axis.values);
216 axisChart.data.addRow([element.id,mean]);
217 }
218 }
219 }
220
221 // Build and push charts
222 for (var chart of chartList) {
223 chart.chart = new google.visualization.ColumnChart(chart.chartDOM);
224 chart.chart.draw(chart.data,chart.options);
225 chart.buildTable();
226 chart.writeLatex();
227 this.charts.push(chart);
228 }
229 }
230
231 this.drawPageMean = function() {
37 // First we must get the value data 232 // First we must get the value data
38 if (this.valueData == null) { 233 if (this.valueData == null) {
39 console.log("Error - Data not loaded"); 234 console.log("Error - Data not loaded");
40 return; 235 return;
41 } 236 }
42 // We create one plot per page 237 // We create one plot per page
43 for (var page of this.valueData.pages) { 238 for (var page of this.valueData.pages) {
44 // First, create the chart resulting point 239
45 var inject = document.createElement("div"); 240 // Create the chart resulting point
46 document.getElementById("test-pages").appendChild(inject); 241 var chart = new this.chartObject("mean-page-"+page.id);
242 document.getElementById("test-pages").appendChild(chart.root);
47 243
48 // Create the data table 244 // Create the data table
49 var data = new google.visualization.DataTable(); 245 chart.data.addColumn('string','id');
50 data.addColumn('string','id');
51 // Get axis labels 246 // Get axis labels
52 for (var axis of page.elements[0].axis) { 247 for (var axis of page.elements[0].axis) {
53 data.addColumn('number',axis.name); 248 chart.data.addColumn('number',axis.name);
54 } 249 }
55 var rows = []; // Rows is an array of tuples [col1, col2, col3 ... colN]; 250 var rows = []; // Rows is an array of tuples [col1, col2, col3 ... colN];
56 for (var element of page.elements) { 251 for (var element of page.elements) {
57 var entry = [element.id]; 252 var entry = [element.id];
58 for (var i=0; i<page.elements[0].axis.length; i++) { 253 for (var i=0; i<page.elements[0].axis.length; i++) {
59 var mean =0; 254 var mean =0;
60 if (i < element.axis.length) { 255 if (i < element.axis.length) {
61 var axis = element.axis[i]; 256 var axis = element.axis[i];
62 for (var value of axis.values) { 257 mean = arrayMean(axis.values);
63 mean += value;
64 }
65 mean /= axis.values.length;
66 } 258 }
67 entry.push(mean); 259 entry.push(mean);
68 } 260 }
69 rows.push(entry); 261 rows.push(entry);
70 } 262 }
71 data.addRows(rows); 263 chart.data.addRows(rows);
72 var options = {'title':'Mean of page: '+page.id, 264 chart.options = {
73 'width':800, 265 'title':'Mean of page: '+page.id,
74 'height':700}; 266 'width':800,
267 'height':700
268 }
75 // Draw the chart 269 // Draw the chart
76 var chart = new google.visualization.ColumnChart(inject); 270 chart.chart = new google.visualization.ColumnChart(chart.chartDOM);
77 chart.draw(data,options); 271 chart.chart.draw(chart.data,chart.options);
78 } 272 chart.buildTable();
79 } 273 chart.writeLatex();
80 } 274 this.charts.push(chart);
275 }
276 }
277
278 this.drawElementHistogram = function() {
279 // First we must get the value data
280 if (this.valueData == null) {
281 console.log("Error - Data not loaded");
282 return;
283 }
284 // We create one plot per element, enjoy...
285 for (var page of this.valueData.pages) {
286 for (var element of page.elements) {
287 // Build the chart object
288 var chart = new this.chartObject("histogram-element-"+element.id);
289 document.getElementById("test-pages").appendChild(chart.root);
290 chart.data.addColumn('string','index');
291 var histograms = [];
292 for (var axis of element.axis) {
293 chart.data.addColumn('number',axis.name);
294 histograms.push(arrayHistogram(axis.values,0.125,0.0,1.0));
295 }
296 for (var axis of element.axis) {
297 for (var i=0; i<histograms[0].length; i++)
298 {
299 var entry = [""+histograms[0][i].lt.toPrecision(2)+"-"+histograms[0][i].rt.toPrecision(3)]
300 for (var histogram of histograms) {
301 entry.push(histogram[i].count);
302 }
303 chart.data.addRow(entry);
304 }
305 }
306 chart.options = {
307 'title':'Histogram of element: '+element.id,
308 'width':800,
309 'height':700,
310 'bar':{'groupWidth': '100%'}
311 }
312 // Draw the chart
313 chart.chart = new google.visualization.ColumnChart(chart.chartDOM);
314 chart.chart.draw(chart.data,chart.options);
315 chart.buildTable();
316 chart.writeLatex();
317 this.charts.push(chart);
318 }
319 }
320 }
321 }