diff options
Diffstat (limited to 'gn2/wqflask/static/new/javascript/plotly_probability_plot.js')
-rw-r--r-- | gn2/wqflask/static/new/javascript/plotly_probability_plot.js | 308 |
1 files changed, 308 insertions, 0 deletions
diff --git a/gn2/wqflask/static/new/javascript/plotly_probability_plot.js b/gn2/wqflask/static/new/javascript/plotly_probability_plot.js new file mode 100644 index 00000000..bc1e021b --- /dev/null +++ b/gn2/wqflask/static/new/javascript/plotly_probability_plot.js @@ -0,0 +1,308 @@ +// Generated by CoffeeScript 1.9.2 +(function() { + var get_z_scores, redraw_prob_plot, root; + + root = typeof exports !== "undefined" && exports !== null ? exports : this; + + get_z_scores = function(n) { + var i, j, osm_uniform, ref, x; + osm_uniform = new Array(n); + osm_uniform[n - 1] = Math.pow(0.5, 1.0 / n); + osm_uniform[0] = 1 - osm_uniform[n - 1]; + for (i = j = 1, ref = n - 2; 1 <= ref ? j <= ref : j >= ref; i = 1 <= ref ? ++j : --j) { + osm_uniform[i] = (i + 1 - 0.3175) / (n + 0.365); + } + return (function() { + var k, len, results; + results = []; + for (k = 0, len = osm_uniform.length; k < len; k++) { + x = osm_uniform[k]; + results.push(jStat.normal.inv(x, 0, 1)); + } + return results; + })(); + }; + + redraw_prob_plot = function(samples, sample_group) { + var container, h, margin, totalh, totalw, w; + h = 550; + w = 600; + margin = { + left: 60, + top: 40, + right: 40, + bottom: 40, + inner: 5 + }; + totalh = h + margin.top + margin.bottom; + totalw = w + margin.left + margin.right; + container = $("#prob_plot_container"); + container.width(totalw); + container.height(totalh); + var W, all_samples, chart, data, intercept, make_data, names, pvalue, pvalue_str, slope, sorted_names, sorted_values, sw_result, test_str, x, z_scores; + all_samples = samples[sample_group]; + names = (function() { + var j, len, ref, results; + ref = _.keys(all_samples); + results = []; + for (j = 0, len = ref.length; j < len; j++) { + x = ref[j]; + if (all_samples[x] !== null) { + results.push(x); + } + } + return results; + })(); + sorted_names = names.sort(function(x, y) { + return all_samples[x].value - all_samples[y].value; + }); + max_decimals = 0 + sorted_values = (function() { + var j, len, results; + results = []; + for (j = 0, len = sorted_names.length; j < len; j++) { + x = sorted_names[j]; + results.push(all_samples[x].value); + if (all_samples[x].value.countDecimals() > max_decimals) { + max_decimals = all_samples[x].value.countDecimals()-1 + } + } + return results; + })(); + //ZS: 0.1 indicates buffer, increase to increase buffer + y_domain = [sorted_values[0] - (sorted_values.slice(-1)[0] - sorted_values[0])*0.1, sorted_values.slice(-1)[0] + (sorted_values.slice(-1)[0] - sorted_values[0])*0.1] + //sw_result = ShapiroWilkW(sorted_values); + //W = sw_result.w.toFixed(3); + //pvalue = sw_result.p.toFixed(3); + //pvalue_str = pvalue > 0.05 ? pvalue.toString() : "<span style='color:red'>" + pvalue + "</span>"; + //test_str = "Shapiro-Wilk test statistic is " + W + " (p = " + pvalue_str + ")"; + z_scores = get_z_scores(sorted_values.length); + //ZS: 0.1 indicates buffer, increase to increase buffer + x_domain = [z_scores[0] - (z_scores.slice(-1)[0] - z_scores[0])*0.1, z_scores.slice(-1)[0] + (z_scores.slice(-1)[0] - z_scores[0])*0.1] + slope = jStat.stdev(sorted_values); + intercept = jStat.mean(sorted_values); + make_data = function(group_name) { + var sample, value, z_score; + return { + key: js_data.sample_group_types[group_name], + slope: slope, + intercept: intercept, + values: (function() { + var j, len, ref, ref1, results; + ref = _.zip(get_z_scores(sorted_values.length), sorted_values, sorted_names); + results = []; + for (j = 0, len = ref.length; j < len; j++) { + ref1 = ref[j], z_score = ref1[0], value = ref1[1], sample = ref1[2]; + if (sample in samples[group_name]) { + results.push({ + x: z_score, + y: value, + name: sample + }); + } + } + return results; + })() + }; + }; + data = [make_data('samples_primary'), make_data('samples_other'), make_data('samples_all')]; + x_values = {} + y_values = {} + point_names = {} + for (i = 0; i < 3; i++){ + these_x_values = [] + these_y_values = [] + these_names = [] + for (j = 0; j < data[i].values.length; j++){ + these_x_values.push(data[i].values[j].x) + these_y_values.push(data[i].values[j].y) + these_names.push(data[i].values[j].name) + } + if (i == 0){ + x_values['samples_primary'] = these_x_values + y_values['samples_primary'] = these_y_values + point_names['samples_primary'] = these_names + } else if (i == 1) { + x_values['samples_other'] = these_x_values + y_values['samples_other'] = these_y_values + point_names['samples_other'] = these_names + } else { + x_values['samples_all'] = these_x_values + y_values['samples_all'] = these_y_values + point_names['samples_all'] = these_names + } + } + + intercept_line = {} + + if (sample_group == "samples_primary"){ + first_x = Math.floor(x_values['samples_primary'][0]) + first_x = first_x - first_x*0.1 + last_x = Math.ceil(x_values['samples_primary'][x_values['samples_primary'].length - 1]) + last_x = last_x + last_x*0.1 + first_value = data[0].intercept + data[0].slope * first_x + last_value = data[0].intercept + data[0].slope * last_x + intercept_line['samples_primary'] = [[first_x, last_x], [first_value, last_value]] + } else if (sample_group == "samples_other") { + first_x = Math.floor(x_values['samples_other'][0]) + first_x = first_x - first_x*0.1 + last_x = Math.ceil(x_values['samples_other'][x_values['samples_other'].length - 1]) + last_x = last_x + last_x*0.1 + first_value = data[1].intercept + data[1].slope * first_x + last_value = data[1].intercept + data[1].slope * last_x + intercept_line['samples_other'] = [[first_x, last_x], [first_value, last_value]] + } else { + first_x = Math.floor(x_values['samples_all'][0]) + first_x = first_x - first_x*0.1 + last_x = Math.ceil(x_values['samples_all'][x_values['samples_all'].length - 1]) + first_value = data[2].intercept + data[2].slope * first_x + last_x = last_x + last_x*0.1 + last_value = data[2].intercept + data[2].slope * last_x + intercept_line['samples_all'] = [[first_x, last_x], [first_value, last_value]] + } + + val_range = Math.max(...y_values['samples_all']) - Math.min(...y_values['samples_all']) + if (val_range < 4){ + tick_digits = '.1f' + } else if (val_range < 0.4) { + tick_digits = '.2f' + } else { + tick_digits = 'f' + } + + var layout = { + title: { + x: 0, + y: 10, + xanchor: 'left', + text: "<b>Trait " + js_data.trait_id + ": " + js_data.short_description + "</b>", + }, + margin: { + l: 100, + r: 30, + t: 100, + b: 60 + }, + legend: { + x: 0.05, + y: 0.9, + xanchor: 'left' + }, + xaxis: { + title: "<b>normal quantiles</b>", + range: [first_x, last_x], + zeroline: false, + visible: true, + linecolor: 'black', + linewidth: 1, + titlefont: { + family: "arial", + size: 16 + }, + ticklen: 4, + tickfont: { + size: 16 + } + }, + yaxis: { + zeroline: false, + visible: true, + linecolor: 'black', + linewidth: 1, + title: "<b>" + js_data.unit_type + "</b>", + titlefont: { + family: "arial", + size: 16 + }, + ticklen: 4, + tickfont: { + size: 16 + }, + tickformat: tick_digits, + automargin: true + }, + width: 600, + height: 600, + hovermode: "closest", + dragmode: false + } + + var primary_trace = { + x: x_values['samples_primary'], + y: y_values['samples_primary'], + mode: 'markers', + type: 'scatter', + name: 'Samples', + text: point_names['samples_primary'], + marker: { + color: 'blue', + width: 6 + } + } + if ("samples_other" in js_data.sample_group_types) { + var other_trace = { + x: x_values['samples_other'], + y: y_values['samples_other'], + mode: 'markers', + type: 'scatter', + name: js_data.sample_group_types['samples_other'], + text: point_names['samples_other'], + marker: { + color: 'blue', + width: 6 + } + } + } + + if (sample_group == "samples_primary"){ + var primary_intercept_trace = { + x: intercept_line['samples_primary'][0], + y: intercept_line['samples_primary'][1], + mode: 'lines', + type: 'scatter', + name: 'Normal Function', + line: { + color: 'black', + width: 1 + } + } + } else if (sample_group == "samples_other"){ + var other_intercept_trace = { + x: intercept_line['samples_other'][0], + y: intercept_line['samples_other'][1], + mode: 'lines', + type: 'scatter', + name: 'Normal Function', + line: { + color: 'black', + width: 1 + } + } + } else { + var all_intercept_trace = { + x: intercept_line['samples_all'][0], + y: intercept_line['samples_all'][1], + mode: 'lines', + type: 'scatter', + name: 'Normal Function', + line: { + color: 'black', + width: 1 + } + } + } + + if (sample_group == "samples_primary"){ + var data = [primary_intercept_trace, primary_trace] + } else if (sample_group == "samples_other"){ + var data = [other_intercept_trace, other_trace] + } else { + var data = [all_intercept_trace, primary_trace, other_trace] + } + + Plotly.newPlot('prob_plot_div', data, layout, root.modebar_options) + }; + + root.redraw_prob_plot_impl = redraw_prob_plot; + +}).call(this); |