<!DOCTYPE html>
<html lang="cs">
<head>
<meta charset="utf-8">
<title>W-PCA Scatterplot Chart</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="description" content="WPCA scatter plot">
<meta name="author" content="Michal Škop">
<script src="//d3js.org/d3.v3.min.js"></script>
<script src="./d3.scatterplotwithlineplot.js"></script>
<script src="./d3.tips.js"></script>
<style type="text/css">
/* note: we duplicate some of the styles (css, and as attributes of svg elements), so FF displays it correctly, and it is possible to generate png */
.tick {
fill-opacity: 0;
stroke: #000000;
stroke-width: 1;
}
.domain {
fill: none;
fill-opacity: 0;
stroke: black;
stroke-width: 1;
}
.axis line {
fill: none;
fill-opacity: 0;
stroke: black;
stroke-width: 1;
shape-rendering: crispEdges;
}
.axis text {
font-family: sans-serif;
font-size: 11px;
stroke: gray;
}
circle:hover {
fill-opacity: 1;
}
.label {
font-family: sans-serif;
font-size: 15px;
}
.d3-tip {
line-height: 1;
font-weight: bold;
padding: 12px;
background: rgba(0, 0, 0, 0.8);
color: #fff;
border-radius: 2px;
pointer-events: none;
max-width: 400px;
}
/* Creates a small triangle extender for the tooltip */
.d3-tip:after {
box-sizing: border-box;
display: inline;
font-size: 10px;
width: 100%;
line-height: 1;
color: rgba(0, 0, 0, 0.8);
position: absolute;
pointer-events: none;
}
/* Northward tooltips */
.d3-tip:after {
content: "\25BC";
margin: -1px 0 0 0;
top: 100%;
left: 0;
text-align: center;
}
line {
stroke:gray;
stroke-width:1;
opacity: .15;
}
.perfect {
stroke: gray;
stroke-width:3;
opacity: 0.5;
}
#chart {
margin-top:100px;
}
</style>
</head>
<body>
<div id="chart"></div>
<script type="text/javascript">
d3.csv("voters.csv", function(voters) {
d3.csv("cutting_lines.csv", function(lines) {
linesselected = [];
for (k in lines) {
if ((parseFloat(lines[k]['loss']) < 1.5) && (parseFloat(lines[k]['cl_beta0']) < 50)) {
beta = [lines[k]['normal_x'],lines[k]['normal_y']];
beta0 = lines[k]['cl_beta0'];
if (beta[1] != 0) {
lines[k]['a'] = -beta0/beta[1];
lines[k]['b'] = -beta[0]/beta[1];
} else {
lines[k]['a'] = 0;
lines[k]['b'] = 0;
}
//add class for a perfect cut:
if (lines[k]['loss'] == 0) {
lines[k]['class'] = 'perfect';
} else {
lines[k]['class'] = 'non-perfect';
}
lines[k]['name'] = lines[k]["motion:name"];
linesselected.push(lines[k]);
}
}
spdata = [];
voters.forEach(function(d) {
spdata.push({"x":d["wpca:d1"],"y":d["wpca:d2"],"r":d["r"],"color":d["color"],"name":d["name"]})
});
var scatterplotwithlineplot = [{
"data": spdata,
"margin": {top: 10, right: 10, bottom: 30, left: 30},
"axes": {"labels":{"x":"DIM 1", "y":"DIM 2"}},
"minmax":{"x":{'min':-1,'max':1},"y":{'min':-1,'max':1},"r":{'min':0,'max':1},"rrange":{'min':0,'max':100}},
"size":{"width":400,"height":400},
"lines": linesselected
}];
var svg = d3.select("#chart")
.append("svg")
.attr("width",scatterplotwithlineplot[0]['size']['width'])
.attr("height",scatterplotwithlineplot[0]['size']['height']);
/* Initialize tooltip */
tip = d3.tip().attr('class', 'd3-tip').html(function(d) {
return "<span class=\'stronger\'>" + d["name"] + "</span><br>";
});
/* Invoke the tip in the context of your visualization */
svg.call(tip)
var sp = d3.scatterplotwithlineplot()
.data(function(d) {return d.data})
.margin(function(d) {return d.margin})
.axes(function(d) {return d.axes})
.minmax(function(d) {return d.minmax})
.size(function(d) {return d.size})
.lines(function(d) {return d.lines})
var scatter = svg.selectAll(".scatterplot")
.data(scatterplotwithlineplot)
.enter()
.append("svg:g")
.attr("transform", "translate(" + scatterplotwithlineplot[0].margin.left + "," + scatterplotwithlineplot[0].margin.top + ")")
.call(sp);
})
})
</script>
</body>
</html>
<!DOCTYPE html>
<html lang="cs">
<head>
<meta charset="utf-8">
<title>W-PCA Scatterplot Chart</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="description" content="WPCA scatter plot">
<meta name="author" content="Michal Škop">
<script src="//d3js.org/d3.v3.min.js"></script>
<script src="./d3.scatterplotwithlineplot.js"></script>
<script src="./d3.tips.js"></script>
<style type="text/css">
/* note: we duplicate some of the styles (css, and as attributes of svg elements), so FF displays it correctly, and it is possible to generate png */
.tick {
fill-opacity: 0;
stroke: #000000;
stroke-width: 1;
}
.domain {
fill: none;
fill-opacity: 0;
stroke: black;
stroke-width: 1;
}
.axis line {
fill: none;
fill-opacity: 0;
stroke: black;
stroke-width: 1;
shape-rendering: crispEdges;
}
.axis text {
font-family: sans-serif;
font-size: 11px;
stroke: gray;
}
circle:hover {
fill-opacity: 1;
}
.label {
font-family: sans-serif;
font-size: 15px;
}
.d3-tip {
line-height: 1;
font-weight: bold;
padding: 12px;
background: rgba(0, 0, 0, 0.8);
color: #fff;
border-radius: 2px;
pointer-events: none;
max-width: 400px;
}
/* Creates a small triangle extender for the tooltip */
.d3-tip:after {
box-sizing: border-box;
display: inline;
font-size: 10px;
width: 100%;
line-height: 1;
color: rgba(0, 0, 0, 0.8);
position: absolute;
pointer-events: none;
}
/* Northward tooltips */
.d3-tip:after {
content: "\25BC";
margin: -1px 0 0 0;
top: 100%;
left: 0;
text-align: center;
}
line {
stroke:gray;
stroke-width:1;
opacity: .15;
}
.perfect {
stroke: gray;
stroke-width:3;
opacity: 0.5;
}
#chart {
margin-top:100px;
}
</style>
</head>
<body>
<div id="chart"></div>
<script type="text/javascript">
d3.csv("voters2.csv", function(voters) {
d3.csv("cutting_lines.csv", function(lines) {
linesselected = [];
lines = [];
for (k in lines) {
if ((parseFloat(lines[k]['loss']) < 1.5) && (parseFloat(lines[k]['cl_beta0']) < 50)) {
beta = [lines[k]['normal_x'],lines[k]['normal_y']];
beta0 = lines[k]['cl_beta0'];
if (beta[1] != 0) {
lines[k]['a'] = -beta0/beta[1];
lines[k]['b'] = -beta[0]/beta[1];
} else {
lines[k]['a'] = 0;
lines[k]['b'] = 0;
}
//add class for a perfect cut:
if (lines[k]['loss'] == 0) {
lines[k]['class'] = 'perfect';
} else {
lines[k]['class'] = 'non-perfect';
}
lines[k]['name'] = lines[k]["motion:name"];
linesselected.push(lines[k]);
}
}
spdata = [];
voters.forEach(function(d) {
spdata.push({"x":d["wpca:d1"],"y":d["wpca:d2"],"r":d["r"],"color":d["color"],"name":d["name"]})
});
var scatterplotwithlineplot = [{
"data": spdata,
"margin": {top: 10, right: 10, bottom: 30, left: 30},
"axes": {"labels":{"x":"DIM 1", "y":"DIM 2"}},
"minmax":{"x":{'min':-1,'max':1},"y":{'min':-1,'max':1},"r":{'min':0,'max':1},"rrange":{'min':0,'max':100}},
"size":{"width":400,"height":400},
"lines": linesselected
}];
var svg = d3.select("#chart")
.append("svg")
.attr("width",scatterplotwithlineplot[0]['size']['width'])
.attr("height",scatterplotwithlineplot[0]['size']['height']);
/* Initialize tooltip */
tip = d3.tip().attr('class', 'd3-tip').html(function(d) {
return "<span class=\'stronger\'>" + d["name"] + "</span><br>";
});
/* Invoke the tip in the context of your visualization */
svg.call(tip)
var sp = d3.scatterplotwithlineplot()
.data(function(d) {return d.data})
.margin(function(d) {return d.margin})
.axes(function(d) {return d.axes})
.minmax(function(d) {return d.minmax})
.size(function(d) {return d.size})
.lines(function(d) {return d.lines})
var scatter = svg.selectAll(".scatterplot")
.data(scatterplotwithlineplot)
.enter()
.append("svg:g")
.attr("transform", "translate(" + scatterplotwithlineplot[0].margin.left + "," + scatterplotwithlineplot[0].margin.top + ")")
.call(sp);
})
})
</script>
</body>
</html>
id,normal_x,normal_y,cl_beta0,loss,motion:name
2,0.181772268,-1.7461287937,0.523389578,1.7183728649,2. Senát by měl být i nadále zachován.
4,0.5771089207,-1.718244601,0.2134397921,1.9141372816,4. V ČR by měla být i nadále povolena stavba mešit.
5,-2.5519684302,-0.9614376679,0.3393893466,1.445455722,5. Prezident by měl být i nadále volen přímo občany.
7,2.4113899934,1.1926359281,-0.7382825633,2.2842052484,7. Zaměstnavatel by měl mít možnost dát výpověď bez udání důvodu.
8,-0.8268764308,0.2422299111,-0.3132412552,1.3099020246,8. Měla by být zavedena možnost eutanázie.
9,-1.5325868193,-1.7091022647,-0.3380007039,1.2310198318,9. ČR by měla i nadále usilovat o přijetí eura.
10,0.2470281518,-0.7924031825,0.2015455105,1.5879759499,10. Prezident by měl mít i nadále možnost udělovat milost.
11,-3.0056824467,1.2827798312,-1.1092650725,0.4560975917,11. Daň ze zisku velkých komunikačních firem by se měla zvýšit alespoň na 30 %.
12,-1.3090991052,0.1074923303,-0.065583705,2.9259880792,12. Státní instituce by měly být rozmísťovány rovnoměrně po celém území ČR.
13,-1.2510484829,-2.4261185491,0.1351876763,0.8770869312,13. Stát by měl finančně podporovat vznik sítě romských asistentů prevence kriminality.
14,3.0779314889,-0.2254736648,-0.5077130986,0.6257713253,14. Na veřejných vysokých školách by měly být vybírány poplatky za studium.
15,-0.7183587416,-3.6237325488,0.744402692,0.1864526356,15. Mělo by být zřízeno specializované státní zastupitelství pro boj proti korupci.
17,-1.6416874517,-1.8302839439,-0.5948102093,0.9629051994,17. Kouření v restauracích by mělo být zakázáno.
18,1.5549287876,-1.973187044,0.9604889868,0.2031820892,18. Maximální výše schodku státního rozpočtu by měla být omezena zákonem.
19,0.0167318988,-1.6862227962,2360.6798105263,0,19. Český telekomunikační úřad by měl v podmínkách aukce na LTE sítě vyhradit část spektra v pásmu 800 MHz pro nové hráče.
20,-1.4490983622,2.4253823014,-0.2697157456,1.6950368484,20. Vydávání majetku církvím v rámci tzv. církevních restitucí by mělo být zastaveno.
21,-3.6251123696,0.2108865642,1.0686918833,1.4614189898,21. Občané by měli mít možnost předložit návrh zákona pomocí petice.
22,-2.3564284074,-0.0980799257,-0.2532732094,2.7840989043,22. Reklama na léky hrazené ze zdravotního pojištění by měla být zakázána.
23,-1.4854385465,-0.1831105072,-0.5579780214,0.8213897184,23. Homosexuální páry by měly mít stejná práva na adopci dětí jako heterosexuální páry.
24,-1.5584107472,-1.7822206787,0.1037302637,1.9875008777,24. Limity těžby uhlí v ČR by měly být zachovány.
25,1.4666938149,-1.764170579,0.9481128976,0.1146029609,25. ČR by měla být i nadále členem NATO.
26,-3.1391302285,1.9161008345,1.1830858891,0.0604505227,26. Měla by existovat možnost vypsání celostátního referenda na základě petice.
27,-0.9336344892,0.8732508457,-0.5085268307,0.9360746167,27. Poplatek za prázdná paměťová média by měl být zachován.
28,-2.8609920318,-2.5364677809,1.7117605308,0,28. Státní podpora stavebního spoření by měla být zachována.
29,-1.7489562179,0.6490705925,-0.8214392295,1.0503091256,"29. Zdraví škodlivé potraviny (např. limonády, cukrovinky, hranolky) by měly mít vyšší sazbu DPH."
30,-2.5581938914,0.9274222182,-0.7049925563,2.1183640094,30. Měly by být zavedeny tzv. registrační pokladny.
31,-0.5970840859,1.2670669514,-0.2464631237,1.7096609166,31. Marihuana by měla být legalizována.
32,-2.5187885937,1.8757352946,-0.8122775659,1.1273636463,32. Měla by vzniknout státem vlastněná banka jako alternativa komerčních bank.
33,-1.690965564,-0.5580106686,0.863872926,1.286883352,33. Data vytvářená veřejnou správou by měla být poskytována zdarma a ve strojově čitelné podobě.
34,-3.3956571947,-0.8714198964,0.6863562253,1.2708886549,34. Vlastnická struktura všech akciových společností by měla být dohledatelná na internetu.
35,-1.3201999506,-3.3295360541,1.1886481892,0,35. ČR by měla být i nadále členem EU.
36,-2.9208193724,-0.2158407206,0.7532909437,0.6604249216,36. Stát by měl omezovat výrobu potravin z geneticky modifikovaných organizmů.
37,-2.6397341187,-0.082036777,-0.1693153188,2.0549687448,37. Stát by měl garantovat základní připojení k internetu pro všechny občany.
38,-3.6423732922,-1.4026131537,2360.6798105263,0,38. Občané obce by měli mít možnost soudně napadnout protizákonný prodej obecního majetku.
39,-1.9630109426,0.4171506544,0.6903618288,3.0833587796,39. Obchodní řetězce by měly nabízet povinně předepsaný podíl potravin od českých výrobců.
40,-3.8257271081,-0.0969008904,1.7307027696,0,40. Měla by existovat povinnost prokázat původ určitého majetku s možností zabavení neprokázaného majetku.
41,1.2356200841,-1.0748120823,0.6909571883,0.481785726,41. Pacienti by měli mít možnost připlatit si za nadstandardní zdravotní péči.
42,0.871222577,-1.0081166923,-0.1414747217,2.7599459991,"42. Stahování ""pirátského"" obsahu z internetu by mělo být trestné."
43,1.124659795,-1.1183036796,0.2733532003,2.8534197986,43. Systém datových schránek by se měl otevřít pro více provozovatelů.
44,1.1180748361,-3.3263284069,-0.5610538412,1.5199242554,44. Regulační zdravotnické poplatky by měly být zachovány.
45,-3.5066589178,-1.9763510623,1.7307027633,0,45. V sociálně vyloučených lokalitách by měly být zakázány hazardní přístroje.
46,-2.9863748849,-0.4974744254,2.0789070665,0.4234807958,46. Kontrolní pravomoci NKÚ by měly být rozšířeny na samosprávy a obchodní společnosti s vlastnickou účastí veřejné správy.
47,-3.4021846047,0.8468311526,-0.5865989739,0,47. Minimální hrubá mzda by měla být nejméně 10 000 Kč měsíčně.
48,-1.9463566865,0.325348345,-0.9001369916,0.4032196474,48. Pro obsazování volených funkcí by měly být zavedeny kvóty pro ženy.
49,-1.0754936695,-0.9660254418,-0.7985760679,0.4364986312,49. Občané docházející na pravidelné preventivní prohlídky by měli platit nižší zdravotní pojištění.
50,-1.2824485849,-2.9292307869,0.6218777062,0,50. Účetnictví politických stran včetně smluv a dokladů by mělo být pravidelně zveřejňováno na internetu.
51,-1.6498496326,-1.4842324247,1.4789562117,0,51. Poskytovatelé připojení k internetu by měli dodržovat tzv. síťovou neutralitu.
52,1.0388245651,-2.7902980707,0.6981212502,1.145049626,52. Armáda ČR by se měla účastnit zahraničních vojenských misí.
53,-1.1763749105,0.8212052806,-5278.6403435454,0,53. Domácí porody by měly být trestné.
54,-1.9285171068,1.0499509911,2360.6798105263,0,54. Stát by měl pravidelně zveřejňovat platy a odměny vrcholných politiků a vysokých státních úředníků.
55,1.6964791772,-3.1274924415,-0.8837493853,0.8205135339,55. Tzv. 2. pilíř důchodového systému by měl být zachován.
56,-2.4620780134,-0.7934322309,1.2345602262,0,56. Na pozice v dozorčích a správních radách obchodních společností s vlastnickou účastí veřejné správy by měla být vypisována otevřená výběrová řízení.
57,-1.9341328235,-0.1486838472,-0.5227471332,2.4144622334,57. Stát by měl omezit přístup k webovým stránkám s obsahem nevhodným pro nezletilé.
58,-2.4092360372,0.0630065882,-0.1383517727,3.2300635188,58. Těžba zemního plynu z břidlicových písků by měla být zakázána.
60,-1.4762678275,-1.580682897,-0.21643044,1.3850367799,60. Povinné přidávání biosložek do paliv by mělo být i nadále zachováno.
61,1.0626537415,-0.1798199988,-0.2473043109,2.4327778847,61. Technické vzdělávání na středních a vysokých školách by mělo být státem podporováno na úkor jiných oborů.
62,-1.4510244767,2.1401948946,-0.4134539009,1.8024731364,62. Očkování by mělo být vždy dobrovolné.
63,-1.1604146923,-0.9771782173,0.4551898063,1.1722891914,63. Platnost smluv uzavřených veřejnou správnou by měla být podmíněna jejich zveřejněním v registru smluv.
64,-1.0904104344,-2.1331086564,2360.6798105263,0,"64. Poplatky za právníky vymáháné před exekucí po dlužnících, co dluží do 10000 Kč, by měly být omezeny zákonem pod 1000 Kč."
65,-0.4112983502,-1.6051726316,0.6432900812,1.7572037839,65. Vyplácení podpory v nezaměstnanosti by mělo být vázáno na školní docházku dětí.
101,-1.5844042809,-0.0087863029,0.03900019,2.6314060433,101. Spotřební daň z pohoných hmot by se měla snížit alespoň o 2 Kč/litr.
102,-3.6885250425,1.2780116913,0.1197339059,0,102. Měla by být zavedena progresivní daň z příjmů pro fyzické osoby.
103,-3.4064249495,0.141719177,0.6450864309,1.5661051162,103. Půjčky a úvěry by měly poskytovat výhradně subjekty regulované Českou národní bankou.
104,0.260427091,0.0871453089,0.1214286171,0.1915004436,104. Minimální limit pro povolení oddlužení (tzv. osobního bankrotu) by se měl zpřísnit alespoň na 50 % ze stávajících 30 % zaplacených dluhů.
105,2.0656843416,1.7515852627,0.1814669047,0.5787803024,105. “Švarcsystém” by měl být legální.
106,-3.8155144814,0.9927103893,1.2933302156,0,106. Sazba DPH na základní potraviny by měla být nejvýše 10 %.
107,-1.3367118343,1.2301710038,0.7013353282,1.7192637948,107. Při volbách do Sněmovny by se mělo volit i nadále poměrným systémem.
108,-0.912941418,0.3941088885,-5278.6403435454,0,"108. ""Datové schránky"" pro živnostníky by měly být povinné."
109,-2.1694108381,-1.7163297578,0.3512658433,1.7195678516,109. Zaměstnávání lidí v předdůchodovém věku by mělo být daňově zvýhodněno.
110,-3.0508546673,0.6729075601,1.8728276852,0,110. Důchody by měly být valorizovány minimálně o inflaci.
111,-1.1769414199,1.2996595889,-0.1944022622,3.2463296878,111. Věk trestní odpovědnosti by se měl snížit na 14 let.
112,3.8664162522,-1.0672915248,-1.270270408,0,112. Národní podnik Budějovický Budvar by měl být privatizován.
113,0.2586015966,0.3900748809,0.0273089196,0.8746110846,"113. Jaderná energetika by měla být podporována z veřejných zdrojů (garance výkupních cen, vládní záruky na úvěr na dostavbu Temelína, apod.)."
114,-1.6713070945,0.0277378116,-0.6455640311,0.4527966402,114. Spotřební daň na alkohol by se měla zvýšit.
115,1.5656190409,-3.0772591074,0.066859006,0.6423270264,"115. Nový občanský zákoník by měl začít platit od 1.1.2014, jak je plánováno."
116,-0.4683465273,-2.2134900387,0.6293400513,1.8332388439,116. Státní maturita by měla být zachována.
117,-2.6715136502,-2.7652049324,1.6679258315,0,117. Státní podpora žákovských slev ve veřejné dopravě by měla zůstat zachována alespoň na dnešní úrovni.
118,-3.7480506213,-0.1081545482,1.1604962204,0.874870043,118. Všechny děti od 3 let by měly mít místo ve veřejné školce nebo jejich rodiče dostat příspěvek na zajištění péče jiným způsobem.
119,3.1655597979,-0.1624764772,-1.7307026585,0.8922533201,119. Studium na veřejných vysokých školách by mělo být zpoplatněno.
120,0.0024580832,-1.5987119845,-0.3141760039,1.9956872115,120. Soudci by nadále měli být jmenováni do funkce doživotně.
/* requires D3 + https://github.com/Caged/d3-tip */
d3.scatterplotwithlineplot = function() {
unit_circle = true;
function scatterplotwithlineplot(selection) {
selection.each(function(d, i) {
//options
var data = (typeof(data) === "function" ? data(d) : d.data),
lines = (typeof(lines) === "function" ? lines(d) : d.lines),
margin = (typeof(margin) === "function" ? margin(d) : d.margin),
axes = (typeof(axes) === "function" ? axes(d) : d.axes),
minmax = (typeof(minmax) === "function" ? minmax(d) : d.minmax),
size = (typeof(size) === "function" ? size(d) : d.size),
unit_circle_val = (typeof(unit_circle) === "function" ? unit_circle(d) : unit_circle);
// chart sizes
var width = size['width'] - margin.left - margin.right,
height = size['height'] - margin.top - margin.bottom;
//scales
var xScale = d3.scale.linear()
.domain([minmax['x']['min'], minmax['x']['max']])
.range([0, width])
var yScale = d3.scale.linear()
.domain([minmax['y']['min'], minmax['y']['max']])
.range([height, 0])
var rScale = d3.scale.linear()
.domain([minmax['r']['min'],minmax['r']['max']])
.range([minmax['rrange']['min'],minmax['rrange']['max']]);
//axes
var xAxis = d3.svg.axis()
.scale(xScale)
.orient("bottom");
//.ticks(5);
//.tickSize(16, 0);
var yAxis = d3.svg.axis()
.scale(yScale)
.orient("left");
//.ticks(5);
var element = d3.select(this);
//Create X axis
element.append("g")
.attr("class", "axis x-axis")
.attr("transform", "translate(0," + height + ")")
.call(xAxis);
//Create Y axis
element.append("g")
.attr("class", "axis y-axis")
.call(yAxis);
limits = {"x":[minmax["x"]["min"],minmax["x"]["max"]],"y":[minmax["y"]["min"],minmax["y"]["max"]]}
for (k in lines) {
ps = linecross(lines[k],limits);
if (ps.length == 2) {
lines[k].x1 = ps[0][0];
lines[k].y1 = ps[0][1];
lines[k].x2 = ps[1][0];
lines[k].y2 = ps[1][1];
}
way = get_sign(lines[k].b,lines[k].n1,lines[k].n2);
lines[k].path =[corners(lines[k],limits,way),corners(lines[k],limits,-1*way)];
}
//ellipse ~ unit_circle
if (unit_circle_val) {
element.selectAll(".ellipse")
.data([0])
.enter()
.append("ellipse")
.attr("cx", xScale(0))
.attr("cy", yScale(0))
.attr("rx", Math.abs(xScale(1)-xScale(0)))
.attr("ry", Math.abs(yScale(1)-yScale(0)))
.attr("fill-opacity",0)
.attr("stroke","red")
.style("stroke-dasharray", ("10,3"));
}
//lines
var line = element.selectAll ('.line')
.data(lines)
.enter()
.append("line")
.attr("x1",function(d) {return xScale(d.x1)})
.attr("y1",function(d) {return yScale(d.y1)})
.attr("x2",function(d) {return xScale(d.x2)})
.attr("y2",function(d) {return yScale(d.y2)})
.attr("id", function (d, i) {return "q-" + i;})
.attr("class", function(d) {
if (typeof(d['class'] != 'undefined')) return d['class'];
else return 'line';
})
//putting it here and not in css, because it is used for generating png:
.attr("stroke","gray")
.attr("stroke-width","1")
.attr("opacity", 0.15)
.on('mouseover', tip.show)
.on('mouseout', tip.hide);
//points
element.selectAll(".circle")
.data(data)
.enter()
.append("circle")
.attr("cx", function(d) {
return xScale(d.x);
})
.attr("cy", function(d) {
return yScale(d.y);
})
.attr("r", function(d) {
return rScale(d.r);
})
.attr("class", function(d) {
if (typeof(d['class'] != 'undefined')) return d['class'];
else return 'circle';
})
.attr("fill",function(d) {return d.color})
.attr("stroke",function(d) {return d.color})
.attr("fill-opacity",0.66)
.on('mouseover', tip.show)
.on('mouseout', tip.hide);
//axis labels
element.append("text")
.attr("class", "x-label label")
.attr("text-anchor", "end")
.attr("x", width)
.attr("y", height-5)
.text(axes['labels']['x']);
element.append("text")
.attr("class", "y label")
.attr("text-anchor", "end")
.attr("y", 5)
.attr("x", 0)
.attr("dy", ".75em")
.attr("transform", "rotate(-90)")
.text(axes['labels']['y']);
// putting it here and not in css, because it is used for generating png:
element.selectAll(".domain")
.attr("fill","none")
.attr("fill-opacity",0)
.attr("stroke","black")
.attr("stroke-width",1);
element.selectAll(".tick")
.attr("fill-opacity",0)
.attr("stroke","#000")
.attr("stroke-width",1);
element.selectAll("text")
.attr("font-family","sans-serif")
.attr("font-size",11)
element.selectAll(".label")
.attr("font-size",15)
.attr("font-weight","bold")
//convert dy("0.71em") to dy("10"), inkscape feature https://www.ruby-forum.com/topic/5505193 :
element.selectAll("text")
.attr("dy",function(d) {
if (d3.select(this).attr("dy")) {
em = parseFloat(d3.select(this).attr("dy").replace("em",""));
if (d3.select(this).attr("font-size"))
px = parseFloat(d3.select(this).attr("font-size"));
else
px = 11;
return em*px + "px";
} else {
return 0;
}
})
});
}
scatterplotwithlineplot.data = function(value) {
if (!arguments.length) return value;
data = value;
return scatterplotwithlineplot;
};
scatterplotwithlineplot.lines = function(value) {
if (!arguments.length) return value;
lines = value;
return scatterplotwithlineplot;
};
scatterplotwithlineplot.margin = function(value) {
if (!arguments.length) return value;
margin = value;
return scatterplotwithlineplot;
};
scatterplotwithlineplot.axes = function(value) {
if (!arguments.length) return value;
axes = value;
return scatterplotwithlineplot;
};
scatterplotwithlineplot.minmax = function(value) {
if (!arguments.length) return value;
minmax = value;
return scatterplotwithlineplot;
};
scatterplotwithlineplot.size = function(value) {
if (!arguments.length) return value;
size = value;
return scatterplotwithlineplot;
};
scatterplotwithlineplot.unit_circle = function(value) {
if (!arguments.length) return value;
unit_circle = value;
return scatterplotwithlineplot;
};
return scatterplotwithlineplot;
function corners(l,e,o) {
//l = {"a":0,"b":1} //line, a and slope, i.e., y=a+bx
//e = {"x": [-10,10], "y": [-10,10]} //limits
//o = 1 //orientation -1 or 1
//crossing x0, x1
//crossing y0, y1
outp = linecross (l,e);
out = [];
//vertices
for (i=0;i<=1;i++){
for (j=0;j<=1;j++){
if (o*(l.a+l.b*e.x[i]-e.y[j]) > 0)
outp.push([e.x[i],e.y[j]]);
}
}
//sort the outps, anticlockwise
if (outp.length > 0) {
mid = [0,0];
for (i in outp) {
mid[0] += outp[i][0];
mid[1] += outp[i][1];
}
mid[0] = mid[0] / outp.length;
mid[1] = mid[1] / outp.length;
for (i in outp) {
p = outp[i][1] - mid[1];
q = outp[i][0] - mid[0];
if (q != 0)
outp[i][2] = Math.atan(p/q) + (q<0 ? Math.PI : 0);
else
outp[i][2] = Math.PI/2 + Math.PI*sign(p);
}
outp = outp.sort(function(w,z) {
return w[2] > z[2];
});
for (i in outp) {
outp[i].splice(2,1);
out.push({"x":outp[i][0],"y":outp[i][1]});
}
}
return out;
}
function linecross (l,e) {
out = [];
//crossing x0, x1
for (i=0;i<=1;i++){
Y = l.a + l.b*e.x[i];
if ((Y > e.y[0]) && (Y < e.y[1]))
out.push([e.x[i],Y]);
}
//crossing y0, y1
for (j=0;j<=1;j++){
if (l.b != 0) {
X = (e.y[j] - l.a)/l.b;
if ((X > e.x[0]) && (X < e.x[1]))
out.push([X,e.y[j]]);
}
}
return out;
}
function get_sign(b,d1,d2) {
t = b*d1-d2;
if (t > 0) return 1;
if (t < 0) return -1;
return 0;
}
}
// d3.tip
// Copyright (c) 2013 Justin Palmer
//
// Tooltips for d3.js SVG visualizations
(function (root, factory) {
if (typeof define === 'function' && define.amd) {
// AMD. Register as an anonymous module with d3 as a dependency.
define(['d3'], factory)
} else if (typeof module === 'object' && module.exports) {
// CommonJS
module.exports = function(d3) {
d3.tip = factory(d3)
return d3.tip
}
} else {
// Browser global.
root.d3.tip = factory(root.d3)
}
}(this, function (d3) {
// Public - contructs a new tooltip
//
// Returns a tip
return function() {
var direction = d3_tip_direction,
offset = d3_tip_offset,
html = d3_tip_html,
node = initNode(),
svg = null,
point = null,
target = null
function tip(vis) {
svg = getSVGNode(vis)
point = svg.createSVGPoint()
document.body.appendChild(node)
}
// Public - show the tooltip on the screen
//
// Returns a tip
tip.show = function() {
var args = Array.prototype.slice.call(arguments)
if(args[args.length - 1] instanceof SVGElement) target = args.pop()
var content = html.apply(this, args),
poffset = offset.apply(this, args),
dir = direction.apply(this, args),
nodel = d3.select(node),
i = directions.length,
coords,
scrollTop = document.documentElement.scrollTop || document.body.scrollTop,
scrollLeft = document.documentElement.scrollLeft || document.body.scrollLeft
nodel.html(content)
.style({ opacity: 1, 'pointer-events': 'all' })
while(i--) nodel.classed(directions[i], false)
coords = direction_callbacks.get(dir).apply(this)
nodel.classed(dir, true).style({
top: (coords.top + poffset[0]) + scrollTop + 'px',
left: (coords.left + poffset[1]) + scrollLeft + 'px'
})
return tip
}
// Public - hide the tooltip
//
// Returns a tip
tip.hide = function() {
var nodel = d3.select(node)
nodel.style({ opacity: 0, 'pointer-events': 'none' })
return tip
}
// Public: Proxy attr calls to the d3 tip container. Sets or gets attribute value.
//
// n - name of the attribute
// v - value of the attribute
//
// Returns tip or attribute value
tip.attr = function(n, v) {
if (arguments.length < 2 && typeof n === 'string') {
return d3.select(node).attr(n)
} else {
var args = Array.prototype.slice.call(arguments)
d3.selection.prototype.attr.apply(d3.select(node), args)
}
return tip
}
// Public: Proxy style calls to the d3 tip container. Sets or gets a style value.
//
// n - name of the property
// v - value of the property
//
// Returns tip or style property value
tip.style = function(n, v) {
if (arguments.length < 2 && typeof n === 'string') {
return d3.select(node).style(n)
} else {
var args = Array.prototype.slice.call(arguments)
d3.selection.prototype.style.apply(d3.select(node), args)
}
return tip
}
// Public: Set or get the direction of the tooltip
//
// v - One of n(north), s(south), e(east), or w(west), nw(northwest),
// sw(southwest), ne(northeast) or se(southeast)
//
// Returns tip or direction
tip.direction = function(v) {
if (!arguments.length) return direction
direction = v == null ? v : d3.functor(v)
return tip
}
// Public: Sets or gets the offset of the tip
//
// v - Array of [x, y] offset
//
// Returns offset or
tip.offset = function(v) {
if (!arguments.length) return offset
offset = v == null ? v : d3.functor(v)
return tip
}
// Public: sets or gets the html value of the tooltip
//
// v - String value of the tip
//
// Returns html value or tip
tip.html = function(v) {
if (!arguments.length) return html
html = v == null ? v : d3.functor(v)
return tip
}
function d3_tip_direction() { return 'n' }
function d3_tip_offset() { return [0, 0] }
function d3_tip_html() { return ' ' }
var direction_callbacks = d3.map({
n: direction_n,
s: direction_s,
e: direction_e,
w: direction_w,
nw: direction_nw,
ne: direction_ne,
sw: direction_sw,
se: direction_se
}),
directions = direction_callbacks.keys()
function direction_n() {
var bbox = getScreenBBox()
return {
top: bbox.n.y - node.offsetHeight,
left: bbox.n.x - node.offsetWidth / 2
}
}
function direction_s() {
var bbox = getScreenBBox()
return {
top: bbox.s.y,
left: bbox.s.x - node.offsetWidth / 2
}
}
function direction_e() {
var bbox = getScreenBBox()
return {
top: bbox.e.y - node.offsetHeight / 2,
left: bbox.e.x
}
}
function direction_w() {
var bbox = getScreenBBox()
return {
top: bbox.w.y - node.offsetHeight / 2,
left: bbox.w.x - node.offsetWidth
}
}
function direction_nw() {
var bbox = getScreenBBox()
return {
top: bbox.nw.y - node.offsetHeight,
left: bbox.nw.x - node.offsetWidth
}
}
function direction_ne() {
var bbox = getScreenBBox()
return {
top: bbox.ne.y - node.offsetHeight,
left: bbox.ne.x
}
}
function direction_sw() {
var bbox = getScreenBBox()
return {
top: bbox.sw.y,
left: bbox.sw.x - node.offsetWidth
}
}
function direction_se() {
var bbox = getScreenBBox()
return {
top: bbox.se.y,
left: bbox.e.x
}
}
function initNode() {
var node = d3.select(document.createElement('div'))
node.style({
position: 'absolute',
top: 0,
opacity: 0,
'pointer-events': 'none',
'box-sizing': 'border-box'
})
return node.node()
}
function getSVGNode(el) {
el = el.node()
if(el.tagName.toLowerCase() === 'svg')
return el
return el.ownerSVGElement
}
// Private - gets the screen coordinates of a shape
//
// Given a shape on the screen, will return an SVGPoint for the directions
// n(north), s(south), e(east), w(west), ne(northeast), se(southeast), nw(northwest),
// sw(southwest).
//
// +-+-+
// | |
// + +
// | |
// +-+-+
//
// Returns an Object {n, s, e, w, nw, sw, ne, se}
function getScreenBBox() {
var targetel = target || d3.event.target;
while ('undefined' === typeof targetel.getScreenCTM && 'undefined' === targetel.parentNode) {
targetel = targetel.parentNode;
}
var bbox = {},
matrix = targetel.getScreenCTM(),
tbbox = targetel.getBBox(),
width = tbbox.width,
height = tbbox.height,
x = tbbox.x,
y = tbbox.y
point.x = x
point.y = y
bbox.nw = point.matrixTransform(matrix)
point.x += width
bbox.ne = point.matrixTransform(matrix)
point.y += height
bbox.se = point.matrixTransform(matrix)
point.x -= width
bbox.sw = point.matrixTransform(matrix)
point.y -= height / 2
bbox.w = point.matrixTransform(matrix)
point.x += width
bbox.e = point.matrixTransform(matrix)
point.x -= width / 2
point.y -= height / 2
bbox.n = point.matrixTransform(matrix)
point.y += height
bbox.s = point.matrixTransform(matrix)
return bbox
}
return tip
};
}));
id,name,result,wpca:d1,wpca:d2,color,r
cssd,ČSSD,20.45,-0.335246878,0.1399181277,orange,0.3197655391
ano,ANO,18.65,-0.0949445529,-0.5158961643,#5f91b3,0.3053686297
komunisticka-strana-cech-a-moravy,KSČM,14.91,-0.4262010099,0.1331630054,red,0.2730384588
top-09,TOP 09,11.99,0.3907679923,-0.5207133693,#660066,0.2448468909
obcanska-demokraticka-strana-ods,ODS,7.72,0.6854931437,-0.2701123505,blue,0.196468827
hnuti-usvit-prime-demokracie,Úsvit,6.88,-0.0942298724,-0.2299754258,#91b82e,0.1854723699
kdu-csl,KDU-ČSL,6.78,0.1526643701,-0.3584050224,yellow,0.1841195264
strana-zelenych,Zelení,3.19,-0.5571289546,-0.2143121403,green,0.1262933094
ceska-piratska-strana,Piráti,2.66,-0.2524050124,-0.1017168029,black,0.1153256259
strana-svobodnych-obcanu,Svobodní,2.46,0.6975946971,0.502800562,darkgreen,0.1109053651
spoz,SPOZ,1.51,-0.3990180875,-0.1887233963,pink,0.086890736
delnicka-strana-socialni-spravedlnosti,DSSS,0.86,-0.3602863926,0.5593834522,brown,0.0655743852
politicke-hnuti-zmena,Změna,0.57,-0.5445580799,-0.2065190323,#00FF33,0.0533853913
hlavu-vzhuru,HLAVU VZHŮRU,0.42,0.7275201668,0.3288578363,#330033,0.0458257569
suverenita-strana-zdraveho-rozumu,Suverenita – SZR,0.27,-0.4260211671,0.3294954726,#FFFF33,0.0367423461
strana-soukromniku-ceske-republiky,SSČR,0.26,-0.0013420871,0.3146225853,#FFCC00,0.0360555128
koruna-ceska-monarchisticka-strana-cech-moravy-a-slezska,Koruna česká,0.17,0.5539248594,-0.3906717848,#330033,0.0291547595
lev-21-narodni-socialiste,LEV 21,0.07,-0.3485472619,0.2626840594,#480000,0.0187082869
volte-pravy-blok-www-cibulka-net,Pravý blok,0.02,-0.3012594224,0.2696727615,#0066FF,0.01
klub-angazovanych-nestraniku,KAN,0.01,0.1999564512,-0.2793197279,#006666,0.0070710678
obcane-2011,Občané 2011,0.01,-0.4816284216,-0.0267336646,#00FFFF,0.0070710678