Interactive Data Visualization

DATA 73200 | CUNY Graduate Center, Spring 2020
by Eva Sibinga

Project 1

Project 2

An image of the Project 1 page, a family tree.
This family tree approaches “exploratory viz” from a highly specific perspective. I expect it will be a useful or interesting exploratory tool mainly just for those who are in the subset of my family that's on this tree. One of my main goals in this project was to make a custom tree that didn’t just remake the default settings of sites like Ancestry, but rather one in which the design decisions and features reflect some of the questions I want to ask about and explore in a family.

One of these is an exploration of how names arrive on and disappear from the tree — it’s particularly relevant since the tree is called the Biddle Family Tree, and Biddle hasn’t been given as a last name in this family since 1906, when the last of five Biddle sisters was born. Their brother, who might have preserved the name, died at the age of 9. We don’t seem to want to forget that name, though — there are 17 people on the tree with the middle name Biddle!

Data is sourced from a GEDCOM file exported from a family tree maintained by one of my family members on Ancestry.com. GEDCOM is a powerful hierarchical format, but basically unusable as far as D3 is concerned, so I parsed the file in Python, using this GEDCOM parsing module, and used D3.stratify to turn the CSV back into a hierarchy.
An image of the Project 2 page, a clickable dartboard.
This darts-inspired project stems from my discovery a couple years ago that darts is actually an extremely entertaining TV spectacle. In a desire to make a beginner’s-guide to watching darts on TV, I created visualizations that explain how a dartboard is scored, as well as how the gameplay of a darts match proceeds. Along the way, we also learn about some of the top darts players, and view a bit of darts TV culture with some exciting darts moments.

Data are sourced from Darts Database and this Darts Info World checkout table. I cleaned the data by hand in Excel.

Click here to view Project 1 code, sketches, and mockups on Github, and here for the same materials for Project 2.

R e f l e c t i o n


Major design decisions:


I knew that I wanted my darts visualization to be driven by the dartboard itself, since the board is already a way of representing point values visually. Larger polygons correspond to fewer points available, and (as I discovered upon making a heat map) the black and red polygons are all worth more than the white and green polygons. It took me a while to reconstruct the dartboard in a data-driven way, and I suspect there’s probably a much more elegant way to do it, but in the end, constructing concentric annulus charts allowed me to create the exact graphic of a dartboard.

I took my color scheme from images of classic dartboards I found online and chose a font that has a nerdy/numerical/old school feeling. I ended up applying the font to my whole project, feeling that it works pretty universally for what I’m going for, but the initial impetus was a darts-compatible font.

After getting feedback from the class, I added a hover element that highlights each dartboard polygon on mouseover and changed the color of the text tooltip to red to make it more obvious what the click-event was. These changes, plus finally getting numbers to show up on the dartboard, definitely help to make the UI more intuitive.

Major challenges:


One of the most interesting, and lingering, questions for me was when an ideological challenge intersected with a technological challenge. Paradoxically, I found in Project 1 that creating my own tree gave me simultaneously more and fewer options when it came to customizing my visualization. My original goal was to get away from some of the rigid, gendered hierarchy that trees like those on the Ancestry website seem to rely on. Re: gender, I was definitely able to do that by not assigning colors or listing sex/gender on my site, essentially creating a genderless family tree.

When it came to the structure, however, it became clear that my dataset would have to stick rigidly to the parent-child format that D3.stratify requires. What ended up being most important about this family structure, data-wise, is not a male/female binary, but a direct descendant/partner binary. Ultimately, the only way to get the tree to work using D3.stratify/ D3.hierarchy and D3.tree was to make sure that each child node had only one parent node. That’s obviously not how human reproduction or families work. Of particular interest to me is that it fails to accurately represent human relationships if and when the tree is large enough to contain any degree of intermarriage within the extended family. In the case of this tree, there’s one instance of intermarriage between second cousins, and indeed the tree gets a bit weird there. The old-school paper solution to intermarriage on a family tree is to finagle the relevant branches next to each other and “graft” the tree back together. But D3.stratify demands that each branch remain separate, so there are 7 cloned people on this family tree. (I’m one of them!)

While it may not seem like a relevant problem to most, it begs the question -— like any other individual reality of human existence that ends up being called “messy data” —- of whose realities are worth taking the time to represent and whose are not. I’ve not faced adversity or had anyone doubt my humanity for my parents being second cousins. If I had, it might be much more important to me that I could make a tree that represented that truth without distorting it or forcing it to conform to someone else’s idea of what a family is allowed to be. One solution in this case would be to use a network structure, bringing me to the poetic conclusion is that with a wide enough scope, all families have to become networks rather than hierarchies. Another more broadly applicable solution is to acknowledge the limitations of any one visual form, appreciate the visualization for what it can show, and keep asking what or who is left un-visualized.

More time / resources:


With more time and resources, I would improve the code for my dartboard graphics. I just realized in the couple few days that I can create a unique ID for the path of each dartboard polygon, and/or assign the point value to the path directly. This seems like a way to shorten a lot of my code and make it less roundabout. I was able to make my dartboard checkout feature (the final chart) work with just a few lines of code to select based on this ID.

I’d also like to make more charts about the television aspect of the game – I think my initial scope was too large, and just creating the graphics to demonstrate how a dartboard works and is scored ended up taking a huge amount of work for me. I enjoyed the challenge, but did have to give up on some of the darts content I had planned to include here that gets at why televised darts can be a uniquely entertaining experience even for those who don’t enjoy watching sports (like more information about the players and their walk-on songs, for example).

I’m also really impressed by the scroll effects that other members of the class have used, and the extent to which that impacts the narrative flow of the page. Learning how to implement a CSS grid and digging into customizing my CSS ended up being plenty of new information for me on this go round, but I definitely look forward to trying out scroll effects in the future. Most of all, I’m excited to have the tools and setup to actually do that!