Mercurial > hg > webaudioevaluationtool
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 } |