Skip to content

Instantly share code, notes, and snippets.

@stevenwmarks
Last active February 8, 2018 04:02
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save stevenwmarks/e920c8654846631311333567406bc4be to your computer and use it in GitHub Desktop.
Save stevenwmarks/e920c8654846631311333567406bc4be to your computer and use it in GitHub Desktop.
Family dendrogram
license: mit
scrolling: yes
height: 540
name parent birth
Pauline Peter Steven Marks null
Jack Charles Marks Pauline Peter Steven Marks 1915
Mavis Lillian Arnold Pauline Peter Steven Marks
William Charles Marks Jack Charles Marks 1878
Jessie Rowlinson Jack Charles Marks
Walter Arnold Mavis Lillian Arnold
Lillian Mary Fulcher Mavis Lillian Arnold
Henry Charles Marks William Charles Marks 1847
Elizabeth Ann Saveall William Charles Marks
William Rowlinson Jessie Rowlinson
Ellen Cornell Jessie Rowlinson
William Henry Arnold Walter Arnold
Eliza Sooby Walter Arnold
Frank Fulcher Lillian Mary Fulcher
Ada Louisa Walker Lillian Mary Fulcher
Benjamin Marks Henry Charles Marks 1819
Elizabeth Watts Henry Charles Marks
William Saveall Elizabeth Ann Saveall
Richard Rowlingson William Rowlinson
Elizabeth Cornwell William Rowlinson
Samuel Cornell 1826 Ellen Cornell
Elizabeth Coe Ellen Cornell
Mary Thomas William Henry Arnold
Edward Arnold William Henry Arnold
John Sooby Eliza Sooby
Caroline Elizabeth Newton Eliza Sooby
Henry Fulcher Frank Fulcher
Charlotte Childs Frank Fulcher
Joseph Ebenezer Walker Ada Louisa Walker
Mary Daycock Ada Louisa Walker
Edward Marks 1781 Benjamin Marks 1781
Rachel (?) Benjamin Marks
Richard Rollingson Richard Rowlingson
Martha Browne Richard Rowlingson
Samuel Cornell 1800 Samuel Cornell 1826
Ann Hammond Samuel Cornell 1826
John Arnold Edward Arnold
Ann Allard Edward Arnold
James Fulcher Henry Fulcher
Mary Little Henry Fulcher
John Walker Joseph Ebenezer Walker
Eliza Taylor Joseph Ebenezer Walker
Edward Marks 1742 Edward Marks 1781 1742
Joan Parish Edward Marks 1781
Richard Rollinson Richard Rollingson
Hannah Smith Richard Rollingson
Daniel Cornell Samuel Cornell 1800
Mary Mansfield Samuel Cornell 1800
Thomas Marks Edward Marks 1742 1702
Joane Higgins Edward Marks 1742
Samuel Cornell 1740 Daniel Cornell
Mary Filney Daniel Cornell
Edward Marks 1673 Thomas Marks 1673
Jane Brain Thomas Marks
John Cornell Samuel Cornell 1740
Ann Gowers Samuel Cornell 1740
John Markes Edward Marks 1673 1647
Lucretia Mitchell Edward Marks 1673
<!DOCTYPE html>
<head>
<meta charset="utf-8">
<title>Family lines dendrogram</title>
<script src="https://d3js.org/d3.v4.min.js"></script>
<style>
body { margin:0;position:fixed;top:0;right:0;bottom:0;left:0; }
.node circle {
fill: #fff;
stroke: black;
stroke-width: 1px;
}
.node text { font: 9px sans-serif; }
.node--internal text {
text-shadow: 0 1px 0 #fff, 0 -1px 0 #fff, 1px 0 0 #fff, -1px 0 0 #fff;
}
.link {
fill: none;
stroke: #ccc;
stroke-width: 2px;
}
</style>
</head>
<body>
<script>
// width, height, margins and padding
var margin = {top: 10, right: 80, bottom: 10, left: 140},
padding = {top: 10, right: 10, bottom: 10, left: 10},
width = 960 - margin.left - margin.right,
height = 540 - margin.top - margin.bottom;
// declare tree layout and size
var famLine = d3.tree()
.size([height, width]);
// load data
d3.csv("famLines.csv", function(error, flatData) {
if (error) throw error;
// assign null
flatData.forEach(function(d) {
if (d.parent == "null") { d.parent = null};
});
// assign different color to nodes at different depths
var depthScale = d3.scaleOrdinal()  
.range(d3.schemeCategory10);
// convert flat data into a hierarchy
var famData = d3.stratify()
.id(function(d) { return d.name; })
.parentId(function(d) { return d.parent; })
(flatData);
// assign name to each node
famData.each(function(d) {
d.name = d.id;
});
// assign data to hierarchy using parent-child relationships
var nodes = d3.hierarchy(famData, function(d) {
return d.children;
});
// map data to famLine
nodes = famLine(nodes);
// append svg to body
var svg = d3.select("body").append("svg")
.attr("width", width + margin.left + margin.right)
.attr("height", height + margin.top + margin.bottom),
g = svg.append("g")
.attr("transform", "translate (" + margin.left + "," + margin.top + ")");
// add links between nodes
var link = g.selectAll(".link")
.data(nodes.descendants().slice(1))
.enter().append("path")
.attr("class", "link")
.attr("d", function(d) {
return "M" + d.y + "," + d.x
+ "C" + (d.y + d.parent.y) / 2 + "," + d.x
+ " " + (d.y + d.parent.y) / 2 + "," + d.parent.x
+ " " + d.parent.y + "," + d.parent.x;
});
// add each node as a group
var node = g.selectAll(".node")
.data(nodes.descendants())
.enter().append("g")
.attr("class", function(d) {
return "node" +
(d.children ? " node--internal" : " node--leaf");})
.attr("transform", function(d) {
return "translate(" + d.y + "," + d.x + ")";});
// add circle to node
node.append("circle")
.attr("r", 7)
.style("fill", function(d) { return depthScale(d.depth); });
// add text to node
node.append("text")
.attr("dy", ".35em")
.attr("x", function(d) { return d.children ? -13 : 13; })
.style("text-anchor", function(d) {
return d.children ? "end" : "start";})
.text(function(d) { return d.data.name; });
}); // end load data
</script>
</body>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment