diff --git a/assignment0.zip b/assignment0.zip new file mode 100644 index 0000000..e73bda2 Binary files /dev/null and b/assignment0.zip differ diff --git a/assignment0/assignment0.jpg b/assignment0/assignment0.jpg new file mode 100644 index 0000000..dd9f2e4 Binary files /dev/null and b/assignment0/assignment0.jpg differ diff --git a/assignment0/index.html b/assignment0/index.html index fdf44ea..a2d032e 100644 --- a/assignment0/index.html +++ b/assignment0/index.html @@ -10,15 +10,15 @@ // TODO: fill in the a's! var q1 = 'What would you like to get out of this course?' - var a1 = '' + var a1 = 'Learn how to visulize data so I can analyse data better.' var q2 = 'What are your research interests?' - var a2 = '' + var a2 = 'Protein folding' var q3 = 'What is your experience with web development?' - var a3 = '' + var a3 = 'I have very limited experience' var q4 = 'What is your experience with D3?' - var a4 = '' + var a4 = 'none' var q5 = 'Have you used visualization tools and libraries before, such as Tableau, matplotlib, ggplot2, etc..?' - var a5 = '' + var a5 = 'Tableau, but for a very short time' var qs_and_as = [{'statement_type':'question','value':q1},{'statement_type':'answer','value':a1}, {'statement_type':'question','value':q2},{'statement_type':'answer','value':a2}, {'statement_type':'question','value':q3},{'statement_type':'answer','value':a3}, diff --git a/assignment1.zip b/assignment1.zip new file mode 100644 index 0000000..b2177f6 Binary files /dev/null and b/assignment1.zip differ diff --git a/assignment1/README.md b/assignment1/README.md index 8ee728b..502e25b 100644 --- a/assignment1/README.md +++ b/assignment1/README.md @@ -30,5 +30,5 @@ Zip up the `assignment1` directory with `part1.html` and `part2.html` completed, ### Part 2 - 65% * 30%: correcty join data and assign element attributes for the background and `bar` data -* 10%: correcty join data and assign element attributes for the `box` data and `main_circles` data +* 15%: correcty join data and assign element attributes for the `box` data and `main_circles` data * 20%: correcty join data and assign attributes for the `eight_circles` data diff --git a/assignment1/part2.html b/assignment1/part2.html index e9db38c..cb18909 100644 --- a/assignment1/part2.html +++ b/assignment1/part2.html @@ -1,3 +1,4 @@ +<<<<<<< HEAD @@ -81,3 +82,68 @@ +======= + + + + + Assignment 1 - D3 Workout Pt. 2 + + + + + + + + +>>>>>>> ddccec34d0d8095392dc0a7fe23f1be3d23699a8 diff --git a/assignment2/.interactive_time_series.js.swp b/assignment2/.interactive_time_series.js.swp new file mode 100644 index 0000000..07ab9a3 Binary files /dev/null and b/assignment2/.interactive_time_series.js.swp differ diff --git a/assignment2/README.md b/assignment2/README.md new file mode 100644 index 0000000..cceff47 --- /dev/null +++ b/assignment2/README.md @@ -0,0 +1,126 @@ +# Assignment 2 + +In this assignment you will be combining all of your knowledge in D3 for interactively exploring multiple time series data that is hierarchically organized. The main javascript code that you will be starting from for this assignment can be found in [http://localhost:8000/assignment2/interactive_time_series.js](http://localhost:8000/assignment2/interactive_time_series.js), and the index is [http://localhost:8000/assignment2/index.html](http://localhost:8000/assignment2/index.html). + +## Data + +There are two time series datasets that you will be provided for experimentation. Both are formatted in the same exact way (minus date formats, which are accounted for). Your code should be able to visualize both with no modifications (other than switching the dataset, see `is_music_time_series` variable in index). + +### Population Counts in Japan + +This dataset contains a set of time series of population counts for the country of Japan. More specifically, each time series is categorized by the following hierarchy levels: + +* country (the root node: Japan) +* three of Japan's main island regions +* within each island, a number of prefectures (geographic regions) + +Thus, a single time series contains population counts for a particular prefecture, this prefecture belongs to a particular island, and the island belongs to Japan. + +[Click here to download this dataset](https://vanderbilt.box.com/s/y52ufqgx7ptxcb0zh0e84lya4b4l0jkw), and place it in the assignment2 directory. + +### Music Listening Counts from last.fm + +This dataset contains a set of time series of music tracks that are "scrobbled" (listened to) by the music community of the website last.fm. The tracks are broken down by genre, consisting of the following hierarchy levels: + +* all musical genres (the root node) +* five general musical genres +* within each genre, a set of more specific subgenres + +Thus, a single time series contains listening counts for a particular subgenre, this subgenre belongs to a particular genre, and the genre belongs to the root (all genres of music). + +[Click here to download this dataset](https://vanderbilt.box.com/s/ktixa1e5jn5avnig8vu1wk3vpu3822hf), and place it in the assignment2 directory. + +### Data Format + +Each dataset is hierarchically organized via JSON, and upon loaded through D3 it is an object with a tree data structure, with each node containing the following properties: + +* `counts`: this property only exists at the leaf nodes, and is an array that consists of objects containing properties: + * `date`: the date at which this count exists + * `count`: the count for this date +* `name`: the name of this node +* `children`: an array of nodes that are children of `this` node, empty for leaf nodes + +Furthermore, the dates are ordered, so there is no need to sort `counts`. + +### Aggregation + +Although we could simply visualize all of the time series at once, this will result in clutter, and will make it challenging to compare time series. Thus, you will first be responsible for **aggregating** the time series: namely, you will compute a time series for each non-leaf node that aggregates the time series of its children. The aggregated time series should be stored as an array in new property `counts` (similar to leaf nodes), where each entry in the array has the same structure as `counts` within the leaf nodes (an object containing properties `date` and `count`). You should be able to support two different types of aggregations: + +* mean +* sum + +Note that you are only to aggregate on `count`, `date` is identical across time series. + +We will then want to visualize this hierarchy. + +## Visual Encoding + +You will use line charts to visualize the time series data. In particular, you will visualize particular types of **node subsets** of the hierarchy, where each node in the hierarchy contains a time series. More specifically, a valid subset is one that: + +* **Covers all children**: all leaves in the tree can be reached by a path that originates in one of the nodes in the subset (a leaf node in the subset is considered to be already "reached"). +* **Excludes ancestors**: two nodes in which one is an ancestor of another cannot belong in the subset. + +For any subset that satisfies these conditions, you will plot all of their corresponding time series in one graph. To realize this, you will need: + +* `d3.scales` for the x and y axes, as well as `d3.line` to plot each time series. +* `d3.axis` to show the axes +* labels to show the axes - in particular, for each time series, you will place a text label on the right side of the graph, whose y-coordinate is assigned that of the time series' (mapped via scale) value at the last date, so that the text label is adjacent to the time series. + +Moreover, we will want to process any subset of nodes, which means that we must be able to match nodes when we perform data joins. Thus, **keys** should be used when performing data joins, and you may use the `name` property of each node for this purpose. + +Color has also been pre-defined for the nodes of the tree in the `color` property. You are to assign color, stored in the nodes, to the path elements, as well as the text elements. + +## Interactivity + +The time series are organized in this manner to enable interactivity. To this end, you will need to support the following operations: + +* **Expand**: when a user performs a `click` on a time series, it should be replaced by its **direct children**. That is, the current time series is removed, and its children time series are added. +* **Collapse**: when a user performs a `Shift+click` on a time series, it should be replaced by its **parent**. Specifically, the parent time series is added and any node that is a descendant of this parent is removed. + +You will need to do two main operations here: + +* For a given time series that the user clicked on, you must determine what nodes in the tree to visualize, depending on whether they expand or collapse. +* Given this array of nodes, perform the standard update pattern that we went over in class, to: remove time series that no longer exist, and add new time series. + +## Transitions + +You are also to ensure smooth animations when elements are added/removed via transitions. In particular, you will support the following: + +* Time series transitions: if we are **expanding**, then the clicked time series should immediately be removed, while the added time series' positions should begin at the clicked time series, and then animate to their respective locations. If we are **collapsing**, then all time series that are to be removed should animate to the clicked time series, and the clicked time series should only appear when this animation has finished. +* Text transitions: have the opacity decrease to 0 if the time series for a text label is being removed, and increase to 1 if it is a text label for a new time series. + +## Streamgraph (Graduate Students only) + +Although adding interactivity to visualizing multiple time series is useful, occlusion remains a problem, particularly for the music dataset. **Streamgraphs** address this problem by stacking time series graphs and using area to encode time series values. Namely, the length, in the y-coordinate, of a time series identified by a given color gives us its **relative** value. Note that in streamgraphs we cannot display absolute values anymore, a trade-off we take in reducing clutter. You should create a new file for this assignment, titled `interactive_streamgraph.js`, that will build off of your solution to `interactive_time_series.js`. + +There are several important choices to make regarding streamgraphs. Arguably most important is the **baseline** curve, the bottom curve that all other time series are stacked on top of. For this assignment you will use the approach of [ThemeRiver](http://www.ifs.tuwien.ac.at/~silvia/wien/vu-infovis/references/havre-ieeeinfovis00.pdf). The topic of baseline is eloquently discussed in the following paper by [Lee Byron and Martin Wattenberg](http://leebyron.com/streamgraph/stackedgraphs_byron_wattenberg.pdf). More specifically, you should implement the baseline outlined in Section 5.1 when discussing ThemeRiver, e.g. the sum of the time series, negated and scaled by 0.5. This will give a layout that is symmetric around the x-axis. + +All other considerations regarding streamgraphs: time series ordering, layer labeling, color, you need not worry about. Simply color the areas by the colors you used in the previous part of the assignment. Furthermore, you do not need to address transitions - updates will be instantaneous. But the user should still be able to click on an area to expand, and Shift+click on on area to collapse. Last, text labels need not be animated either, but should be positioned in the center of each time series' area (in the y-axis). + +Try out the two different aggregations: mean and sum. You should now see that it is much easier to perceive summations of time series compared to the above technique of visualizing individual time series, since in the latter we are not rescaling the axes. + +## Hand-in + +Zip up the `assignment2` directory with all html and javascript files, please exclude the data files when zipping, and submit it to Brightspace. + +## Grading + +* 10 points: hierarchical aggregation of time series +* 50 points: Visual Encoding + * 25 points: properly using data join: `enter` and `exit` selections for handling an arbitrary subset of nodes, and proper usage of keys + * 10 points: plot axes + * 10 points: text labels + * 5 points: color assigned to elements +* 30 points: Interactivity + * 10 points: determine nodes that to be expanded/collapsed + * 10 points: support expansion behavior in the data join + * 10 points: support collapse behavior in the data join +* 10 points: Transitions + * 8 points: path element transitions + * 2 points: text element transitions +* 30 points: Streamgraphs + * 10 points: computing a stacked representation of the count data + * 15 points: visualizing the stacked time series data in terms of area marks, colored by the time series' assigned colors. + * 5 points: text labels positioned properly + +Please note for graduate students: your grade is out of 130 points, but still counts as the same amount as any other assignment in its contribution towards your overall grade. diff --git a/assignment2/basictheme.css b/assignment2/basictheme.css new file mode 100644 index 0000000..f415e97 --- /dev/null +++ b/assignment2/basictheme.css @@ -0,0 +1,10 @@ +svg text { + cursor: default; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} +svg text::selection { + background: none; +} diff --git a/assignment2/index.html b/assignment2/index.html new file mode 100644 index 0000000..631346b --- /dev/null +++ b/assignment2/index.html @@ -0,0 +1,21 @@ + + + + + Assignment 2 - Plotting Time Series Data + + + + + + + + diff --git a/assignment2/interactive_time_series.js b/assignment2/interactive_time_series.js new file mode 100644 index 0000000..ef3bb6c --- /dev/null +++ b/assignment2/interactive_time_series.js @@ -0,0 +1,227 @@ +// NOTE: these global variables will be constructed in plot_it! +var x_scale, y_scale, line_scale; +var actual_width, actual_height; + +// data type conversions, so we are working with floats and dates +function data_type_conversion(node) { + if(node.children.length > 0) { + for(var c = 0; c < node.children.length; c++) + data_type_conversion(node.children[c]); + return; + } + + var time_parser = is_music_time_series ? d3.timeParse('%Y-%m-%d') : d3.timeParse('%Y %B'); + node.counts.forEach(function(d) { + d.date = time_parser(d.date); + d.count = +d.count; + }); +} + +// add a 'parent' field to each node, so we can access parent data +function add_parent_links(node) { + for(var c = 0; c < node.children.length; c++) { + node.children[c].parent = node; + add_parent_links(node.children[c]); + } +} + +// go through all nodes and collect count data +function get_all_count_data(node, all_count_data) { + for(var p = 0; p < node.counts.length; p++) + all_count_data.push(node.counts[p].count); + for(var c = 0; c < node.children.length; c++) + get_all_count_data(node.children[c], all_count_data); +} + +// create a color for each node based on the tree hierarchy (this is manually coded up: categorical colors for many categories is really tricky!) +function create_color(root_node) { + // black color for root + root_node.color = d3.rgb(0,0,0); + var hue_scale = d3.scaleLinear().domain([0,root_node.children.length-1]).range([10,250]) + for(var c = 0; c < root_node.children.length; c++) { + var child_node = root_node.children[c]; + var interpolator = d3.interpolateLab(d3.hsl(hue_scale(c),0.8,0.3), d3.hsl(hue_scale(c),0.8,0.8)) + child_node.color = interpolator(0.5); + for(var d = 0; d < child_node.children.length; d++) + child_node.children[d].color = interpolator(d / (child_node.children.length-1)); + } +} + +// TODO: create a time series for each non-leaf node (`counts`) that aggregates its count data and dates - same format as `counts` in leaves +function aggregate_counts(node) { + //console.log("node_name:" +node.name); + + if(node.children.length > 0) {//not leave node + node.counts = []; + var population =0; + var date_data = {count:population, date : ''}; + var c = 0; + var i = 0; + var k = 30; + var flag = true; + for(i=0; (flag == true) && (i< k);i++, population = 0){ + + for(c = 0; c < node.children.length; c++){ + + child_counts = aggregate_counts(node.children[c]); + //console.log("i: "+i +", definition:" +child_counts[i]); + //console.log(aggregate_counts(node.children[0])[0].date); + if(child_counts[i] == undefined){ + flag = false + //console.log('break'); + break; + } + date_child_counts = child_counts[i]; + //console.log("i: "+i + ", c:" + c); + population += date_child_counts.count; + date = date_child_counts.date; + date_data = {count: population, date:date } + + }//for loop (var c) + + if(flag != false){ + + node.counts.push(date_data); + + } + flag = true; + }//for loop (var i) + + }//if(node.children.length>0) + + if(node.name == 'Japan'){ + console.log(node); + } + return node.counts//, node.counts.date]; + + +} + +// TODO: create/set `view_series` field to false for `node` and all of its children +function reset_node_views(node) { + //console.log('reset'); + node.view_series = false; + if (node.children.length>0){ + + for(var i =0; i< node.children.length; i++){ + + reset_node_views(node.children[i]); + + } + + } + + if(node.name == 'Japan'){ + console.log(node); + } + +} + +// TODO: traverse tree, adding nodes where `view_series` is set to true to `node_array` +function collect_viewable_nodes(node, node_array) { +//console.log("collect"); + if(node.view_series == true){ + + node.children.push(node_array); + + } + if(node.children != undefined){ + + if (node.children.length>0){ + + for (var i =0; i< node.children.length; i++){ + + collect_viewable_nodes(node.children[i], node_array); + + } + } + + } + if(node.name == 'Japan'){ + console.log(node); + } + +} + +// TODO: make `node` no longer visible, but its immediate children visible (if a child, nothing to do) - modify `view_series`! +function expand_node_view(node) { + node.view_series = false; + if(node.children.length>0){ + for(var i = 0; i< node.children.length; i++){ + + node.children[i].view_series = true; + + } + } + +} + +// TODO: make the parent of `node` visible, but the subtree rooted at `node` should not be visible (hint `reset_node_views`) (if a parent, nothing to do) - modify `view_series`! +function collapse_node_view(node) { +} + +// TODO: does all of the visualization -> get the time series to view (`collect_viewable_nodes`), data join, setup interactions +function visualize_time_series(root_node, is_collapsing, selected_node) { + var node_array = []; + collect_viewable_nodes(root_node, node_array); + + // TODO: data join for line plot + //d3.select('rect').append('path').datum(root_node) + // .attr('d', d=>d) + // .attr('fill', 'none') + // .attr('stroke', '#777777') + // .attr('stroke-width', '3'); + // TODO: remove old series + + // TODO: add new series + + // TODO: setup interactions + + // TODO: data join for text + + // TODO: text labels - remove old ones (fade them out via opacity) + + // TODO: text labels - add new ones (fade them in via opacity) +} + +function plot_it() { + // some preprocessing + data_type_conversion(count_tree); + add_parent_links(count_tree); + count_tree.parent = null; + create_color(count_tree); + + // First things first: we aggregate the time series data: non-leaf nodes should aggregate their child nodes in some sense (e.g. mean) + aggregate_counts(count_tree); + + // Second: we initialize the nodes as to whether or not to visualize them - first, lets assume we aren't viewing any of them ... + reset_node_views(count_tree); + + // ... and then set the root node view to be true (have to view something to start!) + count_tree.view_series = true; + + // visualization setup: width, height, padding, actual width and height + var width = 800, height = 800; + var pad = 80; + actual_width = width-2*pad; + actual_height = height-2*pad; + // add svg element of width x height + d3.select('body').append('svg').attr('width', width).attr('height', height); + // add transformation element to center the main plotting area by pad, assign it an id since we will be primarily selecting it + d3.select('svg').append('g').attr('transform', 'translate('+pad+','+pad+')').attr('id', 'mainplot'); + // add element to have a nice backdrop for our plot! + d3.select('#mainplot').append('rect').attr('width', actual_width).attr('height', actual_height).attr('fill', '#999999').attr('opacity', 0.4) + + // TODO: setting up scales: we need to compute the minimum and maximum of our count data and dates; so first, lets get our count data from all nodes, then compute min/max + + // TODO: for the min/max of dates, they are equivalent across nodes, so just map the root node's dates to an array, compute min and max + + // TODO: compute the x and y scales for the line plots + + // TODO: setup the line scale + + // TODO: setup axes from the scales + + // visualize data! + visualize_time_series(count_tree, false); +} diff --git a/assignment2/japan_population.json b/assignment2/japan_population.json new file mode 100644 index 0000000..8475f07 --- /dev/null +++ b/assignment2/japan_population.json @@ -0,0 +1 @@ +{"name": "Japan", "children": [{"name": "Honshu", "children": [{"name": "Akita-ken", "counts": [{"count": "898537", "date": "1920 October"}, {"count": "936408", "date": "1925 October"}, {"count": "987706", "date": "1930 October"}, {"count": "1037744", "date": "1935 October"}, {"count": "1052275", "date": "1940 October"}, {"count": "1048769", "date": "1944 April"}, {"count": "1211871", "date": "1945 November"}, {"count": "1195813", "date": "1946 May"}, {"count": "1257398", "date": "1947 October"}, {"count": "1283710", "date": "1948 August"}, {"count": "1309031", "date": "1950 October"}, {"count": "1348871", "date": "1955 October"}, {"count": "1335580", "date": "1960 October"}, {"count": "1279835", "date": "1965 October"}, {"count": "1241376", "date": "1970 October"}, {"count": "1232481", "date": "1975 October"}, {"count": "1256745", "date": "1980 October"}, {"count": "1254032", "date": "1985 October"}, {"count": "1227478", "date": "1990 October"}, {"count": "1213667", "date": "1995 October"}, {"count": "1189279", "date": "2000 October"}, {"count": "1145501", "date": "2005 October"}, {"count": "1085997", "date": "2010 October"}, {"count": "1022839", "date": "2015 October"}], "children": []}, {"name": "Aomori-ken", "counts": [{"count": "756454", "date": "1920 October"}, {"count": "812977", "date": "1925 October"}, {"count": "879914", "date": "1930 October"}, {"count": "967129", "date": "1935 October"}, {"count": "1000509", "date": "1940 October"}, {"count": "1009104", "date": "1944 April"}, {"count": "1083250", "date": "1945 November"}, {"count": "1089232", "date": "1946 May"}, {"count": "1180245", "date": "1947 October"}, {"count": "1218325", "date": "1948 August"}, {"count": "1282867", "date": "1950 October"}, {"count": "1382523", "date": "1955 October"}, {"count": "1426606", "date": "1960 October"}, {"count": "1416591", "date": "1965 October"}, {"count": "1427520", "date": "1970 October"}, {"count": "1468646", "date": "1975 October"}, {"count": "1523907", "date": "1980 October"}, {"count": "1524448", "date": "1985 October"}, {"count": "1482873", "date": "1990 October"}, {"count": "1481663", "date": "1995 October"}, {"count": "1475728", "date": "2000 October"}, {"count": "1436657", "date": "2005 October"}, {"count": "1373339", "date": "2010 October"}, {"count": "1308649", "date": "2015 October"}], "children": []}, {"name": "Fukui-ken", "counts": [{"count": "599155", "date": "1920 October"}, {"count": "597899", "date": "1925 October"}, {"count": "618144", "date": "1930 October"}, {"count": "646659", "date": "1935 October"}, {"count": "643904", "date": "1940 October"}, {"count": "621933", "date": "1944 April"}, {"count": "724856", "date": "1945 November"}, {"count": "695703", "date": "1946 May"}, {"count": "726264", "date": "1947 October"}, {"count": "733374", "date": "1948 August"}, {"count": "752374", "date": "1950 October"}, {"count": "754055", "date": "1955 October"}, {"count": "752696", "date": "1960 October"}, {"count": "750557", "date": "1965 October"}, {"count": "744230", "date": "1970 October"}, {"count": "773599", "date": "1975 October"}, {"count": "794354", "date": "1980 October"}, {"count": "817633", "date": "1985 October"}, {"count": "823585", "date": "1990 October"}, {"count": "826996", "date": "1995 October"}, {"count": "828944", "date": "2000 October"}, {"count": "821592", "date": "2005 October"}, {"count": "806314", "date": "2010 October"}, {"count": "787099", "date": "2015 October"}], "children": []}, {"name": "Gunma-ken", "counts": [{"count": "1052610", "date": "1920 October"}, {"count": "1118858", "date": "1925 October"}, {"count": "1186080", "date": "1930 October"}, {"count": "1242453", "date": "1935 October"}, {"count": "1299027", "date": "1940 October"}, {"count": "1319517", "date": "1944 April"}, {"count": "1546081", "date": "1945 November"}, {"count": "1524635", "date": "1946 May"}, {"count": "1572787", "date": "1947 October"}, {"count": "1608894", "date": "1948 August"}, {"count": "1601380", "date": "1950 October"}, {"count": "1613549", "date": "1955 October"}, {"count": "1578476", "date": "1960 October"}, {"count": "1605584", "date": "1965 October"}, {"count": "1658909", "date": "1970 October"}, {"count": "1756480", "date": "1975 October"}, {"count": "1848562", "date": "1980 October"}, {"count": "1921259", "date": "1985 October"}, {"count": "1966265", "date": "1990 October"}, {"count": "2003540", "date": "1995 October"}, {"count": "2024852", "date": "2000 October"}, {"count": "2024135", "date": "2005 October"}, {"count": "2008068", "date": "2010 October"}, {"count": "1973476", "date": "2015 October"}], "children": []}, {"name": "Ibaraki-ken", "counts": [{"count": "1350400", "date": "1920 October"}, {"count": "1409092", "date": "1925 October"}, {"count": "1487097", "date": "1930 October"}, {"count": "1548991", "date": "1935 October"}, {"count": "1620000", "date": "1940 October"}, {"count": "1656678", "date": "1944 April"}, {"count": "1944344", "date": "1945 November"}, {"count": "1940833", "date": "1946 May"}, {"count": "2013735", "date": "1947 October"}, {"count": "2044578", "date": "1948 August"}, {"count": "2039418", "date": "1950 October"}, {"count": "2064037", "date": "1955 October"}, {"count": "2047024", "date": "1960 October"}, {"count": "2056154", "date": "1965 October"}, {"count": "2143551", "date": "1970 October"}, {"count": "2342198", "date": "1975 October"}, {"count": "2558007", "date": "1980 October"}, {"count": "2725005", "date": "1985 October"}, {"count": "2845382", "date": "1990 October"}, {"count": "2955530", "date": "1995 October"}, {"count": "2985676", "date": "2000 October"}, {"count": "2975167", "date": "2005 October"}, {"count": "2969770", "date": "2010 October"}, {"count": "2917857", "date": "2015 October"}], "children": []}]}, {"name": "Shikoku", "children": [{"name": "Ehime-ken", "counts": [{"count": "1046720", "date": "1920 October"}, {"count": "1096366", "date": "1925 October"}, {"count": "1142122", "date": "1930 October"}, {"count": "1164898", "date": "1935 October"}, {"count": "1178705", "date": "1940 October"}, {"count": "1186491", "date": "1944 April"}, {"count": "1361484", "date": "1945 November"}, {"count": "1380700", "date": "1946 May"}, {"count": "1453887", "date": "1947 October"}, {"count": "1481106", "date": "1948 August"}, {"count": "1521878", "date": "1950 October"}, {"count": "1540628", "date": "1955 October"}, {"count": "1500687", "date": "1960 October"}, {"count": "1446384", "date": "1965 October"}, {"count": "1418124", "date": "1970 October"}, {"count": "1465215", "date": "1975 October"}, {"count": "1506637", "date": "1980 October"}, {"count": "1529983", "date": "1985 October"}, {"count": "1515025", "date": "1990 October"}, {"count": "1506700", "date": "1995 October"}, {"count": "1493092", "date": "2000 October"}, {"count": "1467815", "date": "2005 October"}, {"count": "1431493", "date": "2010 October"}, {"count": "1385840", "date": "2015 October"}], "children": []}, {"name": "Kagawa-ken", "counts": [{"count": "677852", "date": "1920 October"}, {"count": "700308", "date": "1925 October"}, {"count": "732816", "date": "1930 October"}, {"count": "748656", "date": "1935 October"}, {"count": "730394", "date": "1940 October"}, {"count": "713134", "date": "1944 April"}, {"count": "863700", "date": "1945 November"}, {"count": "872312", "date": "1946 May"}, {"count": "917673", "date": "1947 October"}, {"count": "934123", "date": "1948 August"}, {"count": "946022", "date": "1950 October"}, {"count": "943823", "date": "1955 October"}, {"count": "918867", "date": "1960 October"}, {"count": "900845", "date": "1965 October"}, {"count": "907897", "date": "1970 October"}, {"count": "961292", "date": "1975 October"}, {"count": "999864", "date": "1980 October"}, {"count": "1022569", "date": "1985 October"}, {"count": "1023412", "date": "1990 October"}, {"count": "1027006", "date": "1995 October"}, {"count": "1022890", "date": "2000 October"}, {"count": "1012400", "date": "2005 October"}, {"count": "995842", "date": "2010 October"}, {"count": "976756", "date": "2015 October"}], "children": []}, {"name": "Kochi-ken", "counts": [{"count": "670895", "date": "1920 October"}, {"count": "687478", "date": "1925 October"}, {"count": "718152", "date": "1930 October"}, {"count": "714980", "date": "1935 October"}, {"count": "709286", "date": "1940 October"}, {"count": "693053", "date": "1944 April"}, {"count": "775578", "date": "1945 November"}, {"count": "797876", "date": "1946 May"}, {"count": "848337", "date": "1947 October"}, {"count": "866385", "date": "1948 August"}, {"count": "873874", "date": "1950 October"}, {"count": "882683", "date": "1955 October"}, {"count": "854595", "date": "1960 October"}, {"count": "812714", "date": "1965 October"}, {"count": "786882", "date": "1970 October"}, {"count": "808397", "date": "1975 October"}, {"count": "831275", "date": "1980 October"}, {"count": "839784", "date": "1985 October"}, {"count": "825034", "date": "1990 October"}, {"count": "816704", "date": "1995 October"}, {"count": "813949", "date": "2000 October"}, {"count": "796292", "date": "2005 October"}, {"count": "764456", "date": "2010 October"}, {"count": "728461", "date": "2015 October"}], "children": []}, {"name": "Tokushima-ken", "counts": [{"count": "670212", "date": "1920 October"}, {"count": "689814", "date": "1925 October"}, {"count": "716544", "date": "1930 October"}, {"count": "728748", "date": "1935 October"}, {"count": "718717", "date": "1940 October"}, {"count": "703260", "date": "1944 April"}, {"count": "835763", "date": "1945 November"}, {"count": "829405", "date": "1946 May"}, {"count": "854811", "date": "1947 October"}, {"count": "869290", "date": "1948 August"}, {"count": "878511", "date": "1950 October"}, {"count": "878109", "date": "1955 October"}, {"count": "847274", "date": "1960 October"}, {"count": "815115", "date": "1965 October"}, {"count": "791111", "date": "1970 October"}, {"count": "805166", "date": "1975 October"}, {"count": "825261", "date": "1980 October"}, {"count": "834889", "date": "1985 October"}, {"count": "831598", "date": "1990 October"}, {"count": "832427", "date": "1995 October"}, {"count": "824108", "date": "2000 October"}, {"count": "809950", "date": "2005 October"}, {"count": "785491", "date": "2010 October"}, {"count": "756063", "date": "2015 October"}], "children": []}]}, {"name": "Kyushu", "children": [{"name": "Kagoshima-ken", "counts": [{"count": "1415582", "date": "1920 October"}, {"count": "1472193", "date": "1925 October"}, {"count": "1556690", "date": "1930 October"}, {"count": "1591466", "date": "1935 October"}, {"count": "1589467", "date": "1940 October"}, {"count": "1594009", "date": "1944 April"}, {"count": "1538466", "date": "1945 November"}, {"count": "1629760", "date": "1946 May"}, {"count": "1746305", "date": "1947 October"}, {"count": "1766514", "date": "1948 August"}, {"count": "1804118", "date": "1950 October"}, {"count": "2044112", "date": "1955 October"}, {"count": "1963104", "date": "1960 October"}, {"count": "1853541", "date": "1965 October"}, {"count": "1729150", "date": "1970 October"}, {"count": "1723902", "date": "1975 October"}, {"count": "1784623", "date": "1980 October"}, {"count": "1819270", "date": "1985 October"}, {"count": "1797824", "date": "1990 October"}, {"count": "1794224", "date": "1995 October"}, {"count": "1786194", "date": "2000 October"}, {"count": "1753179", "date": "2005 October"}, {"count": "1706242", "date": "2010 October"}, {"count": "1648752", "date": "2015 October"}], "children": []}, {"name": "Kumamoto-ken", "counts": [{"count": "1233233", "date": "1920 October"}, {"count": "1296086", "date": "1925 October"}, {"count": "1353993", "date": "1930 October"}, {"count": "1387054", "date": "1935 October"}, {"count": "1368179", "date": "1940 October"}, {"count": "1371005", "date": "1944 April"}, {"count": "1556490", "date": "1945 November"}, {"count": "1631976", "date": "1946 May"}, {"count": "1765726", "date": "1947 October"}, {"count": "1786058", "date": "1948 August"}, {"count": "1827582", "date": "1950 October"}, {"count": "1895663", "date": "1955 October"}, {"count": "1856192", "date": "1960 October"}, {"count": "1770736", "date": "1965 October"}, {"count": "1700229", "date": "1970 October"}, {"count": "1715273", "date": "1975 October"}, {"count": "1790327", "date": "1980 October"}, {"count": "1837747", "date": "1985 October"}, {"count": "1840326", "date": "1990 October"}, {"count": "1859793", "date": "1995 October"}, {"count": "1859344", "date": "2000 October"}, {"count": "1842233", "date": "2005 October"}, {"count": "1817426", "date": "2010 October"}, {"count": "1786969", "date": "2015 October"}], "children": []}, {"name": "Miyazaki-ken", "counts": [{"count": "651097", "date": "1920 October"}, {"count": "691094", "date": "1925 October"}, {"count": "760467", "date": "1930 October"}, {"count": "824431", "date": "1935 October"}, {"count": "840357", "date": "1940 October"}, {"count": "839556", "date": "1944 April"}, {"count": "913687", "date": "1945 November"}, {"count": "957856", "date": "1946 May"}, {"count": "1025689", "date": "1947 October"}, {"count": "1052483", "date": "1948 August"}, {"count": "1091427", "date": "1950 October"}, {"count": "1139384", "date": "1955 October"}, {"count": "1134590", "date": "1960 October"}, {"count": "1080692", "date": "1965 October"}, {"count": "1051105", "date": "1970 October"}, {"count": "1085055", "date": "1975 October"}, {"count": "1151587", "date": "1980 October"}, {"count": "1175543", "date": "1985 October"}, {"count": "1168907", "date": "1990 October"}, {"count": "1175819", "date": "1995 October"}, {"count": "1170007", "date": "2000 October"}, {"count": "1153042", "date": "2005 October"}, {"count": "1135233", "date": "2010 October"}, {"count": "1104377", "date": "2015 October"}], "children": []}, {"name": "Nagasaki-ken", "counts": [{"count": "1136182", "date": "1920 October"}, {"count": "1163945", "date": "1925 October"}, {"count": "1233362", "date": "1930 October"}, {"count": "1296883", "date": "1935 October"}, {"count": "1370063", "date": "1940 October"}, {"count": "1490890", "date": "1944 April"}, {"count": "1318589", "date": "1945 November"}, {"count": "1417977", "date": "1946 May"}, {"count": "1531674", "date": "1947 October"}, {"count": "1565558", "date": "1948 August"}, {"count": "1645492", "date": "1950 October"}, {"count": "1747596", "date": "1955 October"}, {"count": "1760421", "date": "1960 October"}, {"count": "1641245", "date": "1965 October"}, {"count": "1570245", "date": "1970 October"}, {"count": "1571912", "date": "1975 October"}, {"count": "1590564", "date": "1980 October"}, {"count": "1593968", "date": "1985 October"}, {"count": "1562959", "date": "1990 October"}, {"count": "1544934", "date": "1995 October"}, {"count": "1516523", "date": "2000 October"}, {"count": "1478632", "date": "2005 October"}, {"count": "1426779", "date": "2010 October"}, {"count": "1377780", "date": "2015 October"}], "children": []}, {"name": "Oita-ken", "counts": [{"count": "860282", "date": "1920 October"}, {"count": "915136", "date": "1925 October"}, {"count": "945771", "date": "1930 October"}, {"count": "980458", "date": "1935 October"}, {"count": "972975", "date": "1940 October"}, {"count": "973707", "date": "1944 April"}, {"count": "1124513", "date": "1945 November"}, {"count": "1149501", "date": "1946 May"}, {"count": "1233651", "date": "1947 October"}, {"count": "1245689", "date": "1948 August"}, {"count": "1252999", "date": "1950 October"}, {"count": "1277199", "date": "1955 October"}, {"count": "1239655", "date": "1960 October"}, {"count": "1187480", "date": "1965 October"}, {"count": "1155566", "date": "1970 October"}, {"count": "1190314", "date": "1975 October"}, {"count": "1228913", "date": "1980 October"}, {"count": "1250214", "date": "1985 October"}, {"count": "1236942", "date": "1990 October"}, {"count": "1231306", "date": "1995 October"}, {"count": "1221140", "date": "2000 October"}, {"count": "1209571", "date": "2005 October"}, {"count": "1196529", "date": "2010 October"}, {"count": "1166729", "date": "2015 October"}], "children": []}, {"name": "Saga-ken", "counts": [{"count": "673895", "date": "1920 October"}, {"count": "684831", "date": "1925 October"}, {"count": "691565", "date": "1930 October"}, {"count": "686117", "date": "1935 October"}, {"count": "701517", "date": "1940 October"}, {"count": "705651", "date": "1944 April"}, {"count": "830431", "date": "1945 November"}, {"count": "856692", "date": "1946 May"}, {"count": "917797", "date": "1947 October"}, {"count": "931336", "date": "1948 August"}, {"count": "945082", "date": "1950 October"}, {"count": "973749", "date": "1955 October"}, {"count": "942874", "date": "1960 October"}, {"count": "871885", "date": "1965 October"}, {"count": "838468", "date": "1970 October"}, {"count": "837674", "date": "1975 October"}, {"count": "865574", "date": "1980 October"}, {"count": "880013", "date": "1985 October"}, {"count": "877851", "date": "1990 October"}, {"count": "884316", "date": "1995 October"}, {"count": "876654", "date": "2000 October"}, {"count": "866369", "date": "2005 October"}, {"count": "849788", "date": "2010 October"}, {"count": "833245", "date": "2015 October"}], "children": []}]}]}