My last post talked about making over this visualisation from The Guardian:
What I haven’t explained is how I found the data. That is what I intend to outline in this post. Learning these skills is very useful if you need to find data for re-visualising data visualisations / tables found online.
The first step with trying to download data for any visualisation online is by looking checking how it is made, it may simply be a graphic (in which case it may be hard unless it is a chart you can unplot using WebPlotDigitiser) but in the case of interactive visualisations they are typically made with javascript unless they are using a bespoke product such as Tableau.
Assuming it is interactive then you can start to explore by using right-click on the image and choose Inspect (in Chrome, other browsers have similar developer tools).
I was treated with this view:
I don’t know much about coding but this looking like the view is being built by a series of paths. I wonder how it might be doing this? We can find out by digging deeper, let’s visit the Sources tab:
Our job on this tab is to look for anything unusual outside the typical javascript libraries (you learn these by being curious and looking at lots of sites). The first file gay-rights-united-states looks suspect but as can be seen from the image above it is empty.
Scrolling down, see below, we find there is an embedded file / folder (flat.html) and in that is something new all.js and main.js….
Investigating all.js reveals nothing much but main.js shows us something very interesting on line 8. JACKPOT! A google sheet containing the full dataset.
And we can start vizzing! (btw I transposed this for my visualisation to get a column per right).
Advanced Interrogation using Javascript
Now part way through my visualisation I realised I needed to show the text items the Guardian had on their site but these weren’t included in the dataset.
I decided to check the javascript code to see where this was created to see if I could decipher it, looking through main.js I found this snippet:
function populateHoverBox (type, position){ var overviewObj = { 'state' : stateData[position].state } ..... if(stateData[position]['marriage'] != ''){ overviewObj.marriage = 'key-marriage' overviewObj.marriagetext = 'Allows same-sex marriage.' } else if(stateData[position]['union'] != '' && stateData[position]['marriageban'] != ''){ overviewObj.marriage = 'key-marriage-ban' overviewObj.marriagetext = 'Allows civil unions; does not allow same-sex marriage.' } else if(stateData[position]['union'] != '' ){ overviewObj.marriage = 'key-union' overviewObj.marriagetext = 'Allows civil unions.' } else if(stateData[position]['dpartnership'] != '' && stateData[position]['marriageban'] != ''){ overviewObj.marriage = 'key-marriage-ban' overviewObj.marriagetext = 'Allows domestic partnerships; does not allow same-sex marriage.' } else if(stateData[position]['dpartnership'] != ''){ overviewObj.marriage = 'key-union' overviewObj.marriagetext = 'Allows domestic partnerships.' } else if (stateData[position]['marriageban'] != ''){ overviewObj.marriage = 'key-ban' overviewObj.marriagetext = 'Same-sex marriage is illegal or banned.' } else { overviewObj.marriagetext = 'No action taken.' overviewObj.marriage = 'key-none' }
…and it continued for another 100 odd lines of code. This wasn’t going to be as easy as I hoped. Any other options? Well what if I could extract the contents of the overviewObj. Could I write this out to a file?
I tried a “Watch” using the develop tools but the variable went out of scope each time I hovered, so that wouldn’t be useful. I’d therefore try saving the flat.html locally and try outputting a file with the contents to my local drive….
As I say I’m no coder (but perhaps more comfortable than some) and so I googled (and googled) and eventually stumbled on this post
http://stackoverflow.com/questions/16376161/javascript-set-file-in-download
I therefore added the function to my local main.js and added a line in the populateHoverBox function….okay so maybe I can code a tiny bit….
var str = JSON.stringify(overviewObj); download(str, stateData[position].state + '.txt', 'text/plain');
In theory this should serialise the overviewObj to a string (according to google!) and then download the resulting data to a file called <State>.txt
Now for the test…..
BOOM, BOOM and BOOM again!
Each file is a JSON file
Now to copy the files out from the downloads folder, remove any duplicates, and combine using Alteryx.
As you can see using the wildcard input of the resulting json file and a transpose was simple.
Finally to combine with the google sheet (called “Extract” below) and the hexmap data (Sheet 1) in Tableau…..
Not the most straightforward data extract I’ve done but I thought it was useful blogging about so others could see that extracting data from visualisation online is possible.
You can see the resulting visualisation my previous post.
Conclusion
No one taught me this method, and I have never been taught how to code. The techniques described here are simply the result of continuous curiosity and exploration of how interactive tables and visualisations are built.
I have used similar techniques in other places to extract data visualisations, but no two methods are the same, nor can a generic tutorial be written. Simply have curiosity and patience and explore everything.