|
<!DOCTYPE html> |
|
<head> |
|
<meta charset="utf-8"> |
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.5.5/d3.min.js"></script> |
|
<link rel="stylesheet" type="text/css" href="http://fonts.googleapis.com/css?family=Roboto+Slab:400,100,300,700"> |
|
<link rel="stylesheet" type="text/css" href="http://fonts.googleapis.com/css?family=Roboto:400,100,100italic,300,300italic,400italic,500,500italic,700,700italic,900,900italic"> |
|
|
|
|
|
</head> |
|
|
|
<body> |
|
<script> |
|
// Feel free to change or delete any of the code you see! |
|
var genomelength = 7800; |
|
|
|
var tickMarks = {thousand: [], fivehundred: [], onehundred: []}; |
|
|
|
var genome_positions = []; |
|
for (var i = 1; i <= genomelength; i++) { |
|
genome_positions.push(i); |
|
} |
|
|
|
genome_positions.forEach(function(currentValue, index, myArray){ |
|
if (currentValue % 1000 === 0) { |
|
tickMarks.thousand.push(currentValue); |
|
} |
|
else if (currentValue % 500 === 0) { |
|
tickMarks.fivehundred.push(currentValue); |
|
|
|
} |
|
else if (currentValue % 100 === 0) { |
|
tickMarks.onehundred.push(currentValue); |
|
} |
|
}); |
|
var svg = d3.select("body").append("svg").attr({height: 500,width: genomelength/10}); |
|
svg.append("rect") |
|
.attr({x: 0, y: 100, width: genomelength/10, height: 30}) |
|
.style({"stroke-width": "2px", "fill": "white", "stroke": "black"}) |
|
.attr("stroke-opacity", 0) |
|
.transition().duration(1000) |
|
.attr("stroke-opacity", 1); |
|
|
|
|
|
d3.json("genes.json.txt", function(error, json) { |
|
if (error) return console.warn(error); |
|
var genes = svg.selectAll(".genes") |
|
.data(json) |
|
.enter() |
|
.append("g"); |
|
|
|
genes.append("rect") |
|
|
|
|
|
.attr("fill", function (d) { |
|
if (d.direction == "forward") { |
|
return "green"; |
|
} |
|
else if (d.direction == "reverse") { |
|
return "red"; |
|
} |
|
else { |
|
return "black"; |
|
} |
|
}) |
|
.on("mouseover", function(){ |
|
d3.select(this) |
|
|
|
|
|
.style("fill","red") |
|
.transition(5000) |
|
.style("fill", "orange") |
|
.transition(5000) |
|
.style("fill", "green") |
|
.transition(5000) |
|
.style("fill", "lightblue") |
|
.transition(5000) |
|
.style("fill", "blue") |
|
.transition(5000) |
|
.style("fill", "purple") |
|
|
|
|
|
|
|
|
|
}) |
|
|
|
.on("mouseout", function(){ |
|
d3.select(this) |
|
|
|
.style("fill", function (d) { |
|
if (d.direction == "forward") { |
|
return "green"; |
|
} |
|
else if (d.direction == "reverse") { |
|
return "red"; |
|
} |
|
else { |
|
return "black"; |
|
} |
|
})}) |
|
|
|
|
|
.attr("y", function (d) { |
|
if (d.direction == "forward") { |
|
if (d.name % 2 === 0) { |
|
return 70; |
|
} |
|
else { return 40;} |
|
} |
|
else if (d.direction == "reverse") { |
|
if (d.name % 2 === 0) { |
|
return 160; |
|
} |
|
else { return 130; } |
|
} |
|
}) |
|
.attr("x", function (d) { |
|
if (d.direction === "forward") { |
|
return (0 - ((d.stop-d.start)/10)) - 2; |
|
} |
|
else if (d.direction === "reverse") { |
|
return (genomelength/10) + 2; |
|
} |
|
}) |
|
.attr("height", function (d) {return 30;}) |
|
.attr("width", function (d) { return (d.stop-d.start)/10; }) |
|
.style({"stroke":"black", "stroke-width": "2px"}) |
|
|
|
.transition().delay(1000).duration(1500).attr("x", function (d) { return d.start/10; }); |
|
|
|
|
|
genes.append("text") // GC |
|
.attr("x", function(d) { return ((d.start + d.stop)/2)/10;}) |
|
.attr("y", function (d) { |
|
if (d.direction == "forward") { |
|
if (d.name % 2 === 0) { |
|
return 90; |
|
} |
|
else { return 60;} |
|
} |
|
else if (d.direction == "reverse") { |
|
if (d.name % 2 === 0) { |
|
return 180; |
|
} |
|
else { return 150;} |
|
} |
|
}) |
|
.style({"text-anchor": "middle", "fill": "black"}) |
|
.attr("font-family", "sans-serif") |
|
.text(function(d) { |
|
return ((((d.sequence.match(/G/gi).length)+(d.sequence.match(/C/gi).length))/(d.sequence.length))*100).toPrecision(3)+"%"; |
|
}) |
|
.attr("fill-opacity", 0) |
|
.transition().delay(2000).duration(1500) |
|
.attr("fill-opacity", 1); |
|
|
|
genes.append("text") // pham name |
|
.attr("x", function(d) { |
|
return ((d.start + d.stop)/2)/10; |
|
}) |
|
.attr("y", function (d) { |
|
if (d.direction == "forward") { |
|
if (d.name % 2 === 0) { |
|
return 60; |
|
} |
|
else { return 30;} |
|
} |
|
else if (d.direction == "reverse") { |
|
if (d.name % 2 === 0) { |
|
return 210; |
|
} |
|
else { return 180;} |
|
} |
|
}) |
|
|
|
.style({"text-anchor": "middle", "fill": "black"}) |
|
.attr("font-family", "sans-serif") |
|
.text(function(d) { |
|
return d.pham |
|
}) |
|
.attr("fill-opacity", 0) |
|
.transition().delay(3500).duration(1500) |
|
.attr("fill-opacity", 1); |
|
}); |
|
|
|
|
|
var group = svg.selectAll(".thousandticks") |
|
.data(tickMarks.thousand) |
|
.enter() |
|
.append("g"); |
|
group.append("rect") |
|
.style({"fill": "black"}) |
|
//.attr({x: 0, y: 100, width: "1px", height: 30}) |
|
.attr({x: function (d) { return d/10; }, y: 100, width: "1px", height: 30}) |
|
.attr({"fill-opacity": 0}) |
|
.transition().duration(1500) |
|
.attr({"fill-opacity": 1}); |
|
|
|
//.attr("transform", function (d) { return "translate(" + d/10 + ",0)"; }); |
|
group.append("text") |
|
.attr("x", function(d) {return (d/10) + 3;}) |
|
.attr("y", (90) + 22) |
|
.attr("font-family", "sans-serif") |
|
.attr("font-size", "14px") |
|
.attr("fill", "green") |
|
.style("text-anchor", "start") |
|
.text(function(d) { return d/1000; }) |
|
.attr({"fill-opacity": 0}) |
|
.transition().duration(1500) |
|
.attr({"fill-opacity": 1}); |
|
var group2 = svg.selectAll(".fivehundredticks") |
|
.data(tickMarks.fivehundred) |
|
.enter() |
|
.append("g"); |
|
group2.append("rect") |
|
.style({"fill": "black"}) |
|
.attr({x: function(d) {return d/10;}, y: 100, width: "1px", height: 15}) |
|
.attr({"fill-opacity": 0}) |
|
.transition().duration(1500) |
|
.attr({"fill-opacity": 1}); |
|
//.attr("transform", function (d) { return "translate(" + d/10 + ",0)"; }); |
|
var group3 = svg.selectAll(".onehundredticks") |
|
.data(tickMarks.onehundred) |
|
.enter() |
|
.append("g"); |
|
group3.append("rect") |
|
.style({"fill": "black"}) |
|
.attr({x: function (d) { return d/10; }, y: 115, width: "1px", height: 15}) |
|
.attr("fill-opacity", 0) |
|
.transition().duration(1500) |
|
.attr("fill-opacity", 1); |
|
//.attr("transform", function (d) { return "translate(" + d/10 + ",0)"; }); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
</script> |
|
</body> |