Skip to content

Instantly share code, notes, and snippets.

@ale0xb
Last active May 11, 2019 12:05
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 ale0xb/2b8eb65eb5e3b6420ca1e67aec93ddef to your computer and use it in GitHub Desktop.
Save ale0xb/2b8eb65eb5e3b6420ca1e67aec93ddef to your computer and use it in GitHub Desktop.
Sobrerrepresentación en el sistema electoral español (2015-2019)
license: mit

Sobrerrepresentación en el sistema electoral español (2015-2019)

Cartograma de área continua (artículo, código) que muestra la sobrerrepresentación del voto a partidos nacionales en las 52 circuscripciones electorales españolas (años 2015, 2016 y 2019).

El área de una provincia es inversamente proporcional al coste en votos de un escaño en esa provincia. La intensidad del color viene determinada por la cantidad de escaños obtenidos por el partido seleccionado sobre el número total de escaños obtenidos por partidos nacionales en esa provincia. Los escaños obtenidos por partidos minoritarios no fueron tenidos en cuenta en este análisis.

Continuous area cartogram showing overrepresentation in the Spanish elections 2015-2019. Areas are inversely proportional to the cost in votes of each representative in the 52 circunscriptions. Showing only representatives obtained by national parties (nationalist and regional parties where excluded).

GeoJSON de España gracias a Martín González: es-atlas[https://github.com/martgnz/es-atlas]. Composite projection gracias a Roger Veciana: d3-composite-projections[https://github.com/rveciana/d3-composite-projections].

Datos de ine.es y datadista.

Built with blockbuilder.org

Made by Alex B. Sígueme en Twitter: ale0xb

{
"elecciones": {
"2019": {
"PSOE": {
"Ceuta": {
"s": 1,
"c": 13766
},
"Soria": {
"s": 1,
"c": 16463
},
"Cuenca": {
"s": 2,
"c": 21289.5
},
"Teruel": {
"s": 1,
"c": 25500
},
"Segovia": {
"s": 1,
"c": 25978
},
"Ávila": {
"s": 1,
"c": 26318
},
"La Rioja": {
"s": 2,
"c": 28530
},
"Ourense": {
"s": 2,
"c": 31328.5
},
"Burgos": {
"s": 2,
"c": 31977.5
},
"Lugo": {
"s": 2,
"c": 32989
},
"Palencia": {
"s": 1,
"c": 33058
},
"Zamora": {
"s": 1,
"c": 34357
},
"Albacete": {
"s": 2,
"c": 37383.5
},
"Lleida": {
"s": 1,
"c": 37415
},
"Araba/Álava": {
"s": 1,
"c": 39595
},
"Huesca": {
"s": 1,
"c": 41073
},
"Guadalajara": {
"s": 1,
"c": 42397
},
"Cantabria": {
"s": 2,
"c": 45072
},
"Illes Balears": {
"s": 3,
"c": 45452.66667
},
"València/Valencia": {
"s": 4,
"c": 98303.25
},
"Castelló/Castellón": {
"s": 2,
"c": 46037.5
},
"Cáceres": {
"s": 2,
"c": 46339.5
},
"Navarra": {
"s": 2,
"c": 47047
},
"Madrid": {
"s": 11,
"c": 93132.09091
},
"León": {
"s": 2,
"c": 47417
},
"Valladolid": {
"s": 2,
"c": 48404
},
"Huelva": {
"s": 2,
"c": 48778.5
},
"Almería": {
"s": 2,
"c": 49134
},
"Ciudad Real": {
"s": 2,
"c": 50262
},
"Jaén": {
"s": 3,
"c": 50836
},
"Tarragona": {
"s": 1,
"c": 89347
},
"Las Palmas": {
"s": 3,
"c": 51354.66667
},
"Badajoz": {
"s": 3,
"c": 52292
},
"Zaragoza": {
"s": 3,
"c": 57599.33333
},
"Granada": {
"s": 3,
"c": 58898.33333
},
"Salamanca": {
"s": 1,
"c": 59277
},
"Barcelona": {
"s": 9,
"c": 85157.66667
},
"Pontevedra": {
"s": 3,
"c": 61540.66667
},
"Toledo": {
"s": 2,
"c": 61633.5
},
"Málaga": {
"s": 4,
"c": 62741.25
},
"Murcia": {
"s": 3,
"c": 63297.66667
},
"Alacant/Alicante": {
"s": 4,
"c": 64648
},
"Girona": {
"s": 1,
"c": 65162
},
"Sevilla": {
"s": 5,
"c": 83146.4
},
"Córdoba": {
"s": 2,
"c": 81284
},
"Bizkaia": {
"s": 2,
"c": 68018.5
},
"Asturias": {
"s": 3,
"c": 68638.66667
},
"Cádiz": {
"s": 3,
"c": 69845
},
"Santa Cruz de Tenerife": {
"s": 2,
"c": 70419.5
},
"A Coruña": {
"s": 3,
"c": 70529
},
"Gipuzkoa": {
"s": 1,
"c": 77128
}
},
"PP": {
"Barcelona": {
"s": 1,
"c": 155504
},
"Melilla": {
"s": 1,
"c": 8082
},
"Soria": {
"s": 1,
"c": 13833
},
"Teruel": {
"s": 1,
"c": 18521
},
"Segovia": {
"s": 1,
"c": 24806
},
"Huesca": {
"s": 1,
"c": 25080
},
"Guadalajara": {
"s": 1,
"c": 28575
},
"Salamanca": {
"s": 2,
"c": 30146.5
},
"Palencia": {
"s": 1,
"c": 31229
},
"Ávila": {
"s": 1,
"c": 31904
},
"Cuenca": {
"s": 1,
"c": 31971
},
"Zamora": {
"s": 1,
"c": 32511
},
"Ourense": {
"s": 2,
"c": 33060.5
},
"Lugo": {
"s": 2,
"c": 33358.5
},
"Almería": {
"s": 2,
"c": 36787
},
"Madrid": {
"s": 7,
"c": 99986.28571
},
"Toledo": {
"s": 2,
"c": 43500.5
},
"Zaragoza": {
"s": 1,
"c": 99203
},
"Cádiz": {
"s": 1,
"c": 99142
},
"Las Palmas": {
"s": 2,
"c": 44098.5
},
"Huelva": {
"s": 1,
"c": 44929
},
"Granada": {
"s": 1,
"c": 96198
},
"La Rioja": {
"s": 1,
"c": 47747
},
"Albacete": {
"s": 1,
"c": 51739
},
"Burgos": {
"s": 1,
"c": 53726
},
"Cáceres": {
"s": 1,
"c": 57069
},
"A Coruña": {
"s": 3,
"c": 57261
},
"Alacant/Alicante": {
"s": 3,
"c": 59580
},
"Murcia": {
"s": 2,
"c": 89942.5
},
"Castelló/Castellón": {
"s": 1,
"c": 63672
},
"León": {
"s": 1,
"c": 68138
},
"Ciudad Real": {
"s": 1,
"c": 69504
},
"Córdoba": {
"s": 1,
"c": 89045
},
"Pontevedra": {
"s": 2,
"c": 71470.5
},
"Illes Balears": {
"s": 1,
"c": 87143
},
"Málaga": {
"s": 2,
"c": 72060.5
},
"Jaén": {
"s": 1,
"c": 75668
},
"València/Valencia": {
"s": 3,
"c": 85085.66667
},
"Santa Cruz de Tenerife": {
"s": 1,
"c": 76275
},
"Cantabria": {
"s": 1,
"c": 77668
},
"Valladolid": {
"s": 1,
"c": 78218
},
"Sevilla": {
"s": 2,
"c": 81261
},
"Badajoz": {
"s": 1,
"c": 83180
},
"Asturias": {
"s": 1,
"c": 111341
}
},
"CIUDADANOS": {
"Teruel": {
"s": 1,
"c": 15378
},
"Palencia": {
"s": 1,
"c": 16751
},
"Segovia": {
"s": 1,
"c": 18397
},
"Zaragoza": {
"s": 1,
"c": 115122
},
"Zamora": {
"s": 1,
"c": 18625
},
"Ávila": {
"s": 1,
"c": 19028
},
"Huesca": {
"s": 1,
"c": 24449
},
"Guadalajara": {
"s": 1,
"c": 26749
},
"La Rioja": {
"s": 1,
"c": 32063
},
"Cáceres": {
"s": 1,
"c": 42295
},
"Burgos": {
"s": 1,
"c": 43316
},
"Salamanca": {
"s": 1,
"c": 43623
},
"Asturias": {
"s": 1,
"c": 103864
},
"Albacete": {
"s": 1,
"c": 43716
},
"Huelva": {
"s": 1,
"c": 44698
},
"León": {
"s": 1,
"c": 50612
},
"Ciudad Real": {
"s": 1,
"c": 50624
},
"Castelló/Castellón": {
"s": 1,
"c": 50897
},
"Tarragona": {
"s": 1,
"c": 52154
},
"Cantabria": {
"s": 1,
"c": 54161
},
"Madrid": {
"s": 8,
"c": 98253.125
},
"Almería": {
"s": 1,
"c": 55972
},
"Sevilla": {
"s": 2,
"c": 93355
},
"Jaén": {
"s": 1,
"c": 61340
},
"Barcelona": {
"s": 4,
"c": 93023.5
},
"Pontevedra": {
"s": 1,
"c": 63333
},
"Granada": {
"s": 1,
"c": 90487
},
"Illes Balears": {
"s": 1,
"c": 90214
},
"Cádiz": {
"s": 2,
"c": 65574.5
},
"Valladolid": {
"s": 1,
"c": 67461
},
"Toledo": {
"s": 1,
"c": 69504
},
"Santa Cruz de Tenerife": {
"s": 1,
"c": 71431
},
"Murcia": {
"s": 2,
"c": 74973
},
"Alacant/Alicante": {
"s": 2,
"c": 88615.5
},
"Badajoz": {
"s": 1,
"c": 75425
},
"Málaga": {
"s": 2,
"c": 79378
},
"Córdoba": {
"s": 1,
"c": 79753
},
"A Coruña": {
"s": 1,
"c": 81261
},
"Las Palmas": {
"s": 1,
"c": 83832
},
"València/Valencia": {
"s": 3,
"c": 84487
}
},
"UP/PODEMOS": {
"Araba/Álava": {
"s": 1,
"c": 31346
},
"Huelva": {
"s": 1,
"c": 34233
},
"Castelló/Castellón": {
"s": 1,
"c": 43466
},
"Las Palmas": {
"s": 2,
"c": 45488.5
},
"Illes Balears": {
"s": 2,
"c": 46120.5
},
"Cádiz": {
"s": 2,
"c": 55118
},
"Málaga": {
"s": 2,
"c": 58913.5
},
"Bizkaia": {
"s": 2,
"c": 60614
},
"Asturias": {
"s": 1,
"c": 106630
},
"València/Valencia": {
"s": 2,
"c": 105264
},
"Alacant/Alicante": {
"s": 2,
"c": 63545.5
},
"Navarra": {
"s": 1,
"c": 68168
},
"Córdoba": {
"s": 1,
"c": 69737
},
"Madrid": {
"s": 6,
"c": 101633.6667
},
"Gipuzkoa": {
"s": 1,
"c": 70671
},
"Granada": {
"s": 1,
"c": 70941
},
"Santa Cruz de Tenerife": {
"s": 1,
"c": 75492
},
"Zaragoza": {
"s": 1,
"c": 77090
},
"Murcia": {
"s": 1,
"c": 79650
},
"Sevilla": {
"s": 2,
"c": 89368.5
},
"A Coruña": {
"s": 1,
"c": 99621
},
"Pontevedra": {
"s": 1,
"c": 99996
},
"Tarragona": {
"s": 1,
"c": 50797
},
"Barcelona": {
"s": 6,
"c": 84738
}
},
"VOX": {
"Ciudad Real": {
"s": 1,
"c": 40256
},
"Sevilla": {
"s": 1,
"c": 136654
},
"Badajoz": {
"s": 1,
"c": 44798
},
"Valladolid": {
"s": 1,
"c": 45794
},
"Alacant/Alicante": {
"s": 1,
"c": 115011
},
"Málaga": {
"s": 1,
"c": 113842
},
"Barcelona": {
"s": 1,
"c": 111810
},
"Córdoba": {
"s": 1,
"c": 56770
},
"Illes Balears": {
"s": 1,
"c": 58382
},
"Almería": {
"s": 1,
"c": 62529
},
"Toledo": {
"s": 1,
"c": 66807
},
"Madrid": {
"s": 5,
"c": 104083.4
},
"Zaragoza": {
"s": 1,
"c": 70413
},
"Asturias": {
"s": 1,
"c": 71454
},
"Murcia": {
"s": 2,
"c": 71505
},
"Granada": {
"s": 1,
"c": 73542
},
"València/Valencia": {
"s": 2,
"c": 84747.5
},
"Cádiz": {
"s": 1,
"c": 87123
}
}
},
"2016": {
"PP": {
"Almería": {
"s": 3,
"c": 43933.66667
},
"Cádiz": {
"s": 3,
"c": 66292
},
"Córdoba": {
"s": 2,
"c": 76875
},
"Granada": {
"s": 3,
"c": 57573.66667
},
"Huelva": {
"s": 2,
"c": 40979.5
},
"Jaén": {
"s": 2,
"c": 65617
},
"Málaga": {
"s": 4,
"c": 64008.25
},
"Sevilla": {
"s": 4,
"c": 74971
},
"Huesca": {
"s": 1,
"c": 42332
},
"Teruel": {
"s": 2,
"c": 15456.5
},
"Zaragoza": {
"s": 3,
"c": 59737
},
"Asturias": {
"s": 3,
"c": 69877.33333
},
"Illes Balears": {
"s": 3,
"c": 54348.33333
},
"Las Palmas": {
"s": 3,
"c": 56772
},
"Santa Cruz de Tenerife": {
"s": 3,
"c": 54376.33333
},
"Cantabria": {
"s": 2,
"c": 70126
},
"Albacete": {
"s": 2,
"c": 44858.5
},
"Ciudad Real": {
"s": 3,
"c": 40540.66667
},
"Cuenca": {
"s": 2,
"c": 26502
},
"Guadalajara": {
"s": 2,
"c": 26023.5
},
"Toledo": {
"s": 3,
"c": 53173.66667
},
"Ávila": {
"s": 2,
"c": 25465.5
},
"Burgos": {
"s": 2,
"c": 44392.5
},
"León": {
"s": 2,
"c": 56361.5
},
"Palencia": {
"s": 2,
"c": 22982.5
},
"Salamanca": {
"s": 3,
"c": 32557.33333
},
"Segovia": {
"s": 2,
"c": 20086
},
"Soria": {
"s": 1,
"c": 22264
},
"Valladolid": {
"s": 2,
"c": 66013
},
"Zamora": {
"s": 2,
"c": 26277.5
},
"Barcelona": {
"s": 4,
"c": 89439.75
},
"Lleida": {
"s": 1,
"c": 24503
},
"Tarragona": {
"s": 1,
"c": 51241
},
"Badajoz": {
"s": 3,
"c": 49867.66667
},
"Cáceres": {
"s": 2,
"c": 47709.5
},
"A Coruña": {
"s": 4,
"c": 64463.75
},
"Lugo": {
"s": 2,
"c": 45758
},
"Ourense": {
"s": 3,
"c": 30846.33333
},
"Pontevedra": {
"s": 3,
"c": 69640.33333
},
"Madrid": {
"s": 15,
"c": 88377.66667
},
"Navarra": {
"s": 2,
"c": 53488
},
"Araba/Álava": {
"s": 1,
"c": 34276
},
"Bizkaia": {
"s": 1,
"c": 78965
},
"Murcia": {
"s": 5,
"c": 66621.8
},
"La Rioja": {
"s": 2,
"c": 36854
},
"Alacant/Alicante": {
"s": 5,
"c": 65925.6
},
"Castelló/Castellón": {
"s": 2,
"c": 53373
},
"València/Valencia": {
"s": 6,
"c": 80475.83333
},
"Ceuta": {
"s": 1,
"c": 15991
},
"Melilla": {
"s": 1,
"c": 13522
}
},
"PSOE": {
"València/Valencia": {
"s": 3,
"c": 95244
},
"Castelló/Castellón": {
"s": 1,
"c": 66062
},
"Alacant/Alicante": {
"s": 2,
"c": 93742
},
"La Rioja": {
"s": 1,
"c": 42010
},
"Murcia": {
"s": 2,
"c": 72468.5
},
"Bizkaia": {
"s": 1,
"c": 86425
},
"Gipuzkoa": {
"s": 1,
"c": 51449
},
"Araba/Álava": {
"s": 1,
"c": 26381
},
"Navarra": {
"s": 1,
"c": 58173
},
"Madrid": {
"s": 7,
"c": 96905.71429
},
"Pontevedra": {
"s": 2,
"c": 59408
},
"Ourense": {
"s": 1,
"c": 43429
},
"Lugo": {
"s": 1,
"c": 45796
},
"A Coruña": {
"s": 2,
"c": 69986.5
},
"Cáceres": {
"s": 2,
"c": 39383.5
},
"Badajoz": {
"s": 2,
"c": 66696
},
"Tarragona": {
"s": 1,
"c": 53967
},
"Girona": {
"s": 1,
"c": 38558
},
"Barcelona": {
"s": 5,
"c": 88962.4
},
"Zamora": {
"s": 1,
"c": 26045
},
"Valladolid": {
"s": 1,
"c": 71780
},
"Soria": {
"s": 1,
"c": 12762
},
"Segovia": {
"s": 1,
"c": 19014
},
"Salamanca": {
"s": 1,
"c": 43252
},
"Palencia": {
"s": 1,
"c": 24751
},
"León": {
"s": 1,
"c": 73681
},
"Burgos": {
"s": 1,
"c": 45724
},
"Ávila": {
"s": 1,
"c": 19277
},
"Toledo": {
"s": 2,
"c": 48866.5
},
"Guadalajara": {
"s": 1,
"c": 30282
},
"Cuenca": {
"s": 1,
"c": 34426
},
"Ciudad Real": {
"s": 2,
"c": 40864
},
"Albacete": {
"s": 1,
"c": 59617
},
"Cantabria": {
"s": 1,
"c": 79407
},
"Santa Cruz de Tenerife": {
"s": 1,
"c": 101120
},
"Las Palmas": {
"s": 2,
"c": 59675.5
},
"Illes Balears": {
"s": 2,
"c": 46681.5
},
"Asturias": {
"s": 2,
"c": 73960
},
"Zaragoza": {
"s": 2,
"c": 62660.5
},
"Teruel": {
"s": 1,
"c": 19724
},
"Huesca": {
"s": 1,
"c": 29915
},
"Sevilla": {
"s": 4,
"c": 86867.5
},
"Málaga": {
"s": 3,
"c": 67148
},
"Jaén": {
"s": 2,
"c": 69306
},
"Huelva": {
"s": 2,
"c": 44050
},
"Granada": {
"s": 2,
"c": 75722.5
},
"Córdoba": {
"s": 2,
"c": 69640.5
},
"Cádiz": {
"s": 3,
"c": 58499.33333
},
"Almería": {
"s": 2,
"c": 42494
}
},
"UP/PODEMOS": {
"La Rioja": {
"s": 1,
"c": 28772
},
"Murcia": {
"s": 1,
"c": 103522
},
"Bizkaia": {
"s": 3,
"c": 59782.33333
},
"Gipuzkoa": {
"s": 2,
"c": 52283
},
"Araba/Álava": {
"s": 1,
"c": 51827
},
"Navarra": {
"s": 2,
"c": 47486
},
"Madrid": {
"s": 8,
"c": 92235.625
},
"Badajoz": {
"s": 1,
"c": 47182
},
"Valladolid": {
"s": 1,
"c": 51637
},
"León": {
"s": 1,
"c": 49484
},
"Burgos": {
"s": 1,
"c": 35705
},
"Toledo": {
"s": 1,
"c": 53994
},
"Albacete": {
"s": 1,
"c": 33509
},
"Cantabria": {
"s": 1,
"c": 59845
},
"Santa Cruz de Tenerife": {
"s": 1,
"c": 85178
},
"Las Palmas": {
"s": 2,
"c": 56628
},
"Illes Balears": {
"s": 2,
"c": 59041
},
"Asturias": {
"s": 2,
"c": 70922.5
},
"Zaragoza": {
"s": 1,
"c": 104199
},
"Huesca": {
"s": 1,
"c": 22430
},
"Sevilla": {
"s": 3,
"c": 71554.33333
},
"Málaga": {
"s": 2,
"c": 70414.5
},
"Jaén": {
"s": 1,
"c": 53239
},
"Huelva": {
"s": 1,
"c": 40023
},
"Granada": {
"s": 1,
"c": 86975
},
"Córdoba": {
"s": 1,
"c": 85058
},
"Cádiz": {
"s": 2,
"c": 65321.5
},
"València/Valencia": {
"s": 5,
"c": 78845.4
},
"Castelló/Castellón": {
"s": 1,
"c": 72281
},
"Alacant/Alicante": {
"s": 3,
"c": 64421
},
"Pontevedra": {
"s": 2,
"c": 68544
},
"Lugo": {
"s": 1,
"c": 32752
},
"A Coruña": {
"s": 2,
"c": 74283
},
"Tarragona": {
"s": 1,
"c": 75328
},
"Lleida": {
"s": 1,
"c": 30182
},
"Girona": {
"s": 1,
"c": 53277
},
"Barcelona": {
"s": 9,
"c": 77146.11111
}
},
"CIUDADANOS": {
"València/Valencia": {
"s": 2,
"c": 102744.5
},
"Castelló/Castellón": {
"s": 1,
"c": 44121
},
"Alacant/Alicante": {
"s": 2,
"c": 69258.5
},
"Murcia": {
"s": 2,
"c": 55980.5
},
"Madrid": {
"s": 6,
"c": 102750.5
},
"Tarragona": {
"s": 1,
"c": 39082
},
"Barcelona": {
"s": 4,
"c": 76268.75
},
"Valladolid": {
"s": 1,
"c": 49283
},
"Cantabria": {
"s": 1,
"c": 48626
},
"Santa Cruz de Tenerife": {
"s": 1,
"c": 52576
},
"Las Palmas": {
"s": 1,
"c": 65172
},
"Illes Balears": {
"s": 1,
"c": 67700
},
"Asturias": {
"s": 1,
"c": 74961
},
"Zaragoza": {
"s": 1,
"c": 86434
},
"Sevilla": {
"s": 1,
"c": 138086
},
"Málaga": {
"s": 2,
"c": 60647
},
"Granada": {
"s": 1,
"c": 66000
},
"Córdoba": {
"s": 1,
"c": 55248
},
"Cádiz": {
"s": 1,
"c": 88029
},
"Almería": {
"s": 1,
"c": 41897
}
}
},
"2015": {
"PP": {
"Cádiz": {
"s": 3,
"c": 59773
},
"Córdoba": {
"s": 2,
"c": 71050.5
},
"Almería": {
"s": 2,
"c": 58817.5
},
"Jaén": {
"s": 2,
"c": 60992
},
"Granada": {
"s": 3,
"c": 52897.66667
},
"Málaga": {
"s": 4,
"c": 56186.25
},
"Sevilla": {
"s": 3,
"c": 91821
},
"Huelva": {
"s": 2,
"c": 37176.5
},
"Teruel": {
"s": 2,
"c": 14141
},
"Zaragoza": {
"s": 3,
"c": 53887.33333
},
"Huesca": {
"s": 1,
"c": 39747
},
"Asturias": {
"s": 3,
"c": 62522.66667
},
"Illes Balears": {
"s": 3,
"c": 46880
},
"Santa Cruz de Tenerife": {
"s": 2,
"c": 69101.5
},
"Las Palmas": {
"s": 3,
"c": 48457.33333
},
"Cantabria": {
"s": 2,
"c": 64608
},
"Guadalajara": {
"s": 1,
"c": 47365
},
"Albacete": {
"s": 2,
"c": 42620.5
},
"Ciudad Real": {
"s": 3,
"c": 37817
},
"Toledo": {
"s": 2,
"c": 74721
},
"Cuenca": {
"s": 2,
"c": 25368
},
"León": {
"s": 2,
"c": 52038.5
},
"Zamora": {
"s": 2,
"c": 24080
},
"Valladolid": {
"s": 2,
"c": 60661.5
},
"Burgos": {
"s": 2,
"c": 41018.5
},
"Soria": {
"s": 1,
"c": 20030
},
"Segovia": {
"s": 2,
"c": 18091
},
"Palencia": {
"s": 2,
"c": 21091
},
"Salamanca": {
"s": 2,
"c": 44687.5
},
"Ávila": {
"s": 2,
"c": 23536
},
"Barcelona": {
"s": 4,
"c": 80495
},
"Tarragona": {
"s": 1,
"c": 45619
},
"Cáceres": {
"s": 2,
"c": 43962
},
"Badajoz": {
"s": 2,
"c": 68820
},
"Ourense": {
"s": 2,
"c": 43336.5
},
"Lugo": {
"s": 2,
"c": 43223
},
"A Coruña": {
"s": 3,
"c": 79767.66667
},
"Pontevedra": {
"s": 3,
"c": 65733.66667
},
"Madrid": {
"s": 13,
"c": 93093.76923
},
"Navarra": {
"s": 2,
"c": 51122
},
"Araba/Álava": {
"s": 1,
"c": 33683
},
"Bizkaia": {
"s": 1,
"c": 74560
},
"Murcia": {
"s": 5,
"c": 58788.6
},
"La Rioja": {
"s": 2,
"c": 33970.5
},
"València/Valencia": {
"s": 5,
"c": 88515.6
},
"Alacant/Alicante": {
"s": 4,
"c": 74270.75
},
"Castelló/Castellón": {
"s": 2,
"c": 49237
},
"Ceuta": {
"s": 1,
"c": 14813
},
"Melilla": {
"s": 1,
"c": 12331
}
},
"PSOE": {
"Cádiz": {
"s": 3,
"c": 60298.33333
},
"Córdoba": {
"s": 2,
"c": 74925.5
},
"Almería": {
"s": 2,
"c": 44717
},
"Jaén": {
"s": 3,
"c": 49503.66667
},
"Granada": {
"s": 2,
"c": 79013.5
},
"Málaga": {
"s": 3,
"c": 69632
},
"Sevilla": {
"s": 5,
"c": 74228.4
},
"Huelva": {
"s": 2,
"c": 47818.5
},
"Teruel": {
"s": 1,
"c": 19938
},
"Zaragoza": {
"s": 2,
"c": 59468
},
"Huesca": {
"s": 1,
"c": 30183
},
"Asturias": {
"s": 2,
"c": 72556.5
},
"Illes Balears": {
"s": 2,
"c": 44317.5
},
"Santa Cruz de Tenerife": {
"s": 2,
"c": 51446
},
"Las Palmas": {
"s": 2,
"c": 57760.5
},
"Cantabria": {
"s": 1,
"c": 78460
},
"Guadalajara": {
"s": 1,
"c": 30685
},
"Albacete": {
"s": 1,
"c": 65205
},
"Ciudad Real": {
"s": 2,
"c": 45979.5
},
"Toledo": {
"s": 2,
"c": 53494
},
"Cuenca": {
"s": 1,
"c": 37019
},
"León": {
"s": 1,
"c": 74128
},
"Zamora": {
"s": 1,
"c": 25985
},
"Valladolid": {
"s": 1,
"c": 70879
},
"Burgos": {
"s": 1,
"c": 44640
},
"Soria": {
"s": 1,
"c": 12331
},
"Segovia": {
"s": 1,
"c": 19769
},
"Palencia": {
"s": 1,
"c": 25698
},
"Salamanca": {
"s": 1,
"c": 45593
},
"Ávila": {
"s": 1,
"c": 20254
},
"Lleida": {
"s": 1,
"c": 24668
},
"Barcelona": {
"s": 5,
"c": 92917.6
},
"Tarragona": {
"s": 1,
"c": 58922
},
"Girona": {
"s": 1,
"c": 42096
},
"Cáceres": {
"s": 2,
"c": 42379
},
"Badajoz": {
"s": 3,
"c": 49497.66667
},
"Ourense": {
"s": 1,
"c": 44726
},
"Lugo": {
"s": 1,
"c": 48772
},
"A Coruña": {
"s": 2,
"c": 68867
},
"Pontevedra": {
"s": 2,
"c": 59494
},
"Madrid": {
"s": 6,
"c": 107607.5
},
"Navarra": {
"s": 1,
"c": 54856
},
"Araba/Álava": {
"s": 1,
"c": 25331
},
"Gipuzkoa": {
"s": 1,
"c": 51764
},
"Bizkaia": {
"s": 1,
"c": 84893
},
"Murcia": {
"s": 2,
"c": 73941.5
},
"La Rioja": {
"s": 1,
"c": 41973
},
"València/Valencia": {
"s": 3,
"c": 92062.66667
},
"Alacant/Alicante": {
"s": 3,
"c": 62903.66667
},
"Castelló/Castellón": {
"s": 1,
"c": 66590
}
},
"UP/PODEMOS": {
"Cádiz": {
"s": 2,
"c": 65367
},
"Córdoba": {
"s": 1,
"c": 68740
},
"Almería": {
"s": 1,
"c": 39780
},
"Granada": {
"s": 1,
"c": 83650
},
"Málaga": {
"s": 2,
"c": 66490
},
"Sevilla": {
"s": 2,
"c": 104204
},
"Huelva": {
"s": 1,
"c": 39435
},
"Zaragoza": {
"s": 1,
"c": 102596
},
"Huesca": {
"s": 1,
"c": 21943
},
"Asturias": {
"s": 2,
"c": 66492
},
"Illes Balears": {
"s": 2,
"c": 55814
},
"Santa Cruz de Tenerife": {
"s": 1,
"c": 94936
},
"Las Palmas": {
"s": 2,
"c": 68291.5
},
"Cantabria": {
"s": 1,
"c": 62569
},
"Toledo": {
"s": 1,
"c": 52587
},
"León": {
"s": 1,
"c": 51441
},
"Valladolid": {
"s": 1,
"c": 50204
},
"Burgos": {
"s": 1,
"c": 36818
},
"Badajoz": {
"s": 1,
"c": 47368
},
"Madrid": {
"s": 8,
"c": 94532.125
},
"Navarra": {
"s": 2,
"c": 40608
},
"Araba/Álava": {
"s": 1,
"c": 48413
},
"Gipuzkoa": {
"s": 2,
"c": 49266.5
},
"Bizkaia": {
"s": 2,
"c": 85364
},
"Murcia": {
"s": 1,
"c": 110601
},
"La Rioja": {
"s": 1,
"c": 28073
},
"Ourense": {
"s": 1,
"c": 34357
},
"Lugo": {
"s": 1,
"c": 39122
},
"A Coruña": {
"s": 2,
"c": 88790.5
},
"Pontevedra": {
"s": 2,
"c": 79819
},
"València/Valencia": {
"s": 5,
"c": 79441.4
},
"Alacant/Alicante": {
"s": 3,
"c": 67203.33333
},
"Castelló/Castellón": {
"s": 1,
"c": 74732
},
"Lleida": {
"s": 1,
"c": 30538
},
"Barcelona": {
"s": 9,
"c": 85359.44444
},
"Tarragona": {
"s": 1,
"c": 77036
},
"Girona": {
"s": 1,
"c": 54071
}
},
"CIUDADANOS": {
"Cádiz": {
"s": 1,
"c": 94962
},
"Córdoba": {
"s": 1,
"c": 55812
},
"Almería": {
"s": 1,
"c": 44494
},
"Granada": {
"s": 1,
"c": 70845
},
"Málaga": {
"s": 2,
"c": 66293
},
"Sevilla": {
"s": 2,
"c": 71287
},
"Zaragoza": {
"s": 1,
"c": 95130
},
"Asturias": {
"s": 1,
"c": 84464
},
"Illes Balears": {
"s": 1,
"c": 71551
},
"Santa Cruz de Tenerife": {
"s": 1,
"c": 50257
},
"Las Palmas": {
"s": 1,
"c": 63385
},
"Cantabria": {
"s": 1,
"c": 53371
},
"Guadalajara": {
"s": 1,
"c": 24603
},
"Albacete": {
"s": 1,
"c": 33755
},
"Toledo": {
"s": 1,
"c": 53199
},
"León": {
"s": 1,
"c": 37902
},
"Valladolid": {
"s": 1,
"c": 56347
},
"Salamanca": {
"s": 1,
"c": 35242
},
"Barcelona": {
"s": 4,
"c": 96765.25
},
"Tarragona": {
"s": 1,
"c": 53152
},
"A Coruña": {
"s": 1,
"c": 66784
},
"Madrid": {
"s": 7,
"c": 97309.57143
},
"Murcia": {
"s": 2,
"c": 64285
},
"València/Valencia": {
"s": 2,
"c": 110948
},
"Alacant/Alicante": {
"s": 2,
"c": 77198.5
},
"Castelló/Castellón": {
"s": 1,
"c": 48328
}
}
}
}
}
<!DOCTYPE html>
<head>
<meta charset="utf-8">
<script src="https://unpkg.com/topogram"></script>
<script src="https://unpkg.com/topojson"></script>
<script src="https://unpkg.com/d3-composite-projections"></script>
<script src="https://unpkg.com/d3-tip@0.9.1/dist/index.js"></script>
<script src="https://d3js.org/d3.v4.js"></script>
<style>
body {
margin:0;
position:fixed;
top:0;
right:0;
bottom:0;
left:0;
width:960;
height:500;}
.provinces {
fill: #ccc;
stroke: #fff;
}
div.tooltip {
position: absolute;
text-align: center;
width: 70px;
padding: 2px;
font: 12px sans-serif;
background: lightsteelblue;
border: 0px;
border-radius: 8px;
pointer-events: none;
}
.d3-tip {
line-height: 1;
padding: 12px;
background: rgba(0, 0, 0, 0.8);
color: #fff;
border-radius: 2px;
pointer-events: none;
}
.d3-tip span {
font-weight: bold;
}
/* 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.n:after {
content: "\25BC";
margin: -1px 0 0 0;
top: 100%;
left: 0;
text-align: center;
}
/* Eastward tooltips */
.d3-tip.e:after {
content: "\25C0";
margin: -4px 0 0 0;
top: 50%;
left: -8px;
}
/* Southward tooltips */
.d3-tip.s:after {
content: "\25B2";
margin: 0 0 1px 0;
top: -8px;
left: 0;
text-align: center;
}
/* Westward tooltips */
.d3-tip.w:after {
content: "\25B6";
margin: -4px 0 0 -1px;
top: 50%;
left: 100%;
}
#selectors {
position: absolute;
top: 10px;
left: 10px;
}
.selector {
padding: 20px;
margin: 10px;
}
#info {
position: absolute;
top: 70px;
left: 20px;
width: 200px;
}
#info span {
font-weight: bold;
}
</style>
</head>
<body>
<div id=selectors>
<select class=selector id=year-selector>
</select>
<select class=selector id=party-selector>
</select>
</div>
<div id=info>
</div>
<script>
// Feel free to change or delete any of the code you see in this editor!
const width = 960,
height = 500
const svg = d3.select("body").append("svg")
.attr("width", width)
.attr("height", height)
const proj = d3.geoConicConformalSpain()
const path = d3.geoPath().projection(proj)
const party_colors = {
'PSOE': '#b00003',
'PP': '#064294',
'CIUDADANOS': '#f53706',
'UP/PODEMOS': '#6a195c',
'VOX': '#4db729'
}
d3.queue()
.defer(d3.json, "provinces.json")
.defer(d3.json, "elecciones-3.json")
.await(function(error, provinces, elecciones) {
const data = elecciones['elecciones']
const norm_data = []
for (const [year, yearData] of Object.entries(data)) {
for (const [party, provincesData] of Object.entries(yearData)) {
for (const [province, provinceData] of Object.entries(provincesData)) {
provinceData.s = Math.round(provinceData.s * Math.pow(10,2)) / Math.pow(10,2)
norm_data.push({...provinceData,
'year': year,
'party': party,
'province': province})
}
}
}
const final_esc_year = {}
d3.nest()
.key(d => d.year)
.key(d =>d.province)
.rollup(d => d.map(c=>c.s).reduce((acc, current) => acc + current))
.entries(norm_data)
.forEach(d => {
const subObj = {}
let s_sum = 0
d.values.forEach(c => {
subObj[c.key] = c.value
s_sum += c.value
})
subObj['todos'] = s_sum
final_esc_year[d.key] = subObj
})
const nested_years_data = d3.nest().key(d => d.year).key(d => d.party).entries(norm_data)
let sel_year = null,
sel_party = null,
sel_data = null
const carto = topogram
.cartogram()
.projection(proj)
.properties(function(d) {
return d.properties
})
var land = topojson.feature(provinces, provinces.objects.provinces)
const tip = d3.tip()
.attr('class', 'd3-tip')
.html(function(d) {
return `<span>${d.province} (${sel_party})</span><br>
<span>escaños</span>: ${d['esc']}/${final_esc_year[sel_year][d.province]}<br>
<span>coste medio</span>: ${d['votesc']} votos`
})
svg.call(tip)
svg.selectAll("path").data(land.features)
.enter()
.append("path")
.attr("d", path)
// .attr("transform", 'translate() scale(30)')
.attr("fill", "black")
.attr("stroke", "black")
.style("stroke-opacity", 0.2)
.on('mouseover', function(d){
// d3.select(this).style("opacity", 1.0)
d3.select(this).style("stroke-opacity", 0.8)
const cross = sel_data.filter(c => c.province == d.properties.name)[0]
let tipData = {'province': d.properties.name}
if(typeof cross !== 'undefined') {
tipData = Object.assign(tipData, {'esc': cross.s, 'votesc': cross.c})
} else tipData = Object.assign(tipData, {'esc': 0, 'votesc': 0})
const direction = d3.mouse(this)[1] > height *0.25 ? "n" : "s"
tip.direction(direction)
tip.show(tipData, this)
})
.on('mouseout', function(d){
d3.select(this).style("stroke-opacity", 0.2)
tip.hide()
})
svg.append("path")
.attr("class","border")
.style("fill","none")
.style("stroke","#a0a0a0")
.attr("d", proj.getCompositionBorders())
setTimeout(function() {
d3.select('#party-selector')
.on('change', partyChange)
d3.select('#year-selector')
.on('change', yearChange)
const all_years = nested_years_data.map(d => d.key).reverse()
d3.select('#year-selector')
.selectAll('option')
.data(all_years)
.enter()
.append('option')
.text(d => d)
document.getElementById("year-selector").options[0].selected = true
yearChange()
}, 1000)
const opacityScale = d3.scaleLinear().domain([0,1]).range([0.1, 0.9])
function update() {
sel_data = nested_years_data.filter(d => d.key == sel_year)[0].values.filter(d => d.key == sel_party)[0].values
const sizeScale = d3.scaleLinear()
.domain([d3.max(sel_data, d => d.c), 0])
.range([100, 1000])
carto.value(function(d) {
const cross = sel_data.filter(c => c.province == d.properties.name)[0]
if (typeof cross != 'undefined'){
return sizeScale(cross.c)
} else {
return 25
}
})
const this_features = carto(provinces, provinces.objects.provinces.geometries).features;
svg.selectAll("path")
.data(this_features)
.transition()
.duration(750)
.ease(d3.easeLinear)
.attr('fill', d => {
const cross = sel_data.filter(c => c.province == d.properties.name)[0]
let percent = 0.05
if (typeof cross !== 'undefined') {
percent = opacityScale(cross.s / final_esc_year[sel_year][d.properties.name])
}
return hexToRGB(party_colors[sel_party], percent)
})
.style("stroke-opacity", 0.2)
.attr('d', carto.path)
}
function yearChange() {
sel_year = d3.select('#year-selector').property('value')
d3.select('#party-selector')
.selectAll("*")
.remove();
d3.select('#party-selector')
.selectAll('option')
.data(nested_years_data
.filter(d => d.key == sel_year)[0].values.map(d => d.key))
.enter()
.append('option').text(d => d);
const partySelector = document.getElementById("party-selector")
if (!sel_party) {
partySelector.options[0].selected = true
} else {
let sel_idx = -1
for (var i = 0; i < partySelector.options.length; i++) {
if (partySelector.options[i].label == sel_party) {
sel_idx = i
break
}
}
if (sel_idx >= 0)
partySelector.options[sel_idx].selected = true
else
partySelector.options[0].selected = true
}
partyChange()
}
function partyChange() {
sel_party = d3.select('#party-selector').property('value')
const partyPerf = nested_years_data
.filter(d => d.key == sel_year)[0].values.filter(d=>d.key == sel_party)[0]
let costAvg = partyPerf.values.map(d => d.c).reduce((acc, current) => {
return acc + current
}) / partyPerf.values.length
costAvg = Math.round(costAvg * Math.pow(10,2)) / Math.pow(10,2)
const totalEsc = partyPerf.values.map(d => d.s).reduce((acc, current) => {
return acc + current
})
const allEsc = final_esc_year[sel_year]['todos']
const percent = 100* Math.round(totalEsc/allEsc * Math.pow(10,2)) / Math.pow(10,2)
d3.select('#info').selectAll("*").remove()
d3.select('#info').html(`En <span>${sel_year}</span>, <span>${sel_party}</span> obtuvo <span>${totalEsc} escaños</span> de los <span>${allEsc} (${percent}%)</span> asignados a partidos nacionales, con un <span>coste medio</span> por escaño de <span>${costAvg} votos</span>.`)
update()
}
});
function hexToRGB(hex, alpha) {
var r = parseInt(hex.slice(1, 3), 16),
g = parseInt(hex.slice(3, 5), 16),
b = parseInt(hex.slice(5, 7), 16);
if (alpha) {
return "rgba(" + r + ", " + g + ", " + b + ", " + alpha + ")";
} else {
return "rgb(" + r + ", " + g + ", " + b + ")";
}
}
</script>
</body>
Display the source blob
Display the rendered blob
Raw
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment