n@1223
|
1 /*
|
n@1223
|
2 * Analysis script for WAET
|
n@1223
|
3 */
|
n@1223
|
4
|
n@1223
|
5 var chartContext;
|
n@1223
|
6 window.onload = function() {
|
n@1223
|
7 // Load the Visualization API and the corechart package.
|
n@1223
|
8 google.charts.load('current', {'packages':['corechart']});
|
n@1223
|
9 chartContext = new Chart();
|
n@1223
|
10 }
|
n@1223
|
11
|
n@1227
|
12 function arrayMean(values) {
|
n@1227
|
13 var mean = 0;
|
n@1227
|
14 for (var value of values) {
|
n@1227
|
15 mean += value;
|
n@1227
|
16 }
|
n@1227
|
17 mean /= values.length;
|
n@1227
|
18 return mean;
|
n@1227
|
19 }
|
n@1227
|
20
|
n@1275
|
21 function percentile(values, p) {
|
n@1275
|
22 //http://web.stanford.edu/class/archive/anthsci/anthsci192/anthsci192.1064/handouts/calculating%20percentiles.pdf
|
n@1227
|
23 values.sort( function(a,b) {return a - b;} );
|
n@1227
|
24 // get ordinal rank
|
n@1275
|
25 var index = values.length*p/100;
|
n@1275
|
26 var k = Math.floor(index);
|
n@1275
|
27 if (k == index) {
|
n@1275
|
28 return values[k];
|
n@1275
|
29 } else {
|
n@1275
|
30 var f = index-k;
|
n@1275
|
31 var x_int = (1-f)*values[k]+f*values[k+1];
|
n@1275
|
32 return x_int;
|
n@1275
|
33 }
|
n@1227
|
34 }
|
n@1227
|
35
|
n@1227
|
36 function arrayMin(array) {
|
n@1227
|
37 // Return the minimum value of an array
|
n@1227
|
38 var min = array[0];
|
n@1227
|
39 for (var value of array) {
|
n@1227
|
40 if (value < min) {
|
n@1227
|
41 min = value;
|
n@1227
|
42 }
|
n@1227
|
43 }
|
n@1227
|
44 return min;
|
n@1227
|
45 }
|
n@1227
|
46
|
n@1227
|
47 function arrayMax(array) {
|
n@1227
|
48 // Return the minimum value of an array
|
n@1227
|
49 var max = array[0];
|
n@1227
|
50 for (var value of array) {
|
n@1227
|
51 if (value > max) {
|
n@1227
|
52 max = value;
|
n@1227
|
53 }
|
n@1227
|
54 }
|
n@1227
|
55 return max;
|
n@1227
|
56 }
|
n@1227
|
57
|
n@1273
|
58 function boxplotRow(array) {
|
n@1273
|
59 // Take an array of element values and return array of computed intervals
|
n@1273
|
60 var result = {
|
n@1275
|
61 median : arrayMean(array),
|
n@1273
|
62 pct25 : percentile(array,25),
|
n@1273
|
63 pct75 : percentile(array,75),
|
n@1273
|
64 IQR : null,
|
n@1273
|
65 min: null,
|
n@1273
|
66 max: null,
|
n@1273
|
67 outliers: new Array()
|
n@1273
|
68 }
|
n@1273
|
69 result.IQR = result.pct75-result.pct25;
|
n@1273
|
70 var rest = [];
|
n@1273
|
71 var pct75_IQR = result.pct75+1.5*result.IQR;
|
n@1273
|
72 var pct25_IQR = result.pct25-1.5*result.IQR;
|
n@1273
|
73 for (var i=0; i<array.length; i++) {
|
n@1273
|
74 //outliers, ranger above pct75+1.5*IQR or below pct25-1.5*IQR
|
n@1273
|
75 var point = array[i];
|
n@1273
|
76 if (point > pct75_IQR || point < pct25_IQR) {
|
n@1273
|
77 result.outliers.push(point);
|
n@1273
|
78 } else {
|
n@1273
|
79 rest.push(point);
|
n@1273
|
80 }
|
n@1273
|
81 }
|
n@1273
|
82 result.max = arrayMax(rest);
|
n@1273
|
83 result.min = arrayMin(rest);
|
n@1273
|
84 return result;
|
n@1273
|
85
|
n@1273
|
86 }
|
n@1273
|
87
|
n@1227
|
88 function arrayHistogram(values,steps,min,max) {
|
n@1227
|
89 if (steps == undefined) {
|
n@1227
|
90 steps = 0.25;
|
n@1227
|
91 console.log("Warning: arrayHistogram called without steps size set, default to 0.25");
|
n@1227
|
92 }
|
n@1227
|
93 if (min == undefined) {min = arrayMin(values);}
|
n@1227
|
94 if (max == undefined) {max = arrayMax(values);}
|
n@1227
|
95 var histogram = [];
|
n@1227
|
96 var index = min;
|
n@1227
|
97 while(index < max) {
|
n@1227
|
98 histogram.push({
|
n@1227
|
99 marker: index,
|
n@1227
|
100 lt: index,
|
n@1227
|
101 rt: index+steps,
|
n@1227
|
102 count: 0
|
n@1227
|
103 });
|
n@1227
|
104 index += steps;
|
n@1227
|
105 }
|
n@1227
|
106 for (var value of values) {
|
n@1227
|
107 for (var entry of histogram) {
|
n@1227
|
108 if (value >= entry.lt && value <= entry.rt) {
|
n@1227
|
109 entry.count++;
|
n@1227
|
110 break;
|
n@1227
|
111 }
|
n@1227
|
112 }
|
n@1227
|
113 }
|
n@1227
|
114 return histogram;
|
n@1227
|
115 }
|
n@1227
|
116
|
n@1223
|
117 function Chart() {
|
n@1226
|
118 this.valueData = null;
|
n@1226
|
119 this.commentData = null;
|
n@1226
|
120 this.loadStatus = 0;
|
n@1227
|
121 this.charts = [];
|
n@1223
|
122
|
n@1226
|
123 var XMLHttp = new XMLHttpRequest();
|
n@1226
|
124 XMLHttp.parent = this;
|
n@1226
|
125 XMLHttp.open("GET","../scripts/score_parser.php?format=JSON",true);
|
n@1226
|
126 XMLHttp.onload = function() {
|
n@1226
|
127 // Now we have the JSON data, extract
|
n@1226
|
128 this.parent.valueData = JSON.parse(this.responseText);
|
n@1226
|
129 this.parent.loadStatus++;
|
n@1223
|
130 }
|
n@1226
|
131 XMLHttp.send();
|
n@1226
|
132 var XMLHttp2 = new XMLHttpRequest();
|
n@1226
|
133 XMLHttp2.parent = this;
|
n@1226
|
134 XMLHttp2.open("GET","../scripts/comment_parser.php?format=JSON",true);
|
n@1226
|
135 XMLHttp2.onload = function() {
|
n@1226
|
136 // Now we have the JSON data, extract
|
n@1226
|
137 this.parent.commentData = JSON.parse(this.responseText);
|
n@1226
|
138 this.parent.loadStatus++;
|
n@1226
|
139 }
|
n@1226
|
140 XMLHttp2.send();
|
n@1223
|
141
|
n@1227
|
142 this.chartObject = function(name) {
|
n@1227
|
143 // Create the charting object
|
n@1227
|
144 this.name = name;
|
n@1227
|
145 this.root = document.createElement("div");
|
n@1227
|
146 this.root.className = "chart-holder";
|
n@1227
|
147 this.root.setAttribute("name",name);
|
n@1227
|
148 this.chartDOM = document.createElement("div");
|
n@1227
|
149 this.tableDOM = document.createElement("div");
|
n@1227
|
150 this.latexDOM = document.createElement("div");
|
n@1227
|
151 this.downloadDOM = document.createElement("div");
|
n@1227
|
152 this.chart = undefined;
|
n@1227
|
153 this.data = new google.visualization.DataTable();
|
n@1227
|
154 this.options = {};
|
n@1227
|
155 this.print = document.createElement("button");
|
n@1228
|
156 this.sortDataButton = document.createElement("button");
|
n@1228
|
157 this.sortDataButton.textContent = "Sort by Data";
|
n@1228
|
158 this.sortDataButton.addEventListener("click",this);
|
n@1228
|
159 this.sortDataButton.setAttribute("name","sort-data");
|
n@1228
|
160 this.sortNameButton = document.createElement("button");
|
n@1228
|
161 this.sortNameButton.textContent = "Sort by Name";
|
n@1228
|
162 this.sortNameButton.addEventListener("click",this);
|
n@1228
|
163 this.sortNameButton.setAttribute("name","sort-name");
|
n@1228
|
164 this.draw = function() {
|
n@1228
|
165 if (this.chart == undefined) {return;}
|
n@1228
|
166 this.tableDOM.innerHTML = null;
|
n@1228
|
167 this.latexDOM.innerHTML = null;
|
n@1228
|
168 this.buildTable();
|
n@1228
|
169 this.writeLatex();
|
n@1228
|
170 this.chart.draw(this.data,this.options);
|
n@1228
|
171 }
|
n@1228
|
172 this.sortData = function() {
|
n@1265
|
173 this.data.sort(1);
|
n@1228
|
174 }
|
n@1228
|
175 this.sortName = function() {
|
n@1265
|
176 this.data.sort(0);
|
n@1228
|
177 }
|
n@1227
|
178 this.handleEvent = function() {
|
n@1227
|
179 // Only used to handle the chart.event.addListener(this,'ready') callback
|
n@1228
|
180 switch(event.currentTarget.getAttribute("name"))
|
n@1228
|
181 {
|
n@1228
|
182 case "download":
|
n@1228
|
183 window.open(this.chart.getImageURI());
|
n@1228
|
184 break;
|
n@1228
|
185 case "sort-data":
|
n@1228
|
186 this.sortData();
|
n@1228
|
187 this.draw();
|
n@1228
|
188 break;
|
n@1228
|
189 case "sort-name":
|
n@1228
|
190 this.sortName();
|
n@1228
|
191 this.draw();
|
n@1228
|
192 break;
|
n@1228
|
193 }
|
n@1227
|
194 }
|
n@1227
|
195
|
n@1227
|
196 this.root.appendChild(this.chartDOM);
|
n@1227
|
197 this.root.appendChild(this.tableDOM);
|
n@1227
|
198 this.root.appendChild(this.latexDOM);
|
n@1228
|
199 this.root.appendChild(this.sortDataButton);
|
n@1228
|
200 this.root.appendChild(this.sortNameButton);
|
n@1227
|
201 this.root.appendChild(this.print);
|
n@1227
|
202 this.print.textContent = "Download";
|
n@1228
|
203 this.print.setAttribute("name","download");
|
n@1227
|
204 this.print.addEventListener("click",this);
|
n@1227
|
205 this.root.appendChild(this.downloadDOM);
|
n@1227
|
206 this.buildTable = function() {
|
n@1227
|
207 var table = document.createElement("table");
|
n@1227
|
208 table.border = "1";
|
n@1264
|
209 var numRows = this.data.getNumberOfRows();
|
n@1264
|
210 var numColumns = this.data.getNumberOfColumns();
|
n@1264
|
211 for (var columnIndex=0; columnIndex<numColumns; columnIndex++)
|
n@1264
|
212 {
|
n@1273
|
213 var tableTitle = this.data.getColumnLabel(columnIndex);
|
n@1273
|
214 if (tableTitle != "") {
|
n@1273
|
215 var table_row = document.createElement('tr');
|
n@1273
|
216 table.appendChild(table_row);
|
n@1273
|
217 var row_title = document.createElement('td');
|
n@1273
|
218 table_row.appendChild(row_title);
|
n@1273
|
219 row_title.textContent = tableTitle;
|
n@1273
|
220 for (var rowIndex=0; rowIndex<numRows; rowIndex++)
|
n@1264
|
221 {
|
n@1273
|
222 var row_entry = document.createElement('td');
|
n@1273
|
223 table_row.appendChild(row_entry);
|
n@1273
|
224 var entry = this.data.getValue(rowIndex,columnIndex);
|
n@1273
|
225 if (isFinite(Number(entry)))
|
n@1273
|
226 {
|
n@1273
|
227 entry = String(Number(entry).toFixed(4));
|
n@1273
|
228 }
|
n@1273
|
229 row_entry.textContent = entry;
|
n@1264
|
230 }
|
n@1227
|
231 }
|
n@1227
|
232 }
|
n@1227
|
233 this.tableDOM.appendChild(table);
|
n@1227
|
234 };
|
n@1227
|
235 this.writeLatex = function() {
|
n@1264
|
236 var numRows = this.data.getNumberOfRows();
|
n@1264
|
237 var numColumns = this.data.getNumberOfColumns();
|
n@1227
|
238 var root = document.createElement("div");
|
n@1227
|
239 root.className = "code";
|
n@1227
|
240 var holder = document.createElement("pre");
|
n@1227
|
241 // Table start
|
n@1227
|
242 var start = document.createElement("p");
|
n@1227
|
243 start.textContent = "\\" + "begin{tabular}{|l|";
|
n@1227
|
244 holder.appendChild(start);
|
n@1264
|
245 for (var i=0; i<numRows; i++) {
|
n@1227
|
246 start.textContent = start.textContent+"c|";
|
n@1227
|
247 }
|
n@1228
|
248 start.textContent = start.textContent.concat("}");
|
n@1227
|
249 // Now write the rows:
|
n@1264
|
250 for (var rIndex=0; rIndex<numColumns; rIndex++) {
|
n@1273
|
251 var tableTitle = this.data.getColumnLabel(rIndex);
|
n@1273
|
252 if(tableTitle != "")
|
n@1273
|
253 {
|
n@1273
|
254 var row = document.createElement("p");
|
n@1273
|
255 row.textContent = tableTitle.concat(" & ");
|
n@1273
|
256 for (var cIndex=0; cIndex<numRows; cIndex++) {
|
n@1273
|
257 var entry = this.data.getValue(cIndex,rIndex);
|
n@1273
|
258 if (isFinite(Number(entry)))
|
n@1273
|
259 {
|
n@1273
|
260 entry = String(Number(entry).toFixed(4));
|
n@1273
|
261 }
|
n@1273
|
262 row.textContent = row.textContent.concat(entry);
|
n@1273
|
263 if (cIndex < numRows-1) {
|
n@1273
|
264 row.textContent = row.textContent.concat(" & ");
|
n@1273
|
265 } else {
|
n@1273
|
266 row.textContent = row.textContent.concat(" \\\\ \\hline");
|
n@1273
|
267 }
|
n@1264
|
268 }
|
n@1273
|
269 holder.appendChild(row);
|
n@1227
|
270 }
|
n@1227
|
271 }
|
n@1227
|
272 // Table end
|
n@1227
|
273 var end = document.createElement("p");
|
n@1227
|
274 end.textContent = "\\" + "end{tabular}";
|
n@1227
|
275 holder.appendChild(end);
|
n@1227
|
276 root.appendChild(holder);
|
n@1227
|
277 this.latexDOM.appendChild(root);
|
n@1227
|
278 }
|
n@1227
|
279 }
|
n@1227
|
280
|
n@1227
|
281 this.clear = function() {
|
n@1227
|
282 var inject = document.getElementById("test-pages");
|
n@1227
|
283 for (var chart of this.charts) {
|
n@1227
|
284 inject.removeChild(chart.root);
|
n@1227
|
285 }
|
n@1227
|
286 this.charts = [];
|
n@1227
|
287 }
|
n@1227
|
288
|
n@1227
|
289 this.drawTestMean = function() {
|
n@1227
|
290 // This draws one bargraph per axis with every test element on
|
n@1227
|
291 if (this.valueData == null) {
|
n@1227
|
292 console.log("Error - Data not loaded");
|
n@1227
|
293 return;
|
n@1227
|
294 }
|
n@1227
|
295 var chartList = [];
|
n@1227
|
296
|
n@1227
|
297 // Create the data table
|
n@1227
|
298 for (var page of this.valueData.pages) {
|
n@1227
|
299 for (var element of page.elements) {
|
n@1227
|
300 for (var axis of element.axis) {
|
n@1227
|
301 // Find the axis
|
n@1227
|
302 var axisChart = chartList.find(function(element,index,array){
|
n@1227
|
303 if (element.name == this) {return true;} else {return false;}
|
n@1273
|
304 },"mean-test-"+axis.name);
|
n@1227
|
305 if (axisChart == null) {
|
n@1273
|
306 axisChart = new this.chartObject("mean-test-"+axis.name);
|
n@1227
|
307 axisChart.options = {
|
n@1227
|
308 'title':'Mean of axis: '+axis.name,
|
n@1227
|
309 'width':window.innerWidth*0.9,
|
n@1227
|
310 'height':(window.innerWidth*0.9)/1.77
|
n@1227
|
311 }
|
n@1227
|
312 axisChart.data.addColumn('string','id');
|
n@1227
|
313 axisChart.data.addColumn('number',axis.name);
|
n@1227
|
314 chartList.push(axisChart);
|
n@1227
|
315 document.getElementById("test-pages").appendChild(axisChart.root);
|
n@1227
|
316 }
|
n@1227
|
317 var mean = arrayMean(axis.values);
|
n@1227
|
318 axisChart.data.addRow([element.id,mean]);
|
n@1227
|
319 }
|
n@1227
|
320 }
|
n@1227
|
321 }
|
n@1227
|
322
|
n@1227
|
323 // Build and push charts
|
n@1227
|
324 for (var chart of chartList) {
|
n@1227
|
325 chart.chart = new google.visualization.ColumnChart(chart.chartDOM);
|
n@1227
|
326 chart.chart.draw(chart.data,chart.options);
|
n@1227
|
327 chart.buildTable();
|
n@1227
|
328 chart.writeLatex();
|
n@1227
|
329 this.charts.push(chart);
|
n@1227
|
330 }
|
n@1227
|
331 }
|
n@1227
|
332
|
n@1273
|
333 this.drawTestBoxplot = function() {
|
n@1273
|
334 if (this.valueData == null) {
|
n@1273
|
335 console.log("Error - Data not loaded");
|
n@1273
|
336 return;
|
n@1273
|
337 }
|
n@1273
|
338 var chartList = [];
|
n@1273
|
339
|
n@1273
|
340 // Creates one chart per axis
|
n@1273
|
341
|
n@1273
|
342 // Create the data table
|
n@1273
|
343 for (var page of this.valueData.pages) {
|
n@1273
|
344 for (var element of page.elements) {
|
n@1273
|
345 for (var axis of element.axis) {
|
n@1273
|
346 // Find the axis
|
n@1273
|
347 var axisChart = chartList.find(function(element,index,array){
|
n@1273
|
348 if (element.name == this) {return true;} else {return false;}
|
n@1273
|
349 },"boxplot-test-"+axis.name);
|
n@1273
|
350 if (axisChart == null) {
|
n@1273
|
351 // Axis chart doesn't exist
|
n@1273
|
352 axisChart = new this.chartObject("boxplot-test-"+axis.name);
|
n@1273
|
353 axisChart.options = {
|
n@1273
|
354 'title':'Boxplot of axis '+axis.name,
|
n@1273
|
355 'width':window.innerWidth*0.9,
|
n@1273
|
356 'height':(window.innerWidth*0.9)/1.77,
|
n@1273
|
357 legend: {position: 'none'},
|
n@1273
|
358 lineWidth: 0,
|
n@1273
|
359 series: [{'color': '#D3362D'}],
|
n@1273
|
360 intervals: {
|
n@1273
|
361 barWidth: 1,
|
n@1273
|
362 boxWidth: 1,
|
n@1273
|
363 lineWidth: 2,
|
n@1273
|
364 style: 'boxes'
|
n@1273
|
365 },
|
n@1273
|
366 interval: {
|
n@1273
|
367 max: {
|
n@1273
|
368 style: 'bars',
|
n@1273
|
369 fillOpacity: 1,
|
n@1273
|
370 color: '#777'
|
n@1273
|
371 },
|
n@1273
|
372 min: {
|
n@1273
|
373 style: 'bars',
|
n@1273
|
374 fillOpacity: 1,
|
n@1273
|
375 color: '#777'
|
n@1273
|
376 }
|
n@1273
|
377 }
|
n@1273
|
378 };
|
n@1273
|
379 axisChart.data.addColumn('string','id');
|
n@1273
|
380 axisChart.data.addColumn('number','median');
|
n@1273
|
381 axisChart.data.addColumn({id:'max',type:'number',role:'interval'});
|
n@1273
|
382 axisChart.data.addColumn({id:'min',type:'number',role:'interval'});
|
n@1273
|
383 axisChart.data.addColumn({id:'firstQuartile',type:'number',role:'interval'});
|
n@1273
|
384 axisChart.data.addColumn({id:'median',type:'number',role:'interval'});
|
n@1273
|
385 axisChart.data.addColumn({id:'thirdQuartile',type:'number',role:'interval'});
|
n@1273
|
386 chartList.push(axisChart);
|
n@1273
|
387 document.getElementById("test-pages").appendChild(axisChart.root);
|
n@1273
|
388 }
|
n@1273
|
389 var result = boxplotRow(axis.values);
|
n@1273
|
390 axisChart.data.addRow([element.id,result.median,result.max,result.min,result.pct25,result.median,result.pct75]);
|
n@1273
|
391 }
|
n@1273
|
392 }
|
n@1273
|
393 }
|
n@1273
|
394 // Build and push charts
|
n@1273
|
395 for (var chart of chartList) {
|
n@1273
|
396 chart.chart = new google.visualization.LineChart(chart.chartDOM);
|
n@1273
|
397 chart.chart.draw(chart.data,chart.options);
|
n@1273
|
398 chart.buildTable();
|
n@1273
|
399 chart.writeLatex();
|
n@1273
|
400 this.charts.push(chart);
|
n@1273
|
401 }
|
n@1273
|
402 }
|
n@1273
|
403
|
n@1227
|
404 this.drawPageMean = function() {
|
n@1223
|
405 // First we must get the value data
|
n@1226
|
406 if (this.valueData == null) {
|
n@1226
|
407 console.log("Error - Data not loaded");
|
n@1226
|
408 return;
|
n@1226
|
409 }
|
n@1226
|
410 // We create one plot per page
|
n@1226
|
411 for (var page of this.valueData.pages) {
|
n@1227
|
412
|
n@1227
|
413 // Create the chart resulting point
|
n@1227
|
414 var chart = new this.chartObject("mean-page-"+page.id);
|
n@1227
|
415 document.getElementById("test-pages").appendChild(chart.root);
|
n@1226
|
416
|
n@1226
|
417 // Create the data table
|
n@1227
|
418 chart.data.addColumn('string','id');
|
n@1226
|
419 // Get axis labels
|
n@1226
|
420 for (var axis of page.elements[0].axis) {
|
n@1227
|
421 chart.data.addColumn('number',axis.name);
|
n@1226
|
422 }
|
n@1226
|
423 var rows = []; // Rows is an array of tuples [col1, col2, col3 ... colN];
|
n@1226
|
424 for (var element of page.elements) {
|
n@1226
|
425 var entry = [element.id];
|
n@1226
|
426 for (var i=0; i<page.elements[0].axis.length; i++) {
|
n@1226
|
427 var mean =0;
|
n@1226
|
428 if (i < element.axis.length) {
|
n@1226
|
429 var axis = element.axis[i];
|
n@1227
|
430 mean = arrayMean(axis.values);
|
n@1226
|
431 }
|
n@1226
|
432 entry.push(mean);
|
n@1226
|
433 }
|
n@1226
|
434 rows.push(entry);
|
n@1226
|
435 }
|
n@1227
|
436 chart.data.addRows(rows);
|
n@1227
|
437 chart.options = {
|
n@1227
|
438 'title':'Mean of page: '+page.id,
|
n@1227
|
439 'width':800,
|
n@1227
|
440 'height':700
|
n@1227
|
441 }
|
n@1226
|
442 // Draw the chart
|
n@1227
|
443 chart.chart = new google.visualization.ColumnChart(chart.chartDOM);
|
n@1227
|
444 chart.chart.draw(chart.data,chart.options);
|
n@1227
|
445 chart.buildTable();
|
n@1227
|
446 chart.writeLatex();
|
n@1227
|
447 this.charts.push(chart);
|
n@1227
|
448 }
|
n@1227
|
449 }
|
n@1227
|
450
|
n@1227
|
451 this.drawElementHistogram = function() {
|
n@1227
|
452 // First we must get the value data
|
n@1227
|
453 if (this.valueData == null) {
|
n@1227
|
454 console.log("Error - Data not loaded");
|
n@1227
|
455 return;
|
n@1227
|
456 }
|
n@1227
|
457 // We create one plot per element, enjoy...
|
n@1227
|
458 for (var page of this.valueData.pages) {
|
n@1227
|
459 for (var element of page.elements) {
|
n@1227
|
460 // Build the chart object
|
n@1227
|
461 var chart = new this.chartObject("histogram-element-"+element.id);
|
n@1227
|
462 document.getElementById("test-pages").appendChild(chart.root);
|
n@1227
|
463 chart.data.addColumn('string','index');
|
n@1227
|
464 var histograms = [];
|
n@1227
|
465 for (var axis of element.axis) {
|
n@1227
|
466 chart.data.addColumn('number',axis.name);
|
n@1227
|
467 histograms.push(arrayHistogram(axis.values,0.125,0.0,1.0));
|
n@1227
|
468 }
|
n@1227
|
469 for (var axis of element.axis) {
|
n@1227
|
470 for (var i=0; i<histograms[0].length; i++)
|
n@1227
|
471 {
|
n@1227
|
472 var entry = [""+histograms[0][i].lt.toPrecision(2)+"-"+histograms[0][i].rt.toPrecision(3)]
|
n@1227
|
473 for (var histogram of histograms) {
|
n@1227
|
474 entry.push(histogram[i].count);
|
n@1227
|
475 }
|
n@1227
|
476 chart.data.addRow(entry);
|
n@1227
|
477 }
|
n@1227
|
478 }
|
n@1227
|
479 chart.options = {
|
n@1227
|
480 'title':'Histogram of element: '+element.id,
|
n@1227
|
481 'width':800,
|
n@1227
|
482 'height':700,
|
n@1227
|
483 'bar':{'groupWidth': '100%'}
|
n@1227
|
484 }
|
n@1227
|
485 // Draw the chart
|
n@1227
|
486 chart.chart = new google.visualization.ColumnChart(chart.chartDOM);
|
n@1227
|
487 chart.chart.draw(chart.data,chart.options);
|
n@1227
|
488 chart.buildTable();
|
n@1227
|
489 chart.writeLatex();
|
n@1227
|
490 this.charts.push(chart);
|
n@1227
|
491 }
|
n@1226
|
492 }
|
n@1223
|
493 }
|
n@1223
|
494 } |