Skip to content

Instantly share code, notes, and snippets.

@dgerber
Created July 5, 2012 13:20
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 dgerber/3053606 to your computer and use it in GitHub Desktop.
Save dgerber/3053606 to your computer and use it in GitHub Desktop.
Financial Secrecy Index 2011

The Financial Secrecy Index 2011 is a tool for understanding global financial secrecy, corruption and illicit financial flows. By ranking secrecy jurisdictions according to both their secrecy, and the scale of their activities, it allows a politically neutral ranking of the biggest players.

Non-self-governing jurisdictions according to the FAO geopolitical ontology.

var d3co = {};
(function(ns){
ns.axis = axis;
ns.axes = axes;
function axis() {
var scale = d3.scale.linear(),
orient = Math.PI/2, // default: "bottom"
tickAngle = Math.PI/2, // angle between axis and ticks (affects labels and legend too)
shift = 0, // translation along ticks
legend = null,
tickMajorSize = 6,
tickMinorSize = 6,
tickEndSize = 6,
tickPadding = 3,
tickArguments_ = [10],
tickValues = null,
tickFormat_,
tickSubdivide = 0;
function axis(g) {
g.each(function() {
var g = d3.select(this);
// Ticks, or domain values for ordinal scales.
var ticks = tickValues == null ? (scale.ticks ? scale.ticks.apply(scale, tickArguments_) : scale.domain()) : tickValues,
tickFormat = tickFormat_ == null ? (scale.tickFormat ? scale.tickFormat.apply(scale, tickArguments_) : String) : tickFormat_;
// Minor ticks.
var subticks = d3_svg_axisSubdivide(scale, ticks, tickSubdivide),
subtick = g.selectAll(".minor").data(subticks, String),
subtickEnter = subtick.enter().insert("line", "g").attr("class", "tick minor").style("opacity", 1e-6),
subtickExit = d3.transition(subtick.exit()).style("opacity", 1e-6).remove(),
subtickUpdate = d3.transition(subtick).style("opacity", 1);
// Major ticks.
var tick = g.selectAll("g").data(ticks, String),
tickEnter = tick.enter().insert("g", "path").style("opacity", 1e-6),
tickExit = d3.transition(tick.exit()).style("opacity", 1e-6).remove(),
tickUpdate = d3.transition(tick).style("opacity", 1),
tickTransform;
// Domain.
var range = d3_scaleRange(scale),
path = g.selectAll(".domain").data([0]),
pathEnter = path.enter().append("path").attr("class", "domain"),
pathUpdate = d3.transition(path);
// Geometry for ticks, labels, legend
var U = d3_svg_axisUnitVector(orient),
tickU = d3_svg_axisUnitVector(orient + tickAngle),
labelDist = Math.max(tickMajorSize, 0) + tickPadding,
m = ((tickAngle / (2*Math.PI)) % 1 + 1) % 1 < .5 ? -1: 1,
labelU = { x: (tickU.x+m*U.y)/2, y: (tickU.y-m*U.x)/2 };
var halfRange = (range[0] + range[1])/2,
orientDeg = orient * 180 / Math.PI,
legendDist = labelDist + 3*tickPadding,
leg = g.selectAll("g.axisLegend").data([legend]);
// Stash a snapshot of the new scale, and retrieve the old snapshot.
var scale1 = scale.copy(),
scale0 = this.__chart__ || scale1;
this.__chart__ = scale1;
// shift group
d3.transition(g).attr("transform", "translate("+shift*tickU.x+","+shift*tickU.y+")");
tickEnter.append("line").attr("class", "tick");
tickEnter.append("text");
subtickEnter.attr("x2", tickMinorSize * tickU.x).attr("y2", tickMinorSize * tickU.y);
subtickUpdate.attr("x2", tickMinorSize * tickU.x).attr("y2", tickMinorSize * tickU.y);
tickEnter.select("line").attr("x2", tickMajorSize * tickU.x).attr("y2", tickMajorSize * tickU.y);
tickEnter.select("text").attr("x", labelDist * labelU.x).attr("y", labelDist * labelU.y);
tickUpdate.select("line").attr("x2", tickMajorSize * tickU.x).attr("y2", tickMajorSize * tickU.y);
tickUpdate.select("text").text(tickFormat)
.attr("x", labelDist * labelU.x).attr("y", labelDist * labelU.y).attr("dy", (labelU.y + 1) * .35 + "em")
.attr("text-anchor", (Math.abs(labelU.y) > .5) ? "middle" : ((labelU.x > 0) ? "start": "end") );
pathUpdate.attr("d", " M " + (range[0]*U.x + tickEndSize*tickU.x) + " " + (range[0]*U.y + tickEndSize*tickU.y) + " L " + range[0]*U.x + " " + range[0]*U.y + " L " + range[1]*U.x + " " + range[1]*U.y + " " + (range[1]*U.x + tickEndSize*tickU.x) + " " + (range[1]*U.y + tickEndSize*tickU.y));
tickTransform = function(selection, scale) {
selection.attr("transform", function(d) { var r = scale(d); return "translate("+r*U.x+","+r*U.y+")"; });
};
// For quantitative scales:
// - enter new ticks from the old scale
// - exit old ticks to the new scale
if (scale.ticks) {
tickEnter.call(tickTransform, scale0);
tickUpdate.call(tickTransform, scale1);
tickExit.call(tickTransform, scale1);
subtickEnter.call(tickTransform, scale0);
subtickUpdate.call(tickTransform, scale1);
subtickExit.call(tickTransform, scale1);
}
// For ordinal scales:
// - any entering ticks are undefined in the old scale
// - any exiting ticks are undefined in the new scale
// Therefore, we only need to transition updating ticks.
else {
var dx = scale1.rangeBand() / 2, x = function(d) { return scale1(d) + dx; };
tickEnter.call(tickTransform, x);
tickUpdate.call(tickTransform, x);
}
leg.enter().append("g").attr("class", "axisLegend").append("text");
leg.attr("transform", "translate("+(halfRange*U.x + (m*U.y*legendDist))+","+(halfRange*U.y+(-m*U.x*legendDist))+")" + "rotate("+(orientDeg + (((orientDeg % 360)+360)%360 > 180 ? 90 : -90))+")")
.select("text").text(legend).attr("text-anchor", "middle").attr("dy", "0em");
});
}
axis.scale = function(x) {
if (!arguments.length) return scale;
scale = x;
return axis;
};
axis.orient = function(x) {
if (!arguments.length) return orient;
switch (x) {
case "bottom": orient = tickAngle = Math.PI/2; break;
case "top": orient = Math.PI/2; tickAngle = -Math.PI/2; break;
case "left": orient = Math.PI; tickAngle = Math.PI/2; break;
case "right": orient = Math.PI; tickAngle = -Math.PI/2; break;
default: orient = x;
}
return axis;
};
axis.orientVector = function(v) {
if (!arguments.length) return d3_svg_axisUnitVector(orient);
return axis.orient(Math.atan2(v.x,-v.y));
};
axis.tickAngle = function(x) {
if (!arguments.length) return tickAngle;
tickAngle = x;
return axis;
};
axis.ticks = function() {
if (!arguments.length) return tickArguments_;
tickArguments_ = arguments;
return axis;
};
axis.tickValues = function(x) {
if (!arguments.length) return tickValues;
tickValues = x;
return axis;
};
axis.tickFormat = function(x) {
if (!arguments.length) return tickFormat_;
tickFormat_ = x;
return axis;
};
axis.tickSize = function(x, y, z) {
if (!arguments.length) return tickMajorSize;
var n = arguments.length - 1;
tickMajorSize = +x;
tickMinorSize = n > 1 ? +y : tickMajorSize;
tickEndSize = n > 0 ? +arguments[n] : tickMajorSize;
return axis;
};
axis.tickPadding = function(x) {
if (!arguments.length) return tickPadding;
tickPadding = +x;
return axis;
};
axis.tickSubdivide = function(x) {
if (!arguments.length) return tickSubdivide;
tickSubdivide = +x;
return axis;
};
axis.shift = function(x) {
if (!arguments.length) return shift;
shift = x;
return axis;
};
axis.legend = function(x) {
if (!arguments.length) return legend;
legend = x;
return axis;
};
return axis;
};
function d3_svg_axisUnitVector(orient) {
var a = orient - Math.PI/2; // same as orient + d3_svg_arcOffset;
return { x: Math.cos(a), y: Math.sin(a) };
}
function d3_svg_axisSubdivide(scale, ticks, m) {
var subticks = [];
if (m && ticks.length > 1) {
var extent = d3_scaleExtent(scale.domain()),
i = -1,
n = ticks.length,
d = (ticks[1] - ticks[0]) / ++m,
j,
v;
while (++i < n) {
for (j = m; --j > 0;) {
if ((v = +ticks[i] - j * d) >= extent[0]) {
subticks.push(v);
}
}
}
for (--i, j = 0; ++j < m && (v = +ticks[i] + j * d) < extent[1];) {
subticks.push(v);
}
}
return subticks;
}
// copied from d3/scale/scale.js
function d3_scaleExtent(domain) {
var start = domain[0], stop = domain[domain.length - 1];
return start < stop ? [start, stop] : [stop, start];
}
function d3_scaleRange(scale) {
return scale.rangeExtent ? scale.rangeExtent() : d3_scaleExtent(scale.range());
}
function axes(){
var axis1 = ns.axis().orient('bottom'),
axis2 = ns.axis().orient('right');
function axes(selection){
selection.each(function (d, i) {
var g = d3.select(this),
a1 = g.selectAll('.axis.axis1').data([0]), a2 = g.selectAll('.axis.axis2').data([0]),
u1 = axis1.orientVector(), u2 = axis2.orientVector(),
angle = axis1.orient() - axis2.orient();
a1.enter().append('g').attr('class', 'axis1 axis');
a2.enter().append('g').attr('class', 'axis2 axis');
a1.call(axis1/*.tickAngle(-angle)*/);
a2.call(axis2/*.tickAngle(angle)*/);
});
return selection;
}
axes.axis1 = function(x){
if (!arguments.length) return axis1;
axis1 = x;
return axes;
};
axes.axis2 = function(x){
if (!arguments.length) return axis2;
axis2 = x;
return axes;
};
axes.translate = function(c1, c2){
var s1 = axis1.scale()(c1), s2 = axis2.scale()(c2),
u1 = axis1.orientVector(), u2 = axis2.orientVector();
return { x: s1*u1.x + s2*u2.x, y: s1*u1.y + s2*u2.y };
};
return axes;
}
})(d3co);
var g1 = d3.select('body')
.append('svg').attr('width', 500).attr('height', 500)
.append('g').attr('transform', 'translate(100,60)').attr('id', 'scatter'),
g2 = d3.select('body')
.append('svg').attr('width', 500).attr('height', 500)
.append('g').attr('transform', 'translate(100,60)').attr('id', 'graph'),
state = {},
data = {},
axes = d3co.axes();
d3.csv('kfsi2011.csv', function(countries){
var adminLinks = [],
byId = d3.nest().key(function(d){return d['Country_Alpha2'];}).rollup(function(d){return d[0];}).map(countries);
countries.forEach(function(r) {
if (r['Is Administered By']) adminLinks.push({source: byId[r['Is Administered By']], target: byId[r.Country_Alpha2]});
});
data.countries = countries;
data.countries.byId = byId;
data.adminLinks = adminLinks;
updateScatter();
});
function updateScatter(){
var g = d3.select('#scatter'),
x = function(d){return d['Global Scale Weight'];},
y = function(d){return d['Secrecy Score'];},
radius = 3,
title = function(d){return d['Country_Name'];},
legendX = 'Global Scale Weight',
legendY = 'Secrecy Score',
links = data.adminLinks,
linkTitle = function(l){return l.source.Country_Name + ' administers ' + l.target.Country_Name;},
group = function(d){ return d['Is Administered By'] || d['Country_Alpha2'];};
g.selectAll('g').data(['countries', 'administeredBy']).enter().append('g').attr('class', function(d){return d;});
axes.axis1().orient('bottom').shift(320)
.scale(d3.scale.log().range([0, 300]).domain(d3.extent(data.countries, x)))
.tickSize(6,3,0).tickPadding(8)
.legend('Global Scale Weight');
axes.axis2().orient('left').shift(20)
.scale(d3.scale.log().range([300, 0]).domain(d3.extent(data.countries, y)))
.ticks(6, d3.format(',.0f')).tickSize(6,3,0).tickPadding(8)
.legend('Secrecy Score');
// TODO: FSI axis
g.call(axes);
var lc = links.map(function(l){
return { s: axes.translate(x(l.source), y(l.source)), t: axes.translate(x(l.target), y(l.target)) };
});
var ll = g.select('g.administeredBy').selectAll('line').data(links);
ll.enter().append('line');
ll.attr('class', function(d){return 'group-'+group(d.source);})
.call(hoverable, function(d){ group(d.source); });
ll.attr('x1', function(d,i){return lc[i].s.x;}).attr('y1',function(d,i){return lc[i].s.y;})
.attr('x2', function(d,i){return lc[i].t.x;}).attr('y2',function(d,i){return lc[i].t.y;})
.attr('title', linkTitle);
ll.exit().remove();
var cc = g.select('g.countries').selectAll('g').data(data.countries),
ccnew = cc.enter()
.append('a').attr('xlink:href', getCountryURL).attr('xlink:show', 'new')
.append('g');
ccnew.attr('class', function(d){return 'country group-'+group(d);}).call(hoverable, group);
ccnew.append('title').text(title);
ccnew.append('circle');
ccnew.append('text').attr('text-anchor', 'middle').attr('dy', '.3em').text(function(d){return d.Country_Alpha2;});
cc.attr('transform', function(d) { var p = axes.translate(x(d), y(d)); return 'translate('+p.x+','+p.y+')'; })
.attr('r', radius);
cc.exit().remove();
}
// function updateGraph() {
// var g = d3.select('#graph');
// }
function getCountryURL(country){
var name = country.Country_Name;
if (name == 'US Virgin Islands') {
name = 'USA_VirginIslands';
} else {
name = name.replace(/\s\(/g, '_').replace(/(\s&?|\))/g, '');
}
return 'http://www.secrecyjurisdictions.com/PDF/' + name + '.pdf';
}
function hoverable(selection, accessor) {
selection
.on('mouseover', function(d){ d3.selectAll('.group-'+accessor(d)).classed('active', true); })
.on('mouseout', function(d){ d3.selectAll('.group-'+accessor(d)).classed('active', false); });
}
<!DOCTYPE html>
<html>
<head>
<link type="text/css" rel="stylesheet" href="style.css"/>
</head>
<body>
<script type="text/javascript" src="http://cdnjs.cloudflare.com/ajax/libs/d3/2.8.1/d3.v2.min.js"></script>
<script type="text/javascript" src="d3_components.js"></script>
<script type="text/javascript" src="fsi.js"></script>
</body>
</html>
Country_Alpha2 Country_Name KFSI2011-1-Banking-Secrecy KFSI2011-2-Trusts-Foundations-Register KFSI2011-3-Recorded-Company-Ownership KFSI2011-4-Public-Company-Ownership KFSI2011-5-Public-Company-Accounts KFSI2011-6-C-b-C-reporting KFSI2011-7-Fit-for-Information-exchange KFSI2011-8-Efficiency-Tax-Administration KFSI2011-9-Avoids-Promoting-Tax-Evasion KFSI2011-10-Harmful-legal-vehicles KFSI2011-11-Anti-Money-Laundering KFSI2011-12-Automatic-Info-Exchange KFSI2011-13-Bilateral-Treaties KFSI2011-14-Intl-Transparency-Commitments KFSI2011-15-International-Judicial-Cooperation Secrecy Score Global Scale Weight FSI Value RANK Is Administered By
CH Switzerland 0.57 0 0 0 0 0 0 0 0 0.5 0.61 0 0 0.8 0.79 78.2 0.0606833 1879.21580265664 1
KY Cayman Islands 0.5 0 0 0 0 0 0 0 0 0 0.68 1 0.12 0.2 0.93 77.13 0.0462181 1646.67297027292 2 GB
LU Luxembourg 0.4 0 0 0 1 0 0 0.4 1 0 0.35 0 0.08 0.8 0.72 68.33 0.1312117 1621.15715078501 3
HK Hong Kong 0.64 0 0 0.2 0 0.5 0 0 0 0.5 0.58 0 0 0.8 0.79 73.27 0.0423185 1370.74076868571 4
US USA 0.5 0 0 0 0 0.5 0 1 1 0 0.7 0 1 0.8 0.79 58.07 0.2079093 1160.05910432395 5
SG Singapore 0.56 0 0 0 0 0 0.5 0.2 0.2 0.5 0.69 0 0.07 0.8 0.86 70.8 0.0312592 1117.95861280138 6
JE Jersey 0.67 0 0 0.2 0 0 0 0 0 0 0.74 0 0.23 0.6 0.79 78.47 0.003742 750.145575768589 7
JP Japan 0.63 0 0 0 0 0 1 0.2 1 0.5 0.45 0 0.72 0.4 0.47 64.2 0.0180129 693.638137672901 8
DE Germany 0.7 0 0 0 1 0 0 0.2 0.6 0.5 0.53 1 0.65 0.6 0.65 57.13 0.0463449 669.771487264661 9
BH Bahrain 0.4 0 0 0.2 0 0 0 0 0 0.5 0.52 0 0.12 0.8 0.79 77.8 0.002757 660.314822614397 10
VG British Virgin Islands 0.6 0 0 0 0 0 0 0 0 0 0.67 0 0.12 0.4 1 81.4 0.0015035 617.885056758508 11 GB
BM Bermuda 0.63 0 0 0 0 0 0 0 0 0 0.43 0 0.15 0.2 0.79 85.33 0.0006561 539.877526533835 12 GB
GB United Kingdom 0.67 0 0 0 1 0 0.5 0.2 1 0.5 0.72 1 1 0.8 0.93 44.53 0.2001102 516.473243613764 13
PA Panama 0.66 0 0 0 0 0 0 0 0 0.5 0.67 0 0 0.8 0.86 76.73 0.0011373 471.542245895293 14
BE Belgium 0.83 0 0 0 1 0 0 0.2 0.3 0.5 0.76 1 0.02 0.8 0.72 59.13 0.0115379 467.160262559711 15
MH Marshall Islands 0.33 0 0 0 0 0 0 0 0 0.5 NA 0 0.02 0.4 NA 90.38 0.0002372 457.006004160375 16
AT Austria 0.47 0 0 0 1 0 0 0.2 1 0.5 0.54 0 0.08 0.8 0.53 65.87 0.0039949 453.487124694555 17
AE United Arab Emirates (Dubai) 0.63 0 0 0 0 0 0 0 0 0 0.43 0 0.75 0.8 0.53 79.07 0.0007031 439.583027435206 18
BS Bahamas 0.34 0 0 0 0 0 0 0 0 0 0.55 0 0.02 0.8 0.86 82.87 0.0004347 431.110463003793 19
CY Cyprus 0.4 0 0 0 0 0 0 0.8 0.6 0.5 0.71 1 0.68 0.8 0.86 57.67 0.0095209 406.514326245478 20
GG Guernsey 0.73 0 0 0 0 0 0 0 1 0 0.82 1 0.18 0.6 0.86 65.4 0.0029756 402.338347949182 21
LB Lebanon 0.47 0 0 0 0 0 0 0 0 0.5 0.45 0 0 0.6 0.65 82.2 0.0003661 397.327564874681 22
MO Macau 0.3 0 0 0 0 0 0 0 0 0.5 0.55 0 0 0.8 0.35 83.33 0.0003057 389.7947256902 23
CA Canada 0.63 0 0 0 0 0 1 1 0.4 0.5 0.51 0 1 0.8 0.72 56.27 0.0086798 366.156980651751 24
IN India 0.8 0 1 0 0 0 0 1 1 0.5 0.53 0 1 0.6 0.65 52.8 0.0127682 344.042155435571 25
UY Uruguay 0.47 0 0 0 0 0 0 0 0 0.5 0.65 0 0 0.8 0.86 78.13 0.0003343 331.003255450018 26
MY Malaysia (Labuan) 0.63 0 0 0 0 0 0 0.8 0 0 0.61 0 0 0.8 0.59 77.13 0.0003369 319.278982751668 27
KR Korea 0.7 0 0 0 0 0 1 1 1 0.5 0.42 0 1 0.6 0.72 53.73 0.0085506 317.187491185848 28
LR Liberia 0.17 0 0 0 0 0 0 0 1 0.5 NA 0 0 0.8 NA 81 0.000212 316.884023435527 29
BB Barbados 0.37 0 0 0 0 0 0 0 1 0 0.5 0 0.23 0.4 0.67 78.87 0.0001604 266.565317859074 30
IE Ireland 0.77 0 0 0 1 0 1 0.6 0.4 0.5 0.6 1 0.93 0.6 1 44 0.0298402 264.215691284505 31
MU Mauritius 0.3 0 0 0 0 0 0 0.2 1 0 0.48 0 0.48 0.8 0.65 73.93 0.0002712 261.552382453141 32
PH Philippines 0.6 0 0 0 0 0 0 0 1 0.5 0.42 0 0 0.8 0.66 73.47 0.0002625 253.925639833921 33
LI Liechtenstein 0.47 0 0 0 0 0 0 0 0 0.5 0.51 0 0.03 0.8 0.54 81 0.0000912 239.214042008226 34
IT Italy 0.77 0 0 0 0 0 0 1 1 0.5 0.63 1 1 0.8 1 48.67 0.0080645 231.193979679883 35
IM Isle of Man 0.77 0 0 0.2 0 0 0 0 1 0 0.66 1 0.23 0.6 0.8 64.93 0.0005964 230.417478744012 36
IL Israel 0.64 0 0 0.2 0 0 0 1 1 0.5 0.58 0 0.68 0.8 0.86 58.27 0.0015771 230.296920946423 37
TC Turks & Caicos Islands 0.27 0 0 0 0 0 0 0 0 0 0.34 0 0.02 0.2 0.61 90.4 0.000026 218.85832650838 38 GB
NL Netherlands 0.83 0 0 0 0 0 0.5 1 1 0.5 NA 1 1 0.8 NA 49 0.0048905 199.69751525036 39
BZ Belize 0.67 0 0 0 0 0 0 0 0 0 NA 0 0 0.6 NA 90.23 0.0000197 198.399975485748 40
CR Costa Rica 0.4 0 1 0 0 0 0 0 0 0.5 0.28 0 0 0.8 0.53 76.6 0.0000613 177.21744343534 41
GT Guatemala 0.4 0 0 0 0 0 0 0 0 0.5 0.56 0 0 0.8 0.66 80.53 0.0000375 174.80352514852 42
GI Gibraltar 0.64 0 0 0 0 0 0 0 1 0 0.63 0 0.1 0.2 0.67 78.4 0.0000476 174.642727594868 43 GB
GH Ghana 0.17 0 0 0 0 0 0 0.2 1 0.5 0.23 0 0.1 0.6 0.35 79 0.0000264 146.80784020456 44
AD Andorra 0.43 0 1 0 0 0 0 0 0 1 0.39 0 0 0.6 0.59 73.27 0.0000392 133.620757757727 45
AN Netherlands Antilles 1 0 0 0 0 0 0 0 0 0.5 NA 0 0.07 0.6 NA 83.31 0.0000112 129.369155840409 46 NL
AW Aruba 0.43 0 0 0 0 0 0 0 0 1 0.23 1 0.07 0.6 0.54 74.2 0.0000286 124.930092120337 47 NL
DK Denmark 0.57 0 0 0 1 0 1 1 0.7 0.5 0.5 1 1 1 0.79 39.6 0.0075233 121.680695810239 48
BW Botswana 0.33 0 0 0 0 0 0 0 1 0.5 0.24 0 0.02 0.6 0.53 78.53 0.0000157 121.266267322408 49
PT Portugal (Madeira) 0.53 0 0 0 0 0 1 0.2 1 0.5 0.66 1 0.73 0.8 1 50.53 0.0007924 119.38856082424 50
VI US Virgin Islands 0.5 0 0 0 0 0 0 0 1 0 0.7 0 1 0.8 0.79 68.07 0.0000361 104.240459980837 51 US
VC St Vincent & Grenadines 0.33 0 0 0 0 0 0 0 1 0 0.42 0 0 0.6 0.93 78.13 0.00000947 100.9028576384 52
ES Spain 0.57 1 0 0 0 0 1 1 1 1 0.61 1 1 0.8 0.93 33.93 0.0161782 98.7934864935459 53
MT Malta 0.53 0 0 0.2 1 0 0 0.8 1 0 0.69 1 0.82 0.8 1 47.73 0.0007463 98.6307003567358 54
SC Seychelles 0.17 0 0 0 0 0 0 0 0 0 0.23 0 0.2 0.8 0.41 87.93 0.00000273 95.0164430407097 55
HU Hungary 0.83 0 0 0 0 0 0 1 1 0.5 0.78 1 0.97 0.8 1 47.47 0.000696 94.7968940771473 56
LV Latvia 0.54 0 0 0 0 0 1 1 0.7 1 0.56 1 0.85 0.8 0.8 45 0.0009281 88.8864985983776 57
AG Antigua & Barbuda 0.47 0 0 0 0 0 0 0 0 0 0.34 0 0.3 0.8 0.86 81.53 0.00000435 88.467158706525 58
LC St Lucia 0.1 0 0 0 0 0 0 0 1 0 0.14 0 0 0.2 0.27 88.6 0.00000145 78.7209814023553 59
MV Maldives 0 0 0 0 0 0 0 0 0 0.5 NA 0 0 0.6 NA 91.54 0.00000107 78.4562085704451 60
GD Grenada 0.33 0 0 0 0 0 0 0 0 0.5 0.29 0 0.02 0.6 0.86 82.67 0.00000106 57.607509656943 61
MS Montserrat 0.17 0 0 0 0 0 0 0 0 0.5 NA 1 0 0.2 NA 85.62 0.000000509 50.1146765030486 62 GB
BN Brunei Darussalam 0.23 0 0 0 0 0 0 0 0 0 0.43 0 0.13 0.8 0.79 84.13 0.000000455 45.7990495796252 63
MC Monaco 0.4 0 1 0 0 0 0 0 0.3 0.5 0.48 0 0.07 0.6 0.47 74.53 0.000000757 37.730450456638 64
AI Anguilla 0.4 0 0 0 0 0 0 0 0 0 0.58 1 0 0.2 0.93 79.27 0.000000379 36.0473196694358 65 GB
KN St Kitts & Nevis 0.43 0 0 0 0 0 0 0 0 0.5 0.44 0 0.02 0.6 0.8 81.4 0.000000193 31.1691996658 66
SM San Marino 0.3 0 0 0 0 0 0 0 1 0.5 0.24 0 0.08 0.6 0.47 78.73 0.000000253 30.8646195505463 67
WS Samoa 0.34 0 0 0 0 0 0 0 1 0 0.28 0 0 0.4 0.28 84.67 0.000000093 27.5010744745231 68
VU Vanuatu 0.34 0 0 0 0 0 0 0 0 0 0.33 0 0 0.6 0.53 88 0.00000000929 14.3258342187783 69
CK Cook Islands 0.4 0 0 0 0 0 0 0 1 0.5 0.56 0 0 0.6 0.65 75.27 0.000000031 13.3963446665302 70
DM Dominica 0.5 0 0 0 0 0 0 0 1 0 0.26 0 0 0.6 0.66 79.87 0.0000000146 12.4528475635535 71
body {
font: 10px sans-serif;
margin: 0;
}
body > svg {
/* width: 300px; */
/* height: 300px; */
overflow: visible;
border: 1px solid lightgray;
/* background-color: lightblue; */
}
.active {
stroke: red !important;
opacity: 0.95 !important;
}
.administeredBy {
stroke: olive;
stroke-width: 2;
stroke-dasharray: 12,8;
opacity: 0.3;
}
.country {
stroke: green;
opacity: 0.9;
}
path {
fill: none;
}
.axis {
shape-rendering: crispEdges;
stroke: grey;
}
.axis .minor {
stroke-opacity: .5;
}
.axis path {
opacity: 0.5;
/* display: none; */
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment