diff options
-rw-r--r-- | wqflask/utility/corr_result_helpers.py | 26 | ||||
-rw-r--r-- | wqflask/wqflask/correlation/corr_scatter_plot.py | 24 | ||||
-rw-r--r-- | wqflask/wqflask/static/new/css/corr_scatter_plot.css | 17 | ||||
-rw-r--r-- | wqflask/wqflask/static/new/javascript/corr_scatter_plot.js | 63 | ||||
-rw-r--r-- | wqflask/wqflask/templates/corr_scatter_plot.html | 22 | ||||
-rw-r--r-- | wqflask/wqflask/templates/correlation_page.html | 10 | ||||
-rw-r--r-- | wqflask/wqflask/views.py | 9 |
7 files changed, 162 insertions, 9 deletions
diff --git a/wqflask/utility/corr_result_helpers.py b/wqflask/utility/corr_result_helpers.py index edf32449..a253026c 100644 --- a/wqflask/utility/corr_result_helpers.py +++ b/wqflask/utility/corr_result_helpers.py @@ -25,6 +25,32 @@ def normalize_values(a_values, b_values): return a_new, b_new, num_overlap +def common_keys(a_samples, b_samples): + """ + >>> a = dict(BXD1 = 9.113, BXD2 = 9.825, BXD14 = 8.985, BXD15 = 9.300) + >>> b = dict(BXD1 = 9.723, BXD3 = 9.825, BXD14 = 9.124, BXD16 = 9.300) + >>> sorted(common_keys(a, b)) + ['BXD1', 'BXD14'] + """ + return set(a_samples.keys()).intersection(set(b_samples.keys())) + + +def normalize_values_with_samples(a_samples, b_samples): + common_samples = common_keys(a_samples, b_samples) + + a_new = {} + b_new = {} + for sample in common_samples: + a_new[sample] = a_samples[sample] + b_new[sample] = b_samples[sample] + + num_overlap = len(a_new) + assert num_overlap == len(b_new), "Lengths should be the same" + + return a_new, b_new, num_overlap + + + if __name__ == '__main__': import doctest doctest.testmod()
\ No newline at end of file diff --git a/wqflask/wqflask/correlation/corr_scatter_plot.py b/wqflask/wqflask/correlation/corr_scatter_plot.py new file mode 100644 index 00000000..13022b44 --- /dev/null +++ b/wqflask/wqflask/correlation/corr_scatter_plot.py @@ -0,0 +1,24 @@ +from __future__ import absolute_import, print_function, division + +from base.trait import GeneralTrait +from base import data_set +from utility import corr_result_helpers + +class CorrScatterPlot(object): + + def __init__(self, params): + self.data_set_1 = data_set.create_dataset(params['dataset_1']) + self.data_set_2 = data_set.create_dataset(params['dataset_2']) + self.trait_1 = GeneralTrait(name=params['trait_1'], dataset=self.data_set_1) + self.trait_2 = GeneralTrait(name=params['trait_2'], dataset=self.data_set_2) + vals_1 = [] + for sample in self.trait_1.data.keys(): + vals_1.append(self.trait_1.data[sample].value) + vals_2 = [] + for sample in self.trait_2.data.keys(): + vals_2.append(self.trait_2.data[sample].value) + samples_1, samples_2, num_overlap = corr_result_helpers.normalize_values_with_samples(self.trait_1.data, self.trait_2.data) + self.js_data = dict( + samples_1 = samples_1, + samples_2 = samples_2 + )
\ No newline at end of file diff --git a/wqflask/wqflask/static/new/css/corr_scatter_plot.css b/wqflask/wqflask/static/new/css/corr_scatter_plot.css new file mode 100644 index 00000000..602c7297 --- /dev/null +++ b/wqflask/wqflask/static/new/css/corr_scatter_plot.css @@ -0,0 +1,17 @@ +.chart { + +} + +.main text { + font: 10px sans-serif; +} + +.axis line, .axis path { + shape-rendering: crispEdges; + stroke: black; + fill: none; +} + +circle { + fill: steelblue; +}
\ No newline at end of file diff --git a/wqflask/wqflask/static/new/javascript/corr_scatter_plot.js b/wqflask/wqflask/static/new/javascript/corr_scatter_plot.js new file mode 100644 index 00000000..180e6240 --- /dev/null +++ b/wqflask/wqflask/static/new/javascript/corr_scatter_plot.js @@ -0,0 +1,63 @@ +var data = new Array(); +samples_1 = js_data.samples_1; +samples_2 = js_data.samples_2; +i = 0; +for (var samplename in samples_1){ + sample1 = samples_1[samplename]; + sample2 = samples_2[samplename]; + data[i] = [sample1.value, sample2.value]; + i++; +} + + var margin = {top: 20, right: 15, bottom: 60, left: 60} + , width = 800 - margin.left - margin.right + , height = 600 - margin.top - margin.bottom; + + var x = d3.scale.linear() + .domain([d3.min(data, function(d){return d[0];})*0.95, d3.max(data, function(d) { return d[0]; })*1.05]) + .range([ 0, width ]); + + var y = d3.scale.linear() + .domain([d3.min(data, function(d){return d[1];})*0.95, d3.max(data, function(d) { return d[1]; })*1.05]) + .range([ height, 0 ]); + + var chart = d3.select('#scatter_plot') + .append('svg:svg') + .attr('width', width + margin.right + margin.left) + .attr('height', height + margin.top + margin.bottom) + .attr('class', 'chart') + + var main = chart.append('g') + .attr('transform', 'translate(' + margin.left + ',' + margin.top + ')') + .attr('width', width) + .attr('height', height) + .attr('class', 'main') + + // draw the x axis + var xAxis = d3.svg.axis() + .scale(x) + .orient('bottom'); + + main.append('g') + .attr('transform', 'translate(0,' + height + ')') + .attr('class', 'main axis date') + .call(xAxis); + + // draw the y axis + var yAxis = d3.svg.axis() + .scale(y) + .orient('left'); + + main.append('g') + .attr('transform', 'translate(0,0)') + .attr('class', 'main axis date') + .call(yAxis); + + var g = main.append("svg:g"); + + g.selectAll("scatter-dots") + .data(data) + .enter().append("svg:circle") + .attr("cx", function (d,i) { return x(d[0]); } ) + .attr("cy", function (d) { return y(d[1]); } ) + .attr("r", 6);
\ No newline at end of file diff --git a/wqflask/wqflask/templates/corr_scatter_plot.html b/wqflask/wqflask/templates/corr_scatter_plot.html new file mode 100644 index 00000000..b25110d7 --- /dev/null +++ b/wqflask/wqflask/templates/corr_scatter_plot.html @@ -0,0 +1,22 @@ +{% extends "base.html" %} + +{% block css %} + <link rel="stylesheet" type="text/css" href="/static/packages/jqplot/jquery.jqplot.min.css" /> + <link rel="stylesheet" type="text/css" href="/static/new/packages/DataTables/css/jquery.dataTables.css" /> + <link rel="stylesheet" type="text/css" href="/static/packages/DT_bootstrap/DT_bootstrap.css" /> + <link rel="stylesheet" type="text/css" href="/static/packages/TableTools/media/css/TableTools.css" /> + <link rel="stylesheet" type="text/css" href="/static/new/css/corr_scatter_plot.css" /> +{% endblock %} + +{% block content %} +<div id='scatter_plot'></div> +{% endblock %} + +{% block js %} + <script> + js_data = {{ js_data | safe }} + </script> + <script language="javascript" type="text/javascript" src="http://d3js.org/d3.v3.min.js"></script> + <script language="javascript" type="text/javascript" src="/static/packages/underscore/underscore-min.js"></script> + <script language="javascript" type="text/javascript" src="/static/new/javascript/corr_scatter_plot.js"></script> +{% endblock %}
\ No newline at end of file diff --git a/wqflask/wqflask/templates/correlation_page.html b/wqflask/wqflask/templates/correlation_page.html index d675b801..e4819d61 100644 --- a/wqflask/wqflask/templates/correlation_page.html +++ b/wqflask/wqflask/templates/correlation_page.html @@ -59,7 +59,7 @@ <td>{{'%0.3f'|format(trait.mean)}}</td> <td>{{'%0.3f'|format(trait.lrs)}}</td> <td>Chr{{ trait.locus_chr }}: {{'%0.3f'|format(trait.locus_mb) }}</td> - <td>{{'%0.3f'|format(trait.sample_r)}}</td> + <td><a target="_blank" href="corr_scatter_plot?dataset_1={{dataset.name}}&dataset_2={{trait.dataset.name}}&trait_1={{this_trait.name}}&trait_2={{trait.name}}">{{'%0.3f'|format(trait.sample_r)}}</a></td> <td>{{ trait.num_overlap }}</td> <td>{{'%0.3e'|format(trait.sample_p)}}</td> <td>{{'%0.3f'|format(trait.lit_corr)}}</td> @@ -69,14 +69,6 @@ {% endfor %} </tbody> </table> - - <br /> - -<!-- <button class="btn"><i class="icon-ok"></i> Select</button> - <button class="btn"><i class="icon-remove"></i> Deselect</button> - <button class="btn"><i class="icon-resize-vertical"></i> Invert</button> - <button class="btn"><i class="icon-plus-sign"></i> Add</button> - <button class="btn btn-primary pull-right"><i class="icon-download icon-white"></i> Download Table</button>--> </div> </div> {% endblock %} diff --git a/wqflask/wqflask/views.py b/wqflask/wqflask/views.py index 22973045..b2f08ca0 100644 --- a/wqflask/wqflask/views.py +++ b/wqflask/wqflask/views.py @@ -34,6 +34,7 @@ from wqflask.show_trait import export_trait_data from wqflask.marker_regression import marker_regression #from wqflask.interval_mapping import interval_mapping from wqflask.correlation import show_corr_results +from wqflask.correlation import corr_scatter_plot from utility import temp_data from wqflask.dataSharing import SharingInfo, SharingInfoPage @@ -299,6 +300,14 @@ def corr_compute_page(): template_vars = show_corr_results.CorrelationResults(request.form) return render_template("correlation_page.html", **template_vars.__dict__) +@app.route("/corr_scatter_plot") +def corr_scatter_plot_page(): + template_vars = corr_scatter_plot.CorrScatterPlot(request.args) + template_vars.js_data = json.dumps(template_vars.js_data, + default=json_default_handler, + indent=" ") + return render_template("corr_scatter_plot.html", **template_vars.__dict__) + @app.route("/int_mapping", methods=('POST',)) def interval_mapping_page(): template_vars = interval_mapping.IntervalMapping(request.args) |