Last active
July 16, 2018 11:53
-
-
Save cako/2ddb8042296d8fbc24dc7ccf1afc4ede to your computer and use it in GitHub Desktop.
Hierarchical Edge Bundling for Courses
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
[{"name":"EASC08001","size":1,"title":"Earth Dynamics","color":"#1b9e77","imports":[]},{"name":"EASC08014","size":1,"title":"Earth Materials","color":"#1b9e77","imports":[]},{"name":"GESC08002","size":1,"title":"Earth Modelling and Prediction","color":"#9b58a5","imports":[]},{"name":"EASC08018","size":2,"title":"Earth Modelling and Prediction 2","color":"#1b9e77","imports":["GESC08002"]},{"name":"EASC08022","size":3,"title":"Earth Science Fundamentals for Geophysicists","color":"#1b9e77","imports":["EASC08001","EASC08008"]},{"name":"EASC08024","size":1,"title":"Environmental Geochemistry of the Earth's Surface","color":"#1b9e77","imports":[]},{"name":"EASC08023","size":1,"title":"Evolution of the Living Earth","color":"#1b9e77","imports":[]},{"name":"EASC08021","size":2,"title":"Geomaterials","color":"#1b9e77","imports":["EASC08001"]},{"name":"EASC08007","size":1,"title":"Global Environmental Processes","color":"#1b9e77","imports":[]},{"name":"EASC08020","size":2,"title":"Global Tectonics and the Rock Cycle","color":"#1b9e77","imports":["EASC08001"]},{"name":"EASC08008","size":1,"title":"Introduction to Geophysics","color":"#1b9e77","imports":[]},{"name":"EASC08017","size":2,"title":"Introduction to the Geological Record","color":"#1b9e77","imports":["EASC08001"]},{"name":"EASC08011","size":1,"title":"Natural Hazards","color":"#1b9e77","imports":[]},{"name":"EASC08004","size":1,"title":"Oceanography","color":"#1b9e77","imports":[]},{"name":"EASC08016","size":1,"title":"Physics of the Earth","color":"#1b9e77","imports":[]},{"name":"EASC09035","size":1,"title":"Computational Modelling for Geosciences","color":"#1b9e77","imports":[]},{"name":"EASC09019","size":4,"title":"Earth and Planetary Structure","color":"#1b9e77","imports":["EASC08001","EASC08008","EASC08016"]},{"name":"EASC09045","size":1,"title":"Environmental Techniques and Applications","color":"#1b9e77","imports":[]},{"name":"EASC09040","size":1,"title":"Exploration Geophysics","color":"#1b9e77","imports":[]},{"name":"EASC09036","size":1,"title":"Field Course in Tropical Marine and Terrestrial Geoscience","color":"#1b9e77","imports":[]},{"name":"EASC09032","size":1,"title":"Field Skills for Earth Surface Scientists","color":"#1b9e77","imports":[]},{"name":"EASC09031","size":3,"title":"Field Skills for Geologists","color":"#1b9e77","imports":["EASC08021","EASC08020"]},{"name":"EASC09051","size":1,"title":"Field Skills for Geology and Physical Geography","color":"#1b9e77","imports":[]},{"name":"EASC09033","size":1,"title":"Fields and Waves","color":"#1b9e77","imports":[]},{"name":"EASC09050","size":2,"title":"Geochemistry","color":"#1b9e77","imports":["EASC08021"]},{"name":"EASC09029","size":3,"title":"Geology 3rd Year Field Courses","color":"#1b9e77","imports":["EASC08020","EASC09002"]},{"name":"EASC09038","size":1,"title":"Geophysical Inverse Theory","color":"#1b9e77","imports":[]},{"name":"EASC09056","size":1,"title":"Global Environmental Change- Foundations","color":"#1b9e77","imports":[]},{"name":"EASC09027","size":1,"title":"Global Tectonics","color":"#1b9e77","imports":[]},{"name":"EASC09041","size":1,"title":"Helmsdale 3rd Year Field Excursion and Interpretation Exercise","color":"#1b9e77","imports":[]},{"name":"EASC09003","size":2,"title":"Hydrocarbons","color":"#1b9e77","imports":["EASC08001"]},{"name":"EASC09008","size":2,"title":"Igneous and Metamorphic Petrology","color":"#1b9e77","imports":["EASC08021"]},{"name":"EASC09021","size":5,"title":"Mathematical Methods for Geophysicists","color":"#1b9e77","imports":["EASC08001","EASC08022","EASC08008","EASC08016"]},{"name":"EASC09054","size":2,"title":"Mathematical and computational methods in Geophysics","color":"#1b9e77","imports":["EASC08016"]},{"name":"EASC09024","size":2,"title":"Measurement Techniques in Geophysics","color":"#1b9e77","imports":["EASC08008"]},{"name":"EASC09014","size":1,"title":"Metamorphic Petrology and Structure","color":"#1b9e77","imports":[]},{"name":"EASC09047","size":1,"title":"Quantitative Methods in Earth Sciences","color":"#1b9e77","imports":[]},{"name":"EASC09007","size":1,"title":"Quaternary Environmental Change","color":"#1b9e77","imports":[]},{"name":"EASC09053","size":1,"title":"Research Methods in Physical Geography (RMPG)","color":"#1b9e77","imports":[]},{"name":"EASC09055","size":1,"title":"Research Training for Geophysics","color":"#1b9e77","imports":[]},{"name":"EASC09037","size":2,"title":"Sedimentology","color":"#1b9e77","imports":["EASC08020"]},{"name":"EASC09042","size":2,"title":"Spain Fieldcourse: Mountain Building and Destruction","color":"#1b9e77","imports":["EASC08020"]},{"name":"EASC09052","size":2,"title":"Structural Analysis of Rocks and Regions (SARR)","color":"#1b9e77","imports":["EASC08020"]},{"name":"EASC09002","size":2,"title":"Structural Geology","color":"#1b9e77","imports":["EASC08020"]},{"name":"EASC10118","size":4,"title":"Advanced Volcanology","color":"#1b9e77","imports":["EASC08018","EASC08021","EASC09027"]},{"name":"EASC10073","size":1,"title":"Advances in Metamorphism","color":"#1b9e77","imports":[]},{"name":"EASC10072","size":1,"title":"Antarctica: Development of a Continent and its context in Rodian and Gondwana","color":"#1b9e77","imports":[]},{"name":"EASC10048","size":3,"title":"Applied Environmental Geochemistry","color":"#1b9e77","imports":["EASC08024","EASC09056"]},{"name":"EASC10101","size":1,"title":"Applied Hydrogeology and Near Surface Geophysics","color":"#1b9e77","imports":[]},{"name":"EASC10099","size":1,"title":"Aquatic Systems","color":"#1b9e77","imports":[]},{"name":"EASC10069","size":1,"title":"Cyprus Excursion and Synoptic Practical for Geology and Physical Geographers","color":"#1b9e77","imports":[]},{"name":"EASC10068","size":1,"title":"Cyprus Excursion and Synoptical Practical for Geologists","color":"#1b9e77","imports":[]},{"name":"EASC10043","size":1,"title":"Dissertation in Geology and Physical Geography","color":"#1b9e77","imports":[]},{"name":"EASC10097","size":1,"title":"Dynamic Stratigraphy","color":"#1b9e77","imports":[]},{"name":"EASC10084","size":1,"title":"Earth Surface Processes","color":"#1b9e77","imports":[]},{"name":"EASC10098","size":2,"title":"Earth's Atmospheric Composition","color":"#1b9e77","imports":["EASC08018"]},{"name":"EASC10102","size":2,"title":"Earth's Atmospheric Composition","color":"#1b9e77","imports":["EASC08018"]},{"name":"EASC10086","size":3,"title":"Environmental Geoscience 4th Year Field Course","color":"#1b9e77","imports":["EASC09036","EASC10103"]},{"name":"EASC10059","size":1,"title":"Environmental Geoscience Fieldwork and Synoptic Practical Examination","color":"#1b9e77","imports":[]},{"name":"EASC10009","size":1,"title":"Environmental Geosciences Projects","color":"#1b9e77","imports":[]},{"name":"EASC10049","size":1,"title":"Environmental Problems and Issues","color":"#1b9e77","imports":[]},{"name":"EASC10081","size":1,"title":"Evolution of the Modern Earth","color":"#1b9e77","imports":[]},{"name":"EASC10090","size":2,"title":"Evolution of the Modern Earth","color":"#1b9e77","imports":["EASC08020"]},{"name":"EASC10121","size":1,"title":"Evolution of the Modern Earth and Cyprus Excursion for Geologists","color":"#1b9e77","imports":[]},{"name":"EASC10120","size":1,"title":"Evolution of the Modern Earth and Cyprus Excursion for Geology and Physical Geography","color":"#1b9e77","imports":[]},{"name":"EASC10038","size":2,"title":"Exploration Seismology","color":"#1b9e77","imports":["EASC09040"]},{"name":"EASC10105","size":1,"title":"Field Skills for Geology","color":"#1b9e77","imports":[]},{"name":"EASC10080","size":3,"title":"Formation and Evolution of Continents","color":"#1b9e77","imports":["EASC09008","EASC09052"]},{"name":"EASC10070","size":1,"title":"Frontiers in Geophysics","color":"#1b9e77","imports":[]},{"name":"EASC10089","size":1,"title":"Frontiers in Research","color":"#1b9e77","imports":[]},{"name":"EASC10011","size":1,"title":"Geology Dissertation","color":"#1b9e77","imports":[]},{"name":"EASC10079","size":1,"title":"Geology and Landscapes","color":"#1b9e77","imports":[]},{"name":"EASC10036","size":2,"title":"Geomagnetism","color":"#1b9e77","imports":["EASC09021"]},{"name":"EASC10109","size":2,"title":"Geophysical Imaging and Inversion","color":"#1b9e77","imports":["EASC09054"]},{"name":"EASC10116","size":2,"title":"Geophysical Investigation of Earth Resources","color":"#1b9e77","imports":["EASC10110"]},{"name":"EASC10110","size":2,"title":"Geophysical Measurement and Modelling","color":"#1b9e77","imports":["EASC08016"]},{"name":"EASC10085","size":1,"title":"Geophysical Techniques for Terrestrial Environmental Applications","color":"#1b9e77","imports":[]},{"name":"EASC10111","size":2,"title":"Geophysics International Field Course","color":"#1b9e77","imports":["EASC09055"]},{"name":"EASC10122","size":1,"title":"Geophysics Professional Placement","color":"#1b9e77","imports":[]},{"name":"EASC10065","size":2,"title":"Geophysics Project","color":"#1b9e77","imports":["EASC09055"]},{"name":"EASC10052","size":2,"title":"Geophysics Project 1","color":"#1b9e77","imports":["EASC09055"]},{"name":"EASC10053","size":2,"title":"Geophysics Project 2","color":"#1b9e77","imports":["EASC09055"]},{"name":"EASC10058","size":1,"title":"Geoscience Outreach","color":"#1b9e77","imports":[]},{"name":"EASC10087","size":1,"title":"Geoscience Outreach and Engagement","color":"#1b9e77","imports":[]},{"name":"EASC10050","size":1,"title":"Global Environmental Change","color":"#1b9e77","imports":[]},{"name":"EASC10037","size":2,"title":"Global Geophysics","color":"#1b9e77","imports":["EASC09021"]},{"name":"EASC10015","size":1,"title":"Hydrocarbon Reservoir Quality","color":"#1b9e77","imports":[]},{"name":"EASC10093","size":1,"title":"Hydrocarbons and Geophysical Exploration","color":"#1b9e77","imports":[]},{"name":"EASC10082","size":1,"title":"Hydrogeology 1: Applied Hydrogeology","color":"#1b9e77","imports":[]},{"name":"EASC10077","size":3,"title":"Hydrogeology 2: Simulation of Groundwater Flow and Transport","color":"#1b9e77","imports":["EASC10101","EASC10082"]},{"name":"EASC10078","size":1,"title":"Hydrogeology 3: Field and Modelling Project","color":"#1b9e77","imports":[]},{"name":"EASC10095","size":2,"title":"Igneous Petrogenesis","color":"#1b9e77","imports":["EASC10107"]},{"name":"EASC10107","size":4,"title":"Igneous, Metamorphic and Ore Processes","color":"#1b9e77","imports":["EASC08001","EASC08021","EASC08020"]},{"name":"EASC10083","size":2,"title":"Marine Systems and Policies (UG)","color":"#1b9e77","imports":["EASC09036"]},{"name":"EASC10117","size":1,"title":"Natural Hazards and Risk","color":"#1b9e77","imports":[]},{"name":"EASC10119","size":1,"title":"Nuclear Waste Management: Principles, Policies and Practice","color":"#1b9e77","imports":[]},{"name":"EASC10094","size":1,"title":"Ore Mineralogy, Petrology and Geochemistry","color":"#1b9e77","imports":[]},{"name":"EASC10096","size":1,"title":"Palaeontology","color":"#1b9e77","imports":[]},{"name":"EASC10106","size":2,"title":"Palaeontology and Sedimentology","color":"#1b9e77","imports":["EASC08020"]},{"name":"EASC10108","size":3,"title":"Petroleum Systems","color":"#1b9e77","imports":["EASC08020","EASC08017"]},{"name":"EASC10112","size":4,"title":"Planetary Geochemistry","color":"#1b9e77","imports":["EASC08021","EASC10107","EASC10103"]},{"name":"EASC10115","size":1,"title":"Planetary Interiors","color":"#1b9e77","imports":[]},{"name":"EASC10103","size":5,"title":"Practical Geochemistry and Data Analysis","color":"#1b9e77","imports":["EASC08018","EASC08024","EASC08021","EASC08020"]},{"name":"EASC10035","size":3,"title":"Seismology","color":"#1b9e77","imports":["EASC08016","EASC09033"]},{"name":"EASC10021","size":1,"title":"Tectonic Geomorphology","color":"#1b9e77","imports":[]},{"name":"EASC10022","size":1,"title":"Topics in Global Environmental Change","color":"#1b9e77","imports":[]},{"name":"EASC10100","size":1,"title":"Topics in Palaeobiology and Evolution","color":"#1b9e77","imports":[]},{"name":"EASC10040","size":2,"title":"Transferable Skills for Geophysicists","color":"#1b9e77","imports":["EASC09024"]},{"name":"EASC10091","size":2,"title":"Volcanology","color":"#1b9e77","imports":["EASC08001"]},{"name":"METE10006","size":1,"title":"Atmospheric Science Field Skills","color":"#bba90b","imports":[]},{"name":"GESC10001","size":1,"title":"Self-Designed Learning (10 credits; SCQF level 10; GeoSciences)","color":"#9b58a5","imports":[]},{"name":"EASC11003","size":2,"title":"Controlled Source Electro-Magnetic (CSEM) Methods","color":"#1b9e77","imports":["EASC09033"]},{"name":"EASC11006","size":1,"title":"Geophysics Professional Placement","color":"#1b9e77","imports":[]},{"name":"EASC11001","size":1,"title":"Helmsdale MSc Field Excursion","color":"#1b9e77","imports":[]},{"name":"EASC11002","size":1,"title":"Hydrocarbon Reservoir Quality","color":"#1b9e77","imports":[]},{"name":"EASC11004","size":1,"title":"Hydrocarbons","color":"#1b9e77","imports":[]},{"name":"EASC11005","size":2,"title":"Scientific Computing Skills","color":"#1b9e77","imports":["EASC09035"]},{"name":"PGGE11193","size":1,"title":"Lake District Field Excursion MSc","color":"#666666","imports":[]}] |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<!DOCTYPE html> | |
<meta charset="utf-8"> | |
<style> | |
.node { | |
font: 300 12px "Helvetica Neue", Helvetica, Arial, sans-serif; | |
fill: #bbb; | |
} | |
.node:hover { | |
fill: #000; | |
} | |
.link { | |
stroke: steelblue; | |
stroke-opacity: 0.4; | |
stroke-width: 2px; | |
fill: none; | |
pointer-events: none; | |
} | |
.node:hover, | |
.node--source, | |
.node--target { | |
font-weight: 700; | |
} | |
.node--source { | |
fill: #2ca02c; | |
} | |
.node--target { | |
fill: #d62728; | |
} | |
.link--source, | |
.link--target { | |
stroke-opacity: 1; | |
stroke-width: 3px; | |
} | |
.link--source { | |
stroke: #d62728; | |
} | |
.link--target { | |
stroke: #2ca02c; | |
} | |
ul { | |
display: flex; | |
justify-content: center; | |
} | |
li { | |
font: 300 22px "Helvetica Neue", Helvetica, Arial, sans-serif; | |
display: block; | |
text-align: center; | |
padding: 16px; | |
} | |
</style> | |
<body> | |
<script src="https://d3js.org/d3.v4.min.js"></script> | |
<script> | |
if (screen.width > screen.height){ | |
var width = screen.width*0.988, | |
height = 1.8*screen.height; | |
} else { | |
var width = screen.height*0.988, | |
height = 1.8*screen.width; | |
} | |
var radius = Math.min(width, height) / Math.PI, | |
innerRadius = radius*Math.PI/5; | |
var cluster = d3.cluster() | |
.size([360, innerRadius]); | |
var line = d3.radialLine() | |
.curve(d3.curveBundle.beta(0.5)) | |
.radius(function(d) { return d.y; }) | |
.angle(function(d) { return d.x / 180 * Math.PI; }); | |
var svg = d3.select("body").append("svg") | |
.attr("width", width) | |
.attr("height", height) | |
.append("g") | |
.attr("transform", "translate(" + width/2 + "," + height/2.2 + ")"); | |
var link = svg.append("g").selectAll(".link"), | |
node = svg.append("g").selectAll(".node"); | |
d3.json("hierarchy.json", function(error, classes) { | |
if (error) throw error; | |
var root = packageHierarchy(classes) | |
.sum(function(d) { return d.size; }); | |
cluster(root); | |
link = link | |
.data(packageImports(root.leaves())) | |
.enter().append("path") | |
.each(function(d) { d.source = d[0], d.target = d[d.length - 1]; }) | |
.attr("class", "link") | |
.attr("d", line); | |
node = node | |
.data(root.leaves()) | |
.enter().append("text") | |
.attr("class", "node") | |
.style("fill", function(d) { return d.data.color; }) | |
.attr("dy", "0.31em") | |
.attr("transform", function(d) { return "rotate(" + (d.x - 90) + ")translate(" + (d.y + 8) + ",0)" + (d.x < 180 ? "" : "rotate(180)"); }) | |
.attr("text-anchor", function(d) { return d.x < 180 ? "start" : "end"; }) | |
.text(function(d) { return d.data.key; }) | |
.on("dblclick", function(d) { window.open('http://www.drps.ed.ac.uk/17-18/dpt/cx' + d.data.name.toLowerCase() + '.htm'); }) | |
.on("click", mouseovered) | |
//.on("mouseout", mouseouted); | |
}); | |
function mouseovered(d) { | |
node | |
.each(function(n) { n.target = n.source = false; }); | |
link | |
.classed("link--target", function(l) { if (l.target === d) return l.source.source = true; }) | |
.classed("link--source", function(l) { if (l.source === d) return l.target.target = true; }) | |
.filter(function(l) { return l.target === d || l.source === d; }) | |
.raise(); | |
node | |
.classed("node--target", function(n) { return n.target; }) | |
.classed("node--source", function(n) { return n.source; }) | |
.append("svg:title").text(function(n) { | |
var txt = n.data.name; | |
var i; | |
if (n.data.imports.length > 0) { | |
txt += "\nRequires: " | |
for (i=0; i < n.data.imports.length-1; i++){ | |
txt += n.data.imports[i] + ", "; | |
} | |
txt += n.data.imports[n.data.imports.length-1]; | |
} | |
txt +="\nRequired by: "+n.source; | |
return txt | |
}); | |
} | |
function mouseouted(d) { | |
link | |
.classed("link--target", false) | |
.classed("link--source", false); | |
node | |
.classed("node--target", false) | |
.classed("node--source", false); | |
} | |
// Lazily construct the package hierarchy from class names. | |
function packageHierarchy(classes) { | |
var names = []; | |
var colors = []; | |
var map = {}; | |
function find(name, data) { | |
var node = map[name], i; | |
if (!node) { | |
node = map[name] = data || {name: name, children: []}; | |
if (name.length) { | |
node.parent = find(name.substring(0, i = name.lastIndexOf("."))); | |
node.parent.children.push(node); | |
node.key = data.title;//name.substring(i + 1); | |
node.color = data.color; | |
names.push(data.name.slice(0, 4)); | |
colors.push(data.color); | |
} | |
} | |
return node; | |
} | |
classes.forEach(function(d) { | |
find(d.name, d); | |
}); | |
names_unique = names.reverse().filter(function (e, i, names) { | |
return names.indexOf(e, i+1) === -1; | |
}).reverse(); | |
colors_unique = colors.reverse().filter(function (e, i, colors) { | |
return colors.indexOf(e, i+1) === -1; | |
}).reverse(); | |
var ul = d3.select('body').insert('ul', ":first-child"); | |
ul.selectAll('li') | |
.data(names_unique) | |
.enter() | |
.append('li') | |
.html(String) | |
.style("color", function(d, i) { | |
return colors_unique[i]; | |
}); | |
return d3.hierarchy(map[""]); | |
} | |
// Return a list of imports for the given array of nodes. | |
function packageImports(nodes) { | |
var map = {}, | |
imports = []; | |
// Compute a map from name to node. | |
nodes.forEach(function(d) { | |
map[d.data.name] = d; | |
}); | |
// For each import, construct a link from the source to target node. | |
nodes.forEach(function(d) { | |
if (d.data.imports) d.data.imports.forEach(function(i) { | |
imports.push(map[d.data.name].path(map[i])); | |
}); | |
}); | |
return imports; | |
} | |
</script> |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment