block by michalskop eccd4896fcc092ffeba37ea074d7aa75

CZ: Elections 2017

Full Screen

actors.csv

id,name,abbreviation,color,gain
1,Občanská demokratická strana,ODS,#004494,0.1123
2,Řád národa - Vlastenecká unie,ŘN-VU,#2b468b,0.0017
3,Cesta odpovědné společnosti,CESTA,#ab2324,0.0007
4,Česká strana sociálně demokratická,ČSSD,#F07D00,0.0727
5,Volte Pravý Blok www.cibulka.net,PB,#888888,0
6,Radostné Česko,RČ,#51ecf2,0.0007
7,Starostové a nezávislí,STAN,#5d8c00,0.0518
8,Komunistická strana Čech a Moravy,KSČM,#8c0000,0.0776
9,Strana zelených,Zelení,#06b15d,0.0146
10,ROZUMNÍ – stop migraci a diktátu EU,Rozumní,#6fb7c5,0.0072
11,Společnost proti developerské výstavbě v Prokopském údolí,SPDVPÚ,#676767,0
12,Strana svobodných občanů,Svobodní,#009982,0.0156
13,Blok proti islamizaci - Obrana domova,BPI,#e30613,0.001
14,Občanská demokratická aliance,ODA,#002d72,0.0015
15,Česká pirátská strana,Piráti,#000000,0.1079
16,Občané 2011,Občané 2011,#CBD4FF,0
17,"Unie hrdosti, aktivity, vlastenectví, empatie a lidskosti 2017",HAVEL,#777777,0
18,Česká národní fronta,ČNF,#F8F8F8,0
19,Referendum o Evropské unii,REU,#034ea2,0.0008
20,TOP 09,TOP 09,#723769,0.0531
21,ANO 2011,ANO,#261060,0.2964
22,Dobrá volba 2016,DV 2016,#d60a1e,0.0007
23,Sdružení pro republiku - Republikánská strana Československa Miroslava Sládka,SPR-RSČ,#ed1f24,0.0019
24,Křesťansko-demokratická unie - Československá strana lidová,KDU-ČSL,#e6ac21,0.058
25,Česká strana národně sociální,ČSNS,#ffd132,0
26,Realisté,Realisté,#013888,0.0071
27,Sportovci pro společnost,SPS,#999999,0.002
28,Dělnická strana sociální spravedlnosti,DSSS,#183F7C,0.002
29,Svoboda a přímá demokracie - Tomio Okamura,SPD,#0066a5,0.1064
30,Strana práv občanů,SPO,#115787,0.0036
31,Národ Sobě,NáS,#e8e5ce,0

d3.tip.js

// 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   = getNodeEl(),
          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 = getNodeEl()
      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 getNodeEl().attr(n)
      } else {
        var args =  Array.prototype.slice.call(arguments)
        d3.selection.prototype.attr.apply(getNodeEl(), 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 getNodeEl().style(n)
      } else {
        var args =  Array.prototype.slice.call(arguments)
        d3.selection.prototype.style.apply(getNodeEl(), 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
    }

    // Public: destroys the tooltip and removes it from the DOM
    //
    // Returns a tip
    tip.destroy = function() {
      if(node) {
        getNodeEl().remove();
        node = null;
      }
      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
    }

    function getNodeEl() {
      if(node === null) {
        node = initNode();
        // re-add node to DOM
        document.body.appendChild(node);
      };
      return d3.select(node);
    }

    // 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
  };

}));

index_print.html

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="utf-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <meta name="author" content="Michal Škop, KohoVolit.eu">

        <link rel="stylesheet" href="//cdn.bootcss.com/bootswatch/3.3.6/readable/bootstrap.min.css">
        <link rel="stylesheet" href="//cdn.bootcss.com/leaflet/0.7.7/leaflet.css" />

        <script src="//cdn.bootcss.com/leaflet/0.7.7/leaflet.js"></script>
        <script src="//cdn.bootcss.com/d3/3.5.16/d3.min.js"></script>
        <script src="///cdn.bootcss.com/jquery/2.2.1/jquery.min.js"></script>
        <script src="//cdn.bootcss.com/bootstrap/3.3.6/js/bootstrap.min.js"></script>
        <script src="d3.tip.js"></script>

        <style type="text/css">
            .leaflet-tile-pane {
                opacity: .4
            }
            .leaflet-container {
                background-color: #fff;
            }
            html, body{
                width: 100%;
                height: 100%;
                /*margin: 0;
                padding: 0;*/
        	}
            #map {
                width: 100%;
                height: 92%;
            }
            circle {
                /*fill: #040;
                stroke: #040;*/
                cursor: pointer;
                /*fill-opacity: 0.8;*/
                /*stroke-opacity: 1;*/
                /*stroke-width: 4;*/
            }
            circle:hover {
                stroke-opacity: 1;
            }

            .bubbles {
                width: 100000px;
                height: 100000px;
            }

            /* this is because of Bootstrap - very important! */
            svg:not(:root) {
                overflow: visible;
            }

            /* D3 tips */
            .d3-tip {
                line-height: 1.5;
                /*font-weight: bold;*/
                padding: 12px;
                background: rgba(0, 0, 0, 0.8);
                color: #fff;
                border-radius: 2px;
            }
            .d3-tip small {
                font-size: 0.5em;
            }
            /* Style northward tooltips differently */
            .d3-tip.n:after {
                margin: -1px 0 0 0;
                top: 100%;
                left: 0;
            }
            .d3-tip-number {
                text-align: right;
                padding-left: 1em;
            }
            .stronger {
                color: yellow;
                font-weight: bold;
            }
            /*overwrite bootstrap*/
            .navbar {
                margin-bottom: 0;
            }
            @media (max-width: 750px) {
                .computer {
                    display: none;
                }
            }
            @media (min-width: 750px) {
                .mobile {
                    display: none;
                }
            }
            .top {
                width: 100vw;
                padding: 10px;
                color: white;
                margin: 0;
                /*font-size: 3em;*/
                /*background-color: #fed201;*/
            }


        </style>

    <body>
        <h1 class="text-center top bg-primary">
            CZECH REPUBLIC 2017: WINNING PARTIES
        </h1>


        <div id="map"></div>

        <div class="alert alert-info" id="legend" style="position:absolute;top:100px;">
            <span style="color:white">Bubble Size ~ Number of Voters</span><br />
            <span style="color:white">Winning Parties:<br />
                <span>
                <svg height="20" width="20"><circle cx="10" cy="10" r="10" fill="#261060"></svg> ANO<br />
                <svg height="20" width="20"><circle cx="10" cy="10" r="10" fill="#004494"></svg> ODS<br />
                <svg height="20" width="20"><circle cx="10" cy="10" r="10" fill="#e6ac21"></svg> KDU-ČSL<br />
                <svg height="20" width="20"><circle cx="10" cy="10" r="10" fill="#5d8c00"></svg> STAN<br />
                </span>
            </small>
        </div>

<script type="text/javascript">
    // parameters:
    if (getUrlParameter('wheel'))
        var wheelZoom = getUrlParameter('wheel');
    else
        var wheelZoom = true;

    if (getUrlParameter('maxrange'))
        if (isNumeric(getUrlParameter('maxrange')))
            var maxrange = getUrlParameter('maxrange');
        else
            var maxrange = 55;
    else
        var maxrange = 55;
    if (getUrlParameter('zoom'))
        if (isNumeric(getUrlParameter('zoom')))
            var defaultzoom = getUrlParameter('zoom');
        else
            var defaultzoom = 8;
    else
        var defaultzoom = 8;
    var defaultposition = [50,15]
    var csvm = "municipalities.csv"
    var csva = "actors.csv"
    var parties = ["ODS", "ŘN-VU", "CESTA", "ČSSD", "PB", "RČ", "STAN", "KSČM", "Zelení", "Rozumní", "SPDVPÚ", "Svobodní", "BPI", "ODA", "Piráti", "Občané 2011", "HAVEL", "ČNF", "REU", "TOP 09", "ANO", "DV 2016", "SPR-RSČ", "KDU-ČSL", "ČSNS", "Realisté", "SPS", "DSSS", "SPD", "SPO", "NáS"]

    // Create the map




    var map = L.map('map', {'zoomControl':false, scrollWheelZoom: wheelZoom}).setView(defaultposition, defaultzoom);
    map.on('click', function() {
      if (map.scrollWheelZoom.enabled()) {
        map.scrollWheelZoom.disable();
        }
        else {
        map.scrollWheelZoom.enable();
        }
      });
    // add an OpenStreetMap tile layer
    // also see //wiki.openstreetmap.org/wiki/Tiles
    L.tileLayer('//{s}.www.toolserver.org/tiles/bw-mapnik/{z}/{x}/{y}.png', {
        attribution: 'CC-BY Michal Škop | &copy; <a href="//osm.org/copyright">OpenStreetMap</a> contributors | '
    }).addTo(map);
    L.control.zoom({"position":"topright"}).addTo(map);

    //svg
    var svg = d3.select(map.getPanes().overlayPane).append("svg").attr("class", "bubbles");

    /* Initialize tooltip */
    var tip = changetooltip();

    /* Invoke the tip in the context of your visualization */
    svg.call(tip);

    // Add tooltip div
    var div = d3.select("body").append("div")
        .attr("class", "tooltip")
        .style("opacity", 1e-6);

    //visualization
    d3.csv(csvm, function(geos) {
        d3.csv(csva, function(actorsar) {

            geos.sort(function(a, b) {
                return parseFloat(b.population) - parseFloat(a.population);
            });

            //reorder votes
            var votes = {};
            for(i=0;i<geos.length;i++) {

                if (typeof(votes[geos[i]['id']]) == 'undefined') {
                    votes[geos[i]['id']] = {
                        'population': parseInt(geos[i]['population']),
                        'n': []
                    }
                }
                for (var k in parties) {
                    var p = parties[k];
                    var v = parseInt(geos[i][p]);
                    votes[geos[i]['id']]['n'].push({'n': v, 'abbreviation': p})
                }
                // sort
                votes[geos[i]['id']]['n'].sort(function(a, b) {
                    return parseFloat(b.n) - parseFloat(a.n);
                });
                // v = parseInt(votesar[i]['votes']);
                // votes[votesar[i]['municipality_id']]['population'] += v;
                // votes[votesar[i]['municipality_id']]['n'].push({'n': v, 'id': votesar[i]['actor_id']})
            }

            //max population
            maxpopulation = 0
            for (var k in votes) {
                if ((typeof(votes[k].population) != 'undefined') && (votes[k].population > maxpopulation))
                    maxpopulation = votes[k].population;
            }
            if (getUrlParameter('maxdomain'))
                if (isNumeric(getUrlParameter('maxdomain')))
                    var maxdomain = getUrlParameter('maxdomain');
                else
                    var maxdomain = maxpopulation;
            else
                var maxdomain = maxpopulation;

            //scale
            var radiusScale = d3.scale.sqrt().domain([0, maxdomain]).range([0, maxrange]);

            //mapping
            actors = toObjectWithAbbr(actorsar);
            nodes = geos
                .map(function(d) {
                    var mpoint = projectPoint(d.latitude,d.longitude);
                    if (typeof(votes[d.id]) != 'undefined')
                        var r = radiusScale(votes[d.id].population);
                    else
                        var r = 0;
                    return {
                        x: mpoint.x,
                        y: mpoint.y,
                        r: r,
                        name: d.name,
                        value: d,  //including whole d ?
                        actors: votes[d.id]
                    }
                });

                //adding circles
                var circle = svg.selectAll("svg")
                    .data(nodes)
                    .enter().append("svg:svg")
                    .append("svg:circle")
                    .attr("class","bubble")
                    .attr("cx", function (d) {return d.x})
                    .attr("cy", function (d) {return d.y})
                    .attr("r", function (d) {
                        return d.r
                    })
                    .attr("fill", function (d) {
                        if ((typeof(d.actors) != 'undefined') && (typeof(actors[d.actors.n[0].abbreviation]) != 'undefined')) {
                            if (typeof(actors[d.actors.n[0].abbreviation].color) == 'undefined') return '#ccf'; else return actors[d.actors.n[0].abbreviation].color;
                        } else {
                            return '#ccf';
                        }
                    })
                    .attr("stroke",function (d) {return actors[d.actors.n[0].abbreviation].color;})
                    .on("mouseover", tip.show)
                    .on("mouseout", tip.hide)
                    .on("click", tip.show)
                    .attr("fill-opacity", 0.8)

                //on zoom or map movement, //leafletjs.com/reference.html#events
                map.on("viewreset", changeit);
                map.on("moveend", changeit);
                //map.on("move", hidepoints);   //not needed
                map.on("zoomstart", hidepoints);
                $(".bubbles").show(100);

        });
    });

    //helper function matrix to values
    function matrixVal(s) {
        return s.split('(')[1].split(')')[0].split(',');
    }

    //hide points
    function hidepoints() {
        $(".bubbles").hide();
    }

    // adjust points after map change (zoom, move)
    function changeit() {
        //Chromium/Chrome does not support well changes, so:
        var s = $(".leaflet-map-pane").css("-webkit-transform");  //chromium, opera
        if (typeof(s) == 'undefined')
        var s = $(".leaflet-map-pane").css("transform");  //ff
        var sar = matrixVal(s);

        //if towns in svg: (not used if it is div)
        $(".bubbles").css('left',-1*parseFloat(sar[4]));
        $(".bubbles").css('top',-1*parseFloat(sar[5]));

        d3.selectAll(".bubble").each(function(d,i) {
        //set correct x,y
            mpoint = projectPoint(d.value.latitude,d.value.longitude,d.value.id);
            $(this)
                .attr("r",
                d.r * Math.pow(map.getZoom(),5) / Math.pow(defaultzoom,5)	//power of 3 to show the results better in small scale
            )
            /*.attr("stroke-width",
            Math.abs(radiusScale(d.value.population.p9)-radiusScale(d.value.population.p6)) * Math.pow(map.getZoom(),3) / 729	//power of 3 to show the results better in small scale
            )*/
            .attr("cx", mpoint.x)
            .attr("cy", mpoint.y);

            //Reposition the SVG to cover the features.
            //note: if towns is div, next lines are needed; if it is svg, it is different:
            $(this).attr('transform',"translate(" + sar[4] + "," + sar[5] + ")");
            /*$(this).parent().css('left',-1*parseFloat(sar[4]));
            $(this).parent().css('top',-1*parseFloat(sar[5]));*/


        });
        $(".bubbles").show(300);

    }

    //tooltip
    function changetooltip() {
      tip = d3.tip().attr('class', 'd3-tip').html(function(d) {
        html = '<span class="stronger">' + d.name + "</span><br>";
        if (typeof(d.actors.n) != 'undefined') {
          html += "<table>"
          $.each(d.actors.n, function(i,v) {

              if (i < 9) {
                  html += "<tr><td><strong>" + actors[v.abbreviation].abbreviation + '</strong><td class="d3-tip-number"> <strong>' + Math.round(1000*parseInt(v.n)/parseInt(d.actors.population))/10 +"% " +  " </strong><td class='d3-tip-number'> " + parseInt(v.n).toLocaleString();
              }
          });
          html += "</table>"
        }
        /*if (typeof(d.value.description) != 'undefined') {
          html += d.value.description;
        }*/
        /*else
          html += 'Ešte nie je rozhodnuté';*/

        return html;
      });
      return tip;
    }

    // Use Leaflet to implement a D3 geometric transformation.
    function projectPoint(x, y, id) {
        var point = map.latLngToLayerPoint(new L.LatLng(x, y));
        if (!isNumeric(point.x)) alert(id);
        return point;
    }

    // helper function
    function toObjectWithAbbr(arr) {
      var rv = {};
      for (var i = 0; i < arr.length; ++i)
        rv[arr[i]['abbreviation']] = arr[i];
      return rv;
    }

    // helper function in debugging
    function isNumeric(n) {
      return !isNaN(parseFloat(n)) && isFinite(n);
    }

    //helper function for default values
    function getUrlParameter(sParam) {
        var sPageURL = decodeURIComponent(window.location.search.substring(1)),
            sURLVariables = sPageURL.split('&'),
            sParameterName,
            i;

        for (i = 0; i < sURLVariables.length; i++) {
            sParameterName = sURLVariables[i].split('=');

            if (sParameterName[0] === sParam) {
                return sParameterName[1] === undefined ? true : sParameterName[1];
            }
        }
    };
</script>
<!-- Piwik -->
<script type="text/javascript">
  var _paq = _paq || [];
  // tracker methods like "setCustomDimension" should be called before "trackPageView"
  _paq.push(['trackPageView']);
  _paq.push(['enableLinkTracking']);
  (function() {
    var u="//piwik.kohovolit.eu/";
    _paq.push(['setTrackerUrl', u+'piwik.php']);
    _paq.push(['setSiteId', '4']);
    var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0];
    g.type='text/javascript'; g.async=true; g.defer=true; g.src=u+'piwik.js'; s.parentNode.insertBefore(g,s);
  })();
</script>
<!-- End Piwik Code -->
<script>
  (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
  (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
  m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
  })(window,document,'script','//www.google-analytics.com/analytics.js','ga');

  ga('create', 'UA-8592359-13', 'ocks.org');
  ga('send', 'pageview');

</script>

</html>

regions_1.csv

id,name,region,region_id,population,ODS,ŘN-VU,CESTA,ČSSD,PB,RČ,STAN,KSČM,Zelení,Rozumní,SPDVPÚ,Svobodní,BPI,ODA,Piráti,Občané 2011,HAVEL,ČNF,REU,TOP 09,ANO,DV 2016,SPR-RSČ,KDU-ČSL,ČSNS,Realisté,SPS,DSSS,SPD,SPO,NáS
1100,Hlavní město Praha,Hlavní město Praha,1100,611450,99182,642,407,34079,491,221,30920,28158,14686,2600,438,12857,472,943,107590,177,93,0,423,77325,124445,358,539,29143,182,5851,1243,565,35547,1873,0
2100,Středočeský kraj,Středočeský kraj,2100,649987,84093,1348,406,43358,0,453,52602,47592,8717,5064,0,10488,677,854,77752,0,342,0,543,39100,188521,364,1196,19149,216,4155,1146,1203,59049,1599,0
3100,Jihočeský kraj,Jihočeský kraj,3100,315319,38232,557,255,23035,0,439,14435,29414,4326,2435,0,5303,270,613,33143,0,0,0,267,16713,91012,204,556,16983,243,3327,636,762,31062,1097,0
3200,Plzeňský kraj,Plzeňský kraj,3200,271510,32833,558,184,21643,0,395,13180,23502,3321,2395,0,4138,328,724,27201,182,0,0,224,13095,84114,0,603,9499,136,2009,1009,631,28686,920,0
4100,Karlovarský kraj,Karlovarský kraj,4100,122142,10796,896,0,8530,0,0,6453,9960,1549,1231,0,1544,211,280,12264,0,0,0,153,4495,43268,0,343,2885,0,799,311,428,15233,513,0
4200,Ústecký kraj,Ústecký kraj,4200,339686,32197,631,234,22464,0,0,12299,33628,5013,2920,0,4595,466,811,28004,0,0,0,321,12336,127574,292,1275,6127,113,2048,476,1527,42777,1558,0
5100,Liberecký kraj,Liberecký kraj,5100,208817,21468,327,196,11811,0,0,26780,13981,2907,1719,0,3152,192,405,23859,0,0,0,182,8825,62302,269,481,4297,135,1290,356,374,22878,631,0
5200,Královéhradecký kraj,Královéhradecký kraj,5200,278720,32242,531,297,18128,0,275,14184,19792,3650,2388,0,4310,284,322,29932,0,0,0,276,14308,88551,380,619,16294,0,2037,431,600,28038,851,0
5300,Pardubický kraj,Pardubický kraj,5300,258169,28313,509,355,19294,0,258,12855,20002,3261,2429,0,3998,186,385,27146,0,0,0,225,10864,79551,250,480,17599,0,1492,564,722,26202,1229,0
6100,Kraj Vysočina,Kraj Vysočina,6100,262764,25989,324,137,24631,0,306,11251,24829,3204,2070,0,3565,235,261,26086,0,0,0,219,10163,75247,0,600,24295,89,1562,584,556,25237,1324,0
6200,Jihomoravský kraj,Jihomoravský kraj,6200,583442,69319,768,477,49248,0,383,21222,46966,9147,3781,0,10421,448,930,53207,0,0,0,532,26356,159909,522,1222,52346,173,3849,1471,859,67973,1613,300
7100,Olomoucký kraj,Olomoucký kraj,7100,305639,27266,426,282,22760,0,307,13580,26853,3588,1942,0,3963,436,448,25955,0,0,0,213,9903,95950,248,488,25257,117,1678,766,675,41397,1141,0
7200,Zlínský kraj,Zlínský kraj,7200,294679,28752,615,195,20454,0,220,17168,20669,3685,1747,0,4812,299,393,24859,0,0,0,245,8443,84750,184,477,33631,0,2138,537,417,38020,1969,0
8100,Moravskoslezský kraj,Moravskoslezský kraj,8100,547789,40944,598,327,48417,0,592,14462,47651,6583,3790,0,5892,568,654,47332,0,0,117,450,14142,194069,650,970,35362,166,3664,1057,1083,76027,2222,0
9999,Zahraničí,Zahraničí,9999,10494,1315,5,6,483,0,3,753,97,695,14,0,189,4,7,2045,0,1,0,3,2738,800,1,7,776,3,96,6,0,431,16,0

regions_2.csv

id,name,region,region_id,population,ODS,ŘN-VU,CESTA,ČSSD,PB,RČ,STAN,KSČM,Zelení,Rozumní,SPDVPÚ,Svobodní,BPI,ODA,Piráti,Občané 2011,HAVEL,ČNF,REU,TOP 09,ANO,DV 2016,SPR-RSČ,KDU-ČSL,ČSNS,Realisté,SPS,DSSS,SPD,SPO,NáS
1100,Hlavní město Praha,Hlavní město Praha,1100,611450,99182,642,407,34079,491,221,30920,28158,14686,2600,438,12857,472,943,107590,177,93,0,423,77325,124445,358,539,29143,182,5851,1243,565,35547,1873,0
2101,Benešov,Středočeský kraj,2100,50386,5279,70,23,3748,0,24,4371,3805,567,341,0,658,47,54,5334,0,32,0,48,2289,16251,23,101,2267,18,300,106,116,4413,101,0
2102,Beroun,Středočeský kraj,2100,44601,6675,90,39,3105,0,26,2155,3845,636,358,0,842,39,72,5535,0,26,0,30,2568,12652,25,93,1245,13,255,74,93,4002,108,0
2103,Kladno,Středočeský kraj,2100,74107,8797,111,40,5068,0,93,4151,6767,1014,591,0,1416,75,84,8682,0,35,0,66,3760,22227,52,177,1562,27,508,114,172,8319,199,0
2104,Kolín,Středočeský kraj,2100,48207,4604,150,23,3223,0,32,8841,4057,431,300,0,653,49,53,4173,0,25,0,22,1827,13707,16,89,1056,12,289,69,80,4280,146,0
2105,Kutná Hora,Středočeský kraj,2100,36827,3443,131,27,3552,0,21,3674,3240,296,289,0,380,46,38,3461,0,18,0,23,1302,11689,16,82,1263,8,165,69,55,3448,91,0
2106,Mělník,Středočeský kraj,2100,49063,6343,115,28,3107,0,24,3349,3822,672,439,0,910,65,53,5718,0,24,0,69,2342,14820,31,105,1098,14,303,95,120,5253,144,0
2107,Mladá Boleslav,Středočeský kraj,2100,58562,6990,115,37,4213,0,40,4080,4033,809,630,0,841,68,71,5812,0,33,0,44,2559,19991,35,129,1314,21,353,157,95,5953,139,0
2108,Nymburk,Středočeský kraj,2100,47177,5626,93,23,3527,0,36,3573,3288,627,418,0,641,46,71,5305,0,35,0,55,2670,14730,24,101,1425,23,248,100,95,4295,102,0
2109,Praha-východ,Středočeský kraj,2100,85497,15295,269,62,4049,0,49,6721,3891,1252,573,0,1564,85,138,12917,0,42,0,68,7457,20818,41,120,2676,33,668,113,124,6272,200,0
2110,Praha-západ,Středočeský kraj,2100,70884,12048,91,65,3120,0,45,5925,3079,1340,431,0,1348,70,118,11210,0,37,0,69,8243,15662,57,67,2334,14,572,91,93,4594,161,0
2111,Příbram,Středočeský kraj,2100,58185,6438,80,29,4299,0,41,4082,4965,785,506,0,860,62,77,6853,0,24,0,25,2896,17588,32,87,2382,14,331,103,113,5381,132,0
2112,Rakovník,Středočeský kraj,2100,26491,2555,33,10,2347,0,22,1680,2800,288,188,0,375,25,25,2752,0,11,0,24,1187,8386,12,45,527,19,163,55,47,2839,76,0
3101,České Budějovice,Jihočeský kraj,3100,97068,12861,112,74,6163,0,116,5123,8126,1499,616,0,1985,82,205,10175,0,0,0,71,5689,27065,83,151,5023,95,1519,236,200,9483,316,0
3102,Český Krumlov,Jihočeský kraj,3100,27586,3370,50,30,1760,0,63,1015,2760,393,264,0,425,25,61,2562,0,0,0,27,1342,8274,33,41,1447,36,297,42,151,3042,76,0
3103,Jindřichův Hradec,Jihočeský kraj,3100,45365,5009,75,42,3917,0,57,1589,4814,634,355,0,774,44,91,4668,0,0,0,28,1877,13011,20,106,2995,34,283,72,84,4637,149,0
3104,Písek,Jihočeský kraj,3100,34981,4174,125,22,2756,0,44,1167,3487,402,253,0,538,39,69,4011,0,0,0,32,1990,9866,19,55,1939,14,245,63,72,3437,162,0
3105,Prachatice,Jihočeský kraj,3100,23730,3270,66,18,1724,0,33,1184,2403,329,172,0,334,16,38,2179,0,0,0,14,1057,6588,12,47,1409,11,182,50,68,2416,110,0
3106,Strakonice,Jihočeský kraj,3100,34379,3660,71,26,2565,0,54,1451,3163,384,299,0,424,27,60,3651,0,0,0,47,1538,10599,20,74,1980,21,344,95,100,3598,128,0
3107,Tábor,Jihočeský kraj,3100,52210,5888,58,43,4150,0,72,2906,4661,685,476,0,823,37,89,5897,0,0,0,48,3220,15609,17,82,2190,32,457,78,87,4449,156,0
3201,Domažlice,Plzeňský kraj,3200,27834,3084,43,15,2492,0,42,1630,2756,245,364,0,258,31,58,2217,12,0,0,15,756,8570,0,65,1442,13,185,68,55,3337,81,0
3202,Klatovy,Plzeňský kraj,3200,42977,4874,112,27,3500,0,81,2306,3688,413,436,0,490,41,69,4303,23,0,0,34,1691,13792,0,89,2071,24,213,130,109,4333,128,0
3203,Plzeň-město,Plzeňský kraj,3200,88649,12744,170,79,6694,0,101,3605,5649,1341,513,0,1790,101,336,10228,59,0,0,72,6279,25430,0,177,3299,31,832,338,170,8334,277,0
3204,Plzeň-jih,Plzeňský kraj,3200,29576,3249,72,26,2506,0,56,1601,2940,373,253,0,430,47,78,2575,38,0,0,21,1268,9355,0,60,725,14,198,136,90,3359,106,0
3205,Plzeň-sever,Plzeňský kraj,3200,37720,4511,62,22,2966,0,59,2131,3428,405,366,0,608,64,101,3573,22,0,0,38,1605,11775,0,114,967,41,301,200,96,4128,137,0
3206,Rokycany,Plzeňský kraj,3200,23189,2762,62,6,1772,0,29,967,2350,285,222,0,340,28,56,2271,14,0,0,22,891,7510,0,61,543,5,186,76,53,2564,114,0
3207,Tachov,Plzeňský kraj,3200,21565,1609,37,9,1713,0,27,940,2691,259,241,0,222,16,26,2034,14,0,0,22,605,7682,0,37,452,8,94,61,58,2631,77,0
4101,Cheb,Karlovarský kraj,4100,36295,3084,174,0,2495,0,0,1889,3348,549,306,0,381,76,100,4075,0,0,0,42,1212,12804,0,104,979,0,180,58,89,4242,108,0
4102,Karlovy Vary,Karlovarský kraj,4100,50455,5049,265,0,3366,0,0,3062,3635,624,544,0,592,70,130,5323,0,0,0,67,2265,17039,0,115,1295,0,383,165,172,6077,217,0
4103,Sokolov,Karlovarský kraj,4100,35392,2663,457,0,2669,0,0,1502,2977,376,381,0,571,65,50,2866,0,0,0,44,1018,13425,0,124,611,0,236,88,167,4914,188,0
4201,Děčín,Ústecký kraj,4200,54782,4510,84,48,3607,0,0,2480,4602,650,513,0,756,99,120,4523,0,0,0,47,1904,21405,41,217,1082,27,309,62,258,7095,343,0
4202,Chomutov,Ústecký kraj,4200,48315,4292,114,22,3225,0,0,1612,4920,644,473,0,682,60,121,3792,0,0,0,40,1328,18894,33,174,690,19,320,62,142,6471,185,0
4203,Litoměřice,Ústecký kraj,4200,55822,6457,131,42,3507,0,0,2220,6030,876,535,0,915,84,97,5279,0,0,0,47,2344,18770,54,181,1393,20,325,98,215,6010,192,0
4204,Louny,Ústecký kraj,4200,37739,3526,57,17,2676,0,0,992,4418,461,324,0,397,56,47,2715,0,0,0,33,1394,14295,24,147,771,14,211,54,164,4798,148,0
4205,Most,Ústecký kraj,4200,42560,3594,114,26,2980,0,0,1503,4536,788,293,0,540,36,68,3023,0,0,0,56,1241,16740,17,175,448,13,244,42,250,5614,219,0
4206,Teplice,Ústecký kraj,4200,51109,5137,65,27,3444,0,0,1492,4697,733,463,0,585,71,112,4143,0,0,0,54,1970,19476,34,213,871,13,252,90,269,6693,205,0
4207,Ústí nad Labem,Ústecký kraj,4200,49359,4681,66,52,3025,0,0,2000,4425,861,319,0,720,60,246,4529,0,0,0,44,2155,17994,89,168,872,7,387,68,229,6096,266,0
5101,Česká Lípa,Liberecký kraj,5100,44257,3703,49,27,2709,0,0,5261,3905,613,373,0,613,55,71,4288,0,0,0,34,1386,14264,59,121,624,41,231,72,120,5471,167,0
5102,Jablonec nad Nisou,Liberecký kraj,5100,43345,5390,38,37,2319,0,0,4150,2627,532,413,0,677,44,58,6137,0,0,0,79,2039,12468,38,83,695,26,335,72,79,4857,152,0
5103,Liberec,Liberecký kraj,5100,81516,7735,138,75,4580,0,0,11494,4909,1303,542,0,1222,62,221,8883,0,0,0,40,3654,25335,89,196,1360,40,519,144,111,8647,217,0
5104,Semily,Liberecký kraj,5100,39699,4640,102,57,2203,0,0,5875,2540,459,391,0,640,31,55,4551,0,0,0,29,1746,10235,83,81,1618,28,205,68,64,3903,95,0
5201,Hradec Králové,Královéhradecký kraj,5200,85218,9888,155,122,5241,0,74,3589,5968,1233,624,0,1506,76,135,9743,0,0,0,66,5676,26916,149,116,4550,0,895,152,131,7954,259,0
5202,Jičín,Královéhradecký kraj,5200,40060,4017,104,61,2674,0,41,3374,3003,483,416,0,530,41,40,4478,0,0,0,28,1636,13202,56,111,1730,0,294,64,89,3455,133,0
5203,Náchod,Královéhradecký kraj,5200,54949,6059,98,34,4259,0,69,2359,3391,717,427,0,742,45,49,5391,0,0,0,62,2577,17194,74,118,4875,0,297,74,127,5767,144,0
5204,Rychnov nad Kněžnou,Královéhradecký kraj,5200,39550,4184,80,35,2599,0,30,1711,3219,479,396,0,642,46,41,3789,0,0,0,43,1685,12682,54,138,2849,0,215,49,93,4336,155,0
5205,Trutnov,Královéhradecký kraj,5200,58943,8094,94,45,3355,0,61,3151,4211,738,525,0,890,76,57,6531,0,0,0,77,2734,18557,47,136,2290,0,336,92,160,6526,160,0
5301,Chrudim,Pardubický kraj,5300,52753,5178,75,78,4124,0,50,2620,4702,532,460,0,812,34,62,5191,0,0,0,43,1752,17187,36,105,3743,0,309,88,111,5103,358,0
5302,Pardubice,Pardubický kraj,5300,84478,10524,128,138,6044,0,64,4132,6064,1168,603,0,1444,66,167,9291,0,0,0,66,4262,26804,124,167,3908,0,632,167,182,8044,289,0
5303,Svitavy,Pardubický kraj,5300,51441,5388,126,41,4319,0,57,2489,4613,572,687,0,697,39,50,4900,0,0,0,48,1791,14932,41,92,4681,0,221,138,173,5201,145,0
5304,Ústí nad Orlicí,Pardubický kraj,5300,69497,7223,180,98,4807,0,87,3614,4623,989,679,0,1045,47,106,7764,0,0,0,68,3059,20628,49,116,5267,0,330,171,256,7854,437,0
6101,Havlíčkův Brod,Kraj Vysočina,6100,49372,5482,91,20,4162,0,55,2244,4808,689,414,0,561,31,62,5106,0,0,0,37,1771,15388,0,91,3504,14,316,101,108,4181,136,0
6102,Jihlava,Kraj Vysočina,6100,56391,5920,66,40,4468,0,57,2040,4856,906,452,0,919,55,59,5924,0,0,0,52,2441,15552,0,138,4982,20,432,151,133,6458,270,0
6103,Pelhřimov,Kraj Vysočina,6100,37285,4002,61,16,4421,0,40,2195,3470,433,252,0,552,22,35,3900,0,0,0,23,1557,10202,0,98,2526,9,180,73,73,3061,84,0
6104,Třebíč,Kraj Vysočina,6100,58131,4956,46,18,5010,0,72,2540,6245,558,500,0,777,51,56,5406,0,0,0,50,1859,17126,0,159,5408,24,304,134,113,6491,228,0
6105,Žďár nad Sázavou,Kraj Vysočina,6100,61585,5629,60,43,6570,0,82,2232,5450,618,452,0,756,76,49,5750,0,0,0,57,2535,16979,0,114,7875,22,330,125,129,5046,606,0
6201,Blansko,Jihomoravský kraj,6200,55661,5480,50,44,5406,0,30,1862,5561,739,428,0,885,41,92,4955,0,0,0,52,1631,15327,42,138,5866,23,309,136,92,6287,164,21
6202,Brno-město,Jihomoravský kraj,6200,185636,28601,127,192,14396,0,109,6661,10269,4467,774,0,3716,131,308,20718,0,0,0,190,12924,45592,162,334,14273,57,1754,528,201,18674,398,80
6203,Brno-venkov,Jihomoravský kraj,6200,111932,13611,105,92,8301,0,96,5044,8558,1561,731,0,2105,90,183,9778,0,0,0,140,5288,30941,85,230,10313,32,713,355,161,13079,271,69
6204,Břeclav,Jihomoravský kraj,6200,56358,6474,78,44,4223,0,30,2371,5315,616,489,0,943,42,84,4693,0,0,0,32,1884,16676,112,102,4532,13,254,103,82,7007,125,34
6205,Hodonín,Jihomoravský kraj,6200,75389,6897,273,56,6690,0,44,2502,6812,791,518,0,1311,56,117,5982,0,0,0,50,1911,21326,49,175,9380,24,360,143,138,9543,202,39
6206,Vyškov,Jihomoravský kraj,6200,44518,4015,70,25,5452,0,35,1276,4822,516,390,0,724,37,64,3580,0,0,0,41,1131,11530,31,138,4053,4,224,115,98,5892,225,30
6207,Znojmo,Jihomoravský kraj,6200,53948,4241,65,24,4780,0,39,1506,5629,457,451,0,737,51,82,3501,0,0,0,27,1587,18517,41,105,3929,20,235,91,87,7491,228,27
7101,Jeseník,Olomoucký kraj,7100,17911,1237,18,13,1353,0,19,1099,1781,162,111,0,183,24,15,1293,0,0,0,16,722,5949,19,46,785,8,90,32,39,2859,38,0
7102,Olomouc,Olomoucký kraj,7100,112995,11288,143,99,8563,0,116,4572,8664,1675,709,0,1642,184,196,11212,0,0,0,66,4803,34125,90,164,8935,32,763,392,209,13917,436,0
7103,Prostějov,Olomoucký kraj,7100,52738,4552,50,65,4558,0,45,1609,5238,645,357,0,578,63,72,4250,0,0,0,37,1398,15516,31,78,4733,30,223,107,223,8111,169,0
7104,Přerov,Olomoucký kraj,7100,63279,5533,114,36,4296,0,69,2191,5855,514,359,0,835,65,109,4501,0,0,0,44,1462,21108,68,105,6257,24,360,134,97,8827,316,0
7105,Šumperk,Olomoucký kraj,7100,58716,4656,101,69,3990,0,58,4109,5315,592,406,0,725,100,56,4699,0,0,0,50,1518,19252,40,95,4547,23,242,101,107,7683,182,0
7201,Kroměříž,Zlínský kraj,7200,52781,4389,115,31,3840,0,51,2140,5083,684,308,0,739,59,120,3984,0,0,0,53,1338,16004,36,96,4632,0,315,103,112,8250,299,0
7202,Uherské Hradiště,Zlínský kraj,7200,73007,7715,82,32,5173,0,41,4783,6038,840,360,0,1060,67,72,5894,0,0,0,65,1991,18781,35,101,9798,0,542,95,96,8751,595,0
7203,Vsetín,Zlínský kraj,7200,70320,7120,93,46,4894,0,61,3505,4089,973,526,0,1276,76,91,6239,0,0,0,49,1951,20528,48,128,8492,0,423,181,117,9089,325,0
7204,Zlín,Zlínský kraj,7200,98571,9528,325,86,6547,0,67,6740,5459,1188,553,0,1737,97,110,8742,0,0,0,78,3163,29437,65,152,10709,0,858,158,92,11930,750,0
8101,Bruntál,Moravskoslezský kraj,8100,40575,2763,47,18,3462,0,36,1327,4862,440,385,0,432,65,57,2940,0,0,5,52,794,14852,28,67,1314,5,240,65,93,6123,103,0
8102,Frýdek-Místek,Moravskoslezský kraj,8100,101439,7530,107,56,9301,0,155,3116,7694,1101,559,0,1116,87,90,8860,0,0,11,64,2253,34686,227,140,9769,32,748,179,145,13038,375,0
8103,Karviná,Moravskoslezský kraj,8100,106196,5839,170,48,10602,0,103,2277,11334,1041,763,0,851,88,120,7699,0,0,14,92,1696,40004,106,246,5193,42,476,142,188,16575,487,0
8104,Nový Jičín,Moravskoslezský kraj,8100,72390,6213,69,61,6003,0,84,1611,5785,1231,574,0,920,76,148,6986,0,0,13,58,1770,24248,88,112,5666,16,401,179,138,9729,211,0
8105,Opava,Moravskoslezský kraj,8100,85906,6782,75,59,7117,0,69,2490,5909,1012,590,0,872,89,76,7761,0,0,9,67,3667,30226,62,156,6902,31,585,149,170,10664,317,0
8106,Ostrava-město,Moravskoslezský kraj,8100,141283,11817,130,85,11932,0,145,3641,12067,1758,919,0,1701,163,163,13086,0,0,65,117,3962,50053,139,249,6518,40,1214,343,349,19898,729,0
9999,Zahraničí,Zahraničí,9999,10494,1315,5,6,483,0,3,753,97,695,14,0,189,4,7,2045,0,1,0,3,2738,800,1,7,776,3,96,6,0,431,16,0