Skip to content

Instantly share code, notes, and snippets.

@vsapsai
Last active January 6, 2016 17:32
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 vsapsai/1a077210b31a1bbaad13 to your computer and use it in GitHub Desktop.
Save vsapsai/1a077210b31a1bbaad13 to your computer and use it in GitHub Desktop.
Dancing Percentage Streamgraph

Percentage streamgraphs are nice to show how percentage changes over time. But it is hard to notice nuanced trends for anything but the lowest layer. The idea to fix this is to allow to change what layer has even bottom. Click on graph or legend to see how it works.

As it turned out, this idea isn't new. Alan Dix has described this solution for histograms, you can find more information at http://www.meandeviation.com/dancing-histograms/

The problem

A stacked histogram allows three judgements: (i) the trends on the total height of the columns, (ii) the proportion of each category within each column and (iii) the trends in the lowest category. The trends, or even inter-column comparisons for any other category is very difficult as the blocks are at different heights.

The interactive stacked histogram solves this problem by allowing different trends to be analysed using the same dynamic graph. It is an example of a general princple of adding interactivity to existing paper visualisations.

For more information on this and related topics see Alan Dix's visualisation pages and general research topics.

Also see the paper describing this work: A. Dix and G. Ellis (1998). Starting Simple - adding value to static visualisation through simple interaction. http://www.comp.lancs.ac.uk/computing/users/dixa/papers/simple98/

This visualization is based on Dancing Histograms by Marc Hansen aka marcdhansen.

Data is provided by QuantHockey.com, specifically page http://www.quanthockey.com/TS/TS_PlayerNationalities.php

"Dancing percentage streamgraph" is not a real name. I doubt anybody uses it. I just combined names of other charts trying to describe this one.

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Dancing percentage streamgraph</title>
<style type="text/css">
text {
font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
}
.title {
font-size: 20px;
}
.legend-row {
font-size: 18px;
}
.axis {
font-size: 12px;
}
.axis path,
.axis line {
fill: none;
stroke: #000;
shape-rendering: crispEdges;
}
.line {
fill: none;
stroke: #AAA;
stroke-width: 1px;
stroke-dasharray: 5,2;
stroke-linejoin: round;
stroke-linecap: round;
}
</style>
</head>
<body>
<script src="http://d3js.org/d3.v3.min.js"></script>
<script>
var margin = {top: 30, right: 30, bottom: 40, left: 50},
width = 960 - margin.left - margin.right,
height = 500 - margin.top - margin.bottom,
legendWidth = 150,
legendHeight = 200,
OTHER = "Other";
d3.csv("statistics.csv", ready)
.row(function(d) { return {year: +d.Year, nationality: d.Nationality, players: +d.Players}; });
function ready(error, data) {
if (error) throw error;
// Group data by years.
var dataByYears = d3.map();
data.forEach(function(d) {
if (!dataByYears.has(d.year)) {
dataByYears.set(d.year, {
countries: d3.map(),
totalPlayers: 0
});
}
if (dataByYears.get(d.year).countries.has(d.nationality)) {
throw new Error("Data error. Year " + d.year + " has 2 records for country " + d.nationality);
}
dataByYears.get(d.year).countries.set(d.nationality, { count: d.players }); // Later will store percentage.
dataByYears.get(d.year).totalPlayers += d.players;
});
// Calculate percentage for each year/nationality.
dataByYears.forEach(function(year, yearData) {
yearData.countries.forEach(function(country, countryRecord) {
countryRecord.percentage = countryRecord.count / yearData.totalPlayers;
});
});
// Find max percentage for each encountered nationality.
var maxNationalityPercentage = d3.map();
dataByYears.forEach(function(year, yearData) {
yearData.countries.forEach(function(country, countryRecord) {
var percentage = countryRecord.percentage;
if (!maxNationalityPercentage.has(country)
|| (percentage > maxNationalityPercentage.get(country).value)) {
maxNationalityPercentage.set(country, { value: percentage, year: year });
}
});
});
// Convert the dictionary into array to display in table and to arrange countries.
var maxNationalityPercentageArray = [];
maxNationalityPercentage.forEach(function(country, record) {
maxNationalityPercentageArray.push({
country: country,
value: record.value,
year: record.year
});
});
maxNationalityPercentageArray.sort(function(country1, country2) {
return country2.value - country1.value;
});
// For investigating.
//showCountryMaxPercentageParticipation(maxNationalityPercentageArray);
// Select what countries to show separately, what to group into Other.
var countriesToShow = [];
maxNationalityPercentageArray.forEach(function(record) {
if (record.value >= 0.05) {
countriesToShow.push(record.country);
}
});
var actualCountriesSet = d3.set(countriesToShow);
countriesToShow.push(OTHER);
// Get all years because cannot use years range because of skipped 2004-2005 season
// https://en.wikipedia.org/wiki/2004%E2%80%9305_NHL_season
var years = dataByYears.keys();
years.sort();
var layersData = d3.map();
countriesToShow.forEach(function(country) {
layersData.set(country, {
key: country,
values: []
});
});
// Populate each layer for each year.
years.forEach(function(year) {
var yearData = dataByYears.get(year);
var layerYearData = d3.map();
// Init year data.
countriesToShow.forEach(function(country) {
layerYearData.set(country, { year: year, value: 0.0 });
});
// Put data in appropriate layers.
yearData.countries.forEach(function(country, countryRecord) {
var layerToIncrement = actualCountriesSet.has(country) ? country : OTHER;
layerYearData.get(layerToIncrement).value += countryRecord.percentage;
});
// Collect year data into layersData.
layerYearData.forEach(function(country, countryLayerData) {
layersData.get(country).values.push(countryLayerData);
});
});
// Convert layer data into array in correct order.
var graphData = [];
countriesToShow.forEach(function(country) {
graphData.push(layersData.get(country));
});
var colorScale = d3.scale.category10();
var stack = d3.layout.stack()
.values(function(d) { return d.values; })
.x(function(d) { return d.year; })
.y(function(d) { return d.value; })
.offset(function(data, baselineLayer) {
var j = -1,
i = 0,
m = data[0].length,
y0 = [];
while (++j < m) {
var offset = 0;
for (i = 0; i < baselineLayer; i++) {
offset += data[i][j][1];
}
y0[j] = -offset;
}
return y0;
});
var stackedData = stack(graphData, 0);
var xScale = d3.scale.ordinal()
.domain(years)
.rangePoints([0, width - legendWidth - 20], 0);
var yScale = d3.scale.linear()
.domain([0.0, 1.0])
.range([height/2, 0]); // Make the range so that smallest values are at the bottom.
// Make yAxisScale twice as bigger to cover negative values.
var yAxisScale = d3.scale.linear()
.domain([-1.0, 1.0])
.range([height, 0]);
var area = d3.svg.area()
.x(function(d) { return xScale(d.year); })
.y0(function(d) { return yScale(d.y0); })
.y1(function(d) { return yScale(d.y0 + d.value); });
var svg = d3.select("body").append("svg")
.attr("width", width + margin.left + margin.right)
.attr("height", height + margin.top + margin.bottom)
.append("g")
.attr("transform", "translate(" + margin.left + ", " + margin.top + ")");
var graphGroup = svg.append("g");
var updateGraph = function(baselineLayer, suppressAnimation) {
var graphPaths = graphGroup.selectAll("path")
.data(stack(graphData, baselineLayer));
graphPaths.enter().append("path");
graphPaths
.on("click", function(d, i) {
updateGraph(i);
});
graphPaths
.transition().duration(suppressAnimation ? 0 : 750)
.attr("d", function(d) { return area(d.values); })
.style("fill", function(d, i) { return colorScale(i); });
};
updateGraph(0, /*suppressAnimation =*/true);
// Axes.
var xAxis = d3.svg.axis()
.scale(xScale)
.orient("bottom")
.tickValues(yearTickValues(years))
svg.append("g")
.attr("class", "axis x-axis")
.attr("transform", "translate(0, " + height/2 + ")")
.call(xAxis);
var yAxis = d3.svg.axis()
.scale(yAxisScale)
.orient("left")
.tickFormat(d3.format(".0%"));
svg.append("g")
.attr("class", "axis y-axis")
.call(yAxis);
// Grid lines.
var yGridValues = yAxisScale.ticks(yAxis.ticks());
yGridValues = yGridValues.filter(function(d) { return (0 < d) && (d < 1.0); });
var gridData = [];
var xRange = xScale.range();
xRangeMin = xRange[0],
xRangeMax = xRange[xRange.length - 1];
yGridValues.forEach(function(yGridTick) {
gridData.push([
[xRangeMin, yAxisScale(yGridTick)],
[xRangeMax, yAxisScale(yGridTick)]
]);
});
svg.append("g").selectAll("path")
.data(gridData)
.enter().append("path")
.attr("class", "line")
.attr("d", d3.svg.line());
// Legend.
var legendYScale = d3.scale.linear()
.domain([0, countriesToShow.length])
.range([0, legendHeight]);
var legendGroup = svg.append("g")
.attr("transform", "translate(" + (width - legendWidth) + ", 0)");
var legendRows = legendGroup.selectAll(".legend-row")
.data(countriesToShow)
.enter().append("g")
.attr("class", "legend-row")
.attr("transform", function(d, i) { return "translate(0, " + legendYScale(i) + ")"; });
legendRows.append("rect")
.attr({x: 0, y: 0, width: 20, height: 20})
.style("fill", function(d, i) { return colorScale(i); });
legendRows.append("text")
.attr({x: 30, y: 17})
.text(function(d) { return d; });
legendRows.selectAll("rect")
.on("click", function(d, rectIndexInRow, rowIndex) {
updateGraph(rowIndex);
});
// Title.
svg.append("text")
.attr("x", (xRangeMax + xRangeMin) / 2)
.attr("y", -margin.top / 2)
.attr("text-anchor", "middle")
.attr("class", "title")
.text("NHL Players by Nationality");
}
// Helper function to investigate countries below which threshold should be put in Other category.
function showCountryMaxPercentageParticipation(maxNationalityPercentageArray) {
var table = d3.select("body").append("table");
var rows = table.selectAll("tr")
.data(maxNationalityPercentageArray)
.enter()
.append("tr");
rows.append("td").html(function(d) { return d.country; });
rows.append("td").html(function(d) { return d.value; });
rows.append("td").html(function(d) { return d.year; });
}
function yearTickValues(years) {
var result = [years[0]];
years.forEach(function(year) {
if (year % 10 == 0) {
result.push(year);
}
});
result.push(years[years.length - 1]);
return result;
}
</script>
</body>
</html>
#!/usr/bin/env python
import bs4
import csv
import urllib
if __name__ == "__main__":
#page = bs4.BeautifulSoup(urllib.urlopen("http://www.quanthockey.com/TS/TS_PlayerNationalities.php"), "html.parser")
#page = bs4.BeautifulSoup(urllib.urlopen("http://www.quanthockey.com/nhl/nationality-totals/nhl-players-1917-18-stats.html"), "html.parser")
start_year = 1917
end_year = 2015
with open("statistics.csv", "w") as csvfile:
writer = csv.writer(csvfile)
writer.writerow(["Year", "Nationality", "Players"])
for year in range(start_year, end_year+1):
if year == 2004:
# https://en.wikipedia.org/wiki/2004%E2%80%9305_NHL_season
continue
page_address = "http://www.quanthockey.com/nhl/nationality-totals/nhl-players-{:04d}-{:02d}-stats.html".format(year, (year + 1) % 100)
page = bs4.BeautifulSoup(urllib.urlopen(page_address), "html.parser")
statistics_table = page.find(id="statistics")
rows = statistics_table.find_all("tr")
for row in rows[1:]:
cells = row.find_all("td")
nationality = cells[2].get_text()
players = int(cells[3].get_text())
writer.writerow([year, nationality, players])
Year Nationality Players
1917 Canada 40
1917 England 2
1917 United States 3
1918 Canada 34
1918 England 1
1918 United States 1
1919 Canada 44
1919 United States 3
1919 Scotland 1
1920 Canada 44
1920 United States 3
1920 Scotland 1
1921 Canada 44
1921 United States 2
1921 Scotland 1
1922 Canada 40
1922 United States 3
1922 Scotland 1
1923 Canada 50
1923 United States 3
1923 Scotland 1
1924 Canada 76
1924 United States 5
1924 Scotland 1
1924 England 1
1925 Canada 96
1925 United States 8
1925 Scotland 1
1925 England 1
1926 Canada 138
1926 United States 5
1926 Scotland 2
1926 England 1
1926 Finland 1
1927 Canada 140
1927 Scotland 2
1927 United States 3
1927 England 1
1927 Russia 1
1928 Canada 133
1928 United States 6
1928 Scotland 3
1928 England 2
1928 Russia 2
1929 Canada 147
1929 United States 7
1929 Russia 1
1929 England 2
1929 Scotland 2
1930 Canada 164
1930 United States 11
1930 Russia 1
1930 England 3
1930 Poland 1
1930 Scotland 3
1931 Canada 131
1931 United States 11
1931 Russia 1
1931 England 4
1931 Scotland 2
1931 Poland 1
1932 Canada 151
1932 United States 10
1932 England 5
1932 Russia 1
1932 Sweden 1
1932 Ireland 1
1933 Canada 152
1933 United States 12
1933 England 5
1933 Russia 1
1933 Ireland 1
1933 Scotland 1
1933 Poland 1
1934 Canada 157
1934 United States 11
1934 Russia 2
1934 England 4
1934 Ireland 2
1934 Scotland 2
1935 Canada 148
1935 United States 11
1935 Russia 2
1935 England 3
1935 Poland 1
1935 Scotland 2
1935 Ireland 1
1936 Canada 150
1936 United States 16
1936 Russia 2
1936 England 2
1936 Scotland 2
1936 Poland 1
1936 Ireland 1
1937 Canada 141
1937 United States 15
1937 Russia 2
1937 England 2
1937 Scotland 1
1937 Poland 1
1937 Ireland 1
1938 Canada 135
1938 United States 10
1938 Russia 2
1938 Scotland 2
1938 England 3
1938 Poland 1
1939 Canada 134
1939 United States 10
1939 Russia 2
1939 Scotland 1
1939 England 2
1940 Canada 138
1940 Russia 2
1940 United States 7
1940 Scotland 2
1940 England 2
1941 Canada 147
1941 Scotland 3
1941 United States 8
1941 Russia 1
1942 Canada 131
1942 United States 5
1942 Russia 2
1943 Canada 133
1943 United States 14
1943 Scotland 3
1943 Russia 1
1944 Canada 115
1944 United States 10
1944 Russia 2
1945 Canada 133
1945 Scotland 2
1945 Russia 1
1945 United States 4
1946 Canada 140
1946 Scotland 2
1946 United States 4
1947 Canada 134
1947 United States 5
1947 Scotland 2
1947 Ireland 1
1947 Wales 1
1948 Canada 130
1948 Scotland 3
1948 United States 5
1948 Ireland 1
1948 Finland 1
1948 Wales 1
1949 Canada 154
1949 United States 4
1949 Scotland 2
1949 Ireland 1
1949 Finland 1
1949 Poland 1
1949 Wales 1
1950 Canada 153
1950 United States 3
1950 Scotland 2
1950 Ireland 1
1950 Finland 1
1950 Poland 1
1950 Wales 1
1951 Canada 143
1951 Ireland 2
1951 Scotland 3
1951 United States 3
1951 Wales 1
1951 Finland 1
1952 Canada 147
1952 Ireland 2
1952 United States 2
1952 Finland 1
1952 Scotland 2
1953 Canada 146
1953 United States 1
1953 Wales 1
1953 Ireland 2
1954 Canada 151
1954 United States 2
1954 Wales 1
1955 Canada 142
1955 Wales 1
1955 United States 1
1956 Canada 145
1956 United States 1
1956 Wales 1
1957 Canada 153
1957 Wales 1
1957 United States 4
1958 Canada 139
1958 United States 2
1958 Wales 1
1959 Canada 149
1959 United States 3
1959 Wales 1
1960 Canada 152
1960 United States 5
1960 Wales 1
1961 Canada 146
1961 United States 2
1961 Wales 1
1962 Canada 147
1962 United States 3
1962 Wales 1
1963 Canada 161
1963 United States 3
1963 Poland 1
1964 Canada 161
1964 United States 2
1964 Sweden 1
1964 Scotland 1
1964 England 1
1965 Canada 176
1965 United States 3
1965 England 1
1965 Poland 1
1965 Denmark 1
1966 Canada 171
1966 United States 3
1966 England 1
1966 Poland 1
1967 Canada 307
1967 United States 7
1967 England 1
1967 Poland 1
1967 Scotland 1
1967 Germany 1
1967 Denmark 1
1968 Canada 313
1968 England 3
1968 United States 7
1968 Germany 1
1968 Denmark 1
1968 Poland 1
1968 Lebanon 1
1969 Canada 305
1969 United States 8
1969 Germany 1
1969 England 3
1969 Sweden 1
1969 Poland 1
1969 Denmark 1
1969 Lebanon 1
1969 Czech Republic 1
1970 Canada 369
1970 United States 10
1970 England 3
1970 Germany 1
1970 Sweden 1
1970 Denmark 1
1970 Lebanon 1
1971 Canada 358
1971 United States 17
1971 Germany 1
1971 England 1
1971 Sweden 1
1971 Denmark 1
1972 Canada 379
1972 United States 19
1972 Sweden 3
1972 England 1
1972 Germany 1
1973 Canada 400
1973 United States 26
1973 Sweden 6
1973 England 1
1973 Germany 1
1973 France 1
1973 Italy 1
1973 Netherlands 2
1974 Canada 454
1974 United States 35
1974 Sweden 5
1974 England 1
1974 France 2
1974 Germany 1
1974 Netherlands 1
1974 Italy 1
1974 Scotland 1
1975 Canada 445
1975 United States 36
1975 Sweden 4
1975 England 1
1975 Germany 1
1975 Netherlands 1
1975 France 1
1975 Italy 1
1975 Scotland 1
1976 Canada 449
1976 United States 40
1976 Sweden 6
1976 England 1
1976 Germany 1
1976 Netherlands 2
1976 Finland 1
1976 Italy 2
1977 Canada 450
1977 United States 40
1977 Sweden 11
1977 Germany 1
1977 Netherlands 2
1977 Italy 3
1977 Czech Republic 1
1977 England 2
1977 Finland 1
1978 Canada 425
1978 United States 47
1978 Sweden 16
1978 Czech Republic 1
1978 Netherlands 2
1978 England 2
1978 Germany 1
1978 Italy 3
1978 Norway 1
1979 Canada 550
1979 United States 68
1979 Sweden 20
1979 Finland 5
1979 Czech Republic 2
1979 England 1
1979 Netherlands 2
1979 Germany 1
1979 Italy 3
1979 France 1
1979 Denmark 1
1980 Canada 523
1980 United States 75
1980 Sweden 22
1980 Finland 6
1980 Slovakia 2
1980 Czech Republic 4
1980 England 1
1980 Italy 2
1980 Netherlands 2
1980 Germany 1
1980 France 2
1981 Canada 547
1981 United States 74
1981 Sweden 27
1981 Finland 14
1981 Slovakia 3
1981 Czech Republic 5
1981 Italy 2
1981 England 1
1981 Netherlands 3
1981 Germany 2
1981 France 1
1982 Canada 542
1982 United States 67
1982 Sweden 25
1982 Finland 13
1982 Czech Republic 10
1982 Slovakia 4
1982 Netherlands 3
1982 England 1
1982 Italy 3
1982 France 1
1982 Russia 1
1982 Germany 1
1982 Austria 1
1983 Canada 546
1983 United States 86
1983 Sweden 27
1983 Finland 12
1983 Slovakia 4
1983 Czech Republic 6
1983 Netherlands 1
1983 Italy 5
1983 Austria 1
1983 Germany 1
1983 England 1
1984 Canada 512
1984 United States 93
1984 Sweden 30
1984 Finland 15
1984 Slovakia 4
1984 Czech Republic 9
1984 Netherlands 1
1984 Italy 4
1984 Germany 1
1984 Austria 2
1984 England 1
1985 Canada 524
1985 United States 98
1985 Sweden 30
1985 Finland 15
1985 Slovakia 5
1985 Czech Republic 6
1985 Netherlands 1
1985 Austria 2
1985 Italy 4
1985 Germany 1
1985 England 1
1986 Canada 523
1986 United States 102
1986 Sweden 21
1986 Finland 17
1986 Czech Republic 8
1986 Slovakia 4
1986 Germany 3
1986 Italy 3
1986 Austria 2
1987 Canada 565
1987 United States 114
1987 Sweden 24
1987 Finland 12
1987 Czech Republic 9
1987 Slovakia 3
1987 Germany 2
1987 Austria 4
1987 Italy 2
1987 Poland 1
1988 Canada 551
1988 United States 112
1988 Sweden 23
1988 Finland 18
1988 Czech Republic 11
1988 Slovakia 6
1988 Germany 2
1988 Poland 1
1988 Austria 4
1988 Italy 2
1988 Russia 1
1989 Canada 537
1989 United States 120
1989 Sweden 22
1989 Finland 16
1989 Czech Republic 11
1989 Russia 9
1989 Slovakia 2
1989 Germany 3
1989 Latvia 1
1989 Austria 1
1989 Poland 1
1989 Italy 1
1989 Jamaica 1
1990 Canada 542
1990 United States 123
1990 Sweden 17
1990 Czech Republic 19
1990 Russia 12
1990 Finland 11
1990 Slovakia 4
1990 Germany 2
1990 Ukraine 2
1990 Jamaica 1
1990 Poland 1
1990 Austria 2
1991 Canada 551
1991 United States 145
1991 Russia 22
1991 Sweden 18
1991 Czech Republic 21
1991 Finland 9
1991 Slovakia 5
1991 Ukraine 2
1991 Germany 2
1991 Switzerland 1
1991 France 1
1991 Jamaica 1
1991 Poland 1
1991 Latvia 1
1991 Austria 1
1991 Italy 1
1992 Canada 523
1992 United States 143
1992 Russia 43
1992 Czech Republic 25
1992 Sweden 24
1992 Finland 9
1992 Slovakia 5
1992 Ukraine 2
1992 Germany 3
1992 Latvia 4
1992 Switzerland 1
1992 France 1
1992 Austria 1
1992 Poland 1
1992 Jamaica 1
1992 Belarus 1
1993 Canada 568
1993 United States 153
1993 Russia 56
1993 Czech Republic 29
1993 Sweden 24
1993 Finland 10
1993 Slovakia 10
1993 Ukraine 3
1993 Latvia 6
1993 Germany 3
1993 Switzerland 1
1993 France 1
1993 Austria 1
1993 Poland 2
1993 Belarus 1
1993 Jamaica 1
1993 Italy 2
1994 Canada 507
1994 United States 148
1994 Russia 59
1994 Sweden 28
1994 Czech Republic 29
1994 Finland 11
1994 Slovakia 8
1994 Ukraine 3
1994 Germany 3
1994 Poland 1
1994 Latvia 3
1994 Switzerland 2
1994 England 1
1994 Belarus 1
1994 France 1
1994 Italy 1
1995 Canada 533
1995 United States 154
1995 Russia 56
1995 Sweden 35
1995 Czech Republic 35
1995 Finland 14
1995 Slovakia 10
1995 Ukraine 3
1995 Latvia 3
1995 Poland 1
1995 Germany 4
1995 Belarus 2
1995 Switzerland 1
1995 England 1
1995 Norway 1
1995 Italy 1
1995 France 1
1996 Canada 526
1996 United States 143
1996 Russia 55
1996 Sweden 36
1996 Czech Republic 38
1996 Finland 17
1996 Slovakia 8
1996 Latvia 3
1996 Ukraine 3
1996 Poland 2
1996 Belarus 2
1996 Germany 5
1996 Lithuania 1
1996 France 1
1996 Switzerland 2
1996 England 1
1996 Kazakhstan 1
1996 Norway 1
1996 Italy 1
1997 Canada 512
1997 United States 138
1997 Russia 52
1997 Sweden 39
1997 Czech Republic 39
1997 Finland 17
1997 Slovakia 13
1997 Latvia 4
1997 Belarus 2
1997 Ukraine 2
1997 Germany 6
1997 Lithuania 1
1997 Poland 3
1997 Switzerland 1
1997 France 1
1997 Norway 1
1997 Italy 2
1997 England 1
1997 Croatia 1
1998 Canada 548
1998 United States 146
1998 Russia 58
1998 Czech Republic 52
1998 Sweden 41
1998 Finland 17
1998 Slovakia 13
1998 Ukraine 1
1998 Latvia 7
1998 Poland 2
1998 Germany 6
1998 France 1
1998 Belarus 2
1998 Lithuania 1
1998 Switzerland 1
1998 England 1
1998 Italy 2
1999 Canada 528
1999 United States 149
1999 Russia 71
1999 Czech Republic 56
1999 Sweden 46
1999 Slovakia 19
1999 Finland 26
1999 Latvia 7
1999 Poland 2
1999 Germany 6
1999 Belarus 2
1999 Lithuania 1
1999 Ukraine 3
1999 Kazakhstan 1
1999 Switzerland 1
1999 France 1
1999 Croatia 1
1999 England 1
2000 Canada 535
2000 United States 149
2000 Russia 72
2000 Czech Republic 71
2000 Sweden 47
2000 Slovakia 30
2000 Finland 34
2000 Latvia 7
2000 Germany 6
2000 Ukraine 3
2000 Poland 2
2000 Norway 2
2000 Switzerland 5
2000 Lithuania 1
2000 Belarus 2
2000 Kazakhstan 3
2000 France 1
2000 Italy 1
2000 Croatia 1
2000 Slovenia 1
2001 Canada 518
2001 United States 150
2001 Russia 63
2001 Czech Republic 77
2001 Sweden 52
2001 Slovakia 32
2001 Finland 42
2001 Latvia 6
2001 Germany 7
2001 Ukraine 4
2001 Poland 2
2001 Lithuania 1
2001 Norway 1
2001 Switzerland 2
2001 Belarus 1
2001 Kazakhstan 2
2001 France 1
2001 Italy 1
2001 Austria 1
2002 Canada 539
2002 United States 143
2002 Czech Republic 73
2002 Russia 62
2002 Sweden 58
2002 Slovakia 36
2002 Finland 38
2002 Latvia 5
2002 Germany 9
2002 Kazakhstan 2
2002 Ukraine 3
2002 Lithuania 1
2002 Poland 2
2002 Belarus 2
2002 Norway 1
2002 Switzerland 3
2002 France 1
2002 Austria 1
2003 Canada 549
2003 United States 164
2003 Czech Republic 74
2003 Russia 64
2003 Sweden 52
2003 Slovakia 38
2003 Finland 38
2003 Germany 8
2003 Ukraine 2
2003 Latvia 4
2003 Poland 2
2003 Belarus 2
2003 Kazakhstan 2
2003 Lithuania 1
2003 Austria 3
2003 Norway 2
2003 Switzerland 4
2003 France 1
2005 Canada 513
2005 United States 183
2005 Czech Republic 65
2005 Sweden 47
2005 Russia 49
2005 Slovakia 32
2005 Finland 39
2005 Germany 8
2005 Ukraine 2
2005 Lithuania 1
2005 Austria 3
2005 Kazakhstan 4
2005 Belarus 4
2005 Latvia 3
2005 Switzerland 4
2005 Poland 2
2005 France 1
2005 Norway 1
2006 Canada 492
2006 United States 188
2006 Czech Republic 65
2006 Russia 44
2006 Sweden 51
2006 Finland 42
2006 Slovakia 26
2006 Germany 7
2006 Austria 2
2006 Ukraine 2
2006 Slovenia 1
2006 Lithuania 1
2006 Belarus 4
2006 Kazakhstan 3
2006 Switzerland 5
2006 Latvia 4
2006 Norway 2
2006 Denmark 1
2006 France 1
2006 Japan 1
2007 Canada 486
2007 United States 209
2007 Czech Republic 59
2007 Sweden 54
2007 Russia 34
2007 Finland 40
2007 Slovakia 23
2007 Germany 9
2007 Belarus 5
2007 Slovenia 1
2007 Ukraine 2
2007 Switzerland 6
2007 Austria 2
2007 Kazakhstan 2
2007 Lithuania 1
2007 Latvia 3
2007 Norway 2
2007 Denmark 2
2007 France 1
2008 Canada 505
2008 United States 225
2008 Czech Republic 57
2008 Sweden 54
2008 Russia 36
2008 Finland 43
2008 Slovakia 18
2008 Belarus 4
2008 Germany 8
2008 Ukraine 2
2008 Denmark 4
2008 Austria 3
2008 Slovenia 1
2008 Switzerland 6
2008 Kazakhstan 1
2008 Lithuania 1
2008 Latvia 4
2008 Norway 1
2008 France 1
2009 Canada 520
2009 United States 213
2009 Sweden 54
2009 Czech Republic 48
2009 Russia 34
2009 Finland 38
2009 Slovakia 18
2009 Germany 8
2009 Belarus 4
2009 Denmark 6
2009 Slovenia 1
2009 Ukraine 2
2009 Kazakhstan 1
2009 Austria 3
2009 Switzerland 4
2009 Lithuania 1
2009 Latvia 5
2009 Norway 1
2009 France 1
2010 Canada 520
2010 United States 235
2010 Sweden 63
2010 Czech Republic 42
2010 Finland 30
2010 Russia 33
2010 Slovakia 14
2010 Belarus 4
2010 Germany 9
2010 Austria 3
2010 Denmark 6
2010 Slovenia 2
2010 Kazakhstan 1
2010 Ukraine 2
2010 Lithuania 1
2010 Norway 2
2010 Switzerland 6
2010 Latvia 4
2010 France 1
2011 Canada 527
2011 United States 235
2011 Sweden 68
2011 Czech Republic 43
2011 Russia 31
2011 Finland 29
2011 Slovakia 12
2011 Denmark 6
2011 Belarus 3
2011 Switzerland 8
2011 Germany 7
2011 Austria 3
2011 Slovenia 2
2011 Ukraine 2
2011 Lithuania 1
2011 Kazakhstan 1
2011 Latvia 3
2011 France 1
2011 Norway 1
2012 Canada 487
2012 United States 217
2012 Sweden 63
2012 Czech Republic 44
2012 Russia 29
2012 Finland 30
2012 Slovakia 12
2012 Denmark 8
2012 Switzerland 8
2012 Germany 8
2012 Austria 3
2012 Slovenia 2
2012 Belarus 2
2012 Ukraine 2
2012 Kazakhstan 1
2012 France 2
2012 Lithuania 1
2012 Norway 1
2012 Latvia 1
2013 Canada 513
2013 United States 238
2013 Sweden 78
2013 Czech Republic 37
2013 Russia 34
2013 Finland 32
2013 Slovakia 14
2013 Switzerland 11
2013 Denmark 8
2013 Austria 3
2013 Slovenia 1
2013 Germany 6
2013 Norway 1
2013 Belarus 2
2013 France 2
2013 Lithuania 1
2013 Latvia 2
2014 Canada 495
2014 United States 236
2014 Sweden 77
2014 Czech Republic 39
2014 Russia 35
2014 Finland 35
2014 Slovakia 13
2014 Switzerland 13
2014 Denmark 8
2014 Austria 3
2014 Germany 10
2014 Slovenia 1
2014 Norway 1
2014 Latvia 2
2014 France 2
2014 Belarus 2
2014 Lithuania 1
2014 Croatia 1
2015 Canada 402
2015 United States 194
2015 Sweden 75
2015 Russia 37
2015 Czech Republic 33
2015 Finland 34
2015 Denmark 6
2015 Slovakia 9
2015 Switzerland 12
2015 Germany 7
2015 Austria 3
2015 Norway 2
2015 Slovenia 1
2015 Belarus 1
2015 France 2
2015 Latvia 3
2015 Netherlands 1
2015 Lithuania 1
2015 Croatia 1
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment