Programavimas

Kaip sukurti rinkimų žemėlapį R

Jei planuojate, tarkime, JAV prezidento rinkimų rinkimus pagal valstijas, gali būti prasminga tiesiog parodyti vieną raudoną spalvą valstybėms, kurias laimėjo respublikonai, o vieną mėlyną - valstijoms, kurias laimėjo demokratai. Taip yra todėl, kad nesvarbu, ar kandidatas laimi trimis tūkstančiais balsų, ar trimis milijonais: tai „nugalėtojas ima viską“.

Tačiau analizuojant a valstijos rinkimai pateikė apskrityjearba a rinkimai visame mieste pateikė nuovada, svarbu paraštė. Nugalėtoją lemia visa bendra suma. Pats „Atlantos“ laimėjimas nėra viskas, ką reikia žinoti, pavyzdžiui, žiūrint į Džordžijos valstijos rezultatus gubernatoriui. Norėtumėte sužinoti, kiek balsų laimėjo demokratas pateikėir palyginkite tai su kitomis sritimis.

Štai kodėl man patinka kurti žemėlapius, kuriuos spalvos koduoja nugalėtojas ir spalvos intensyvumas rodo pergalės ribą. Tai jums pasakys, kurios sritys prisidėjo daugiau ir kurios mažiau prisidėjo prie bendro rezultato.

Šioje demonstracijoje naudosiu Pensilvanijos 2016 m. Prezidento rezultatus. Jei norite sekti toliau, atsisiųskite duomenis ir geoerdvinius formos failus:

atsisiųskite Pensilvanijos 2016 m. rinkimų rezultatus pagal apskritis ir apskričių šablonus. Rinkimų duomenų byla ir šablonas. Sharon Machlis

Pirmiausia įkeliu keletą pakuočių: dplyr, klijus, svarstykles, htmltools, sf ir lapelius. Duomenų CSV failui importuoti naudosiu „rio“, todėl to norėsite ir savo sistemoje.

biblioteka (dplyr); biblioteka (klijai); biblioteka (svarstyklės);

biblioteka (htmltools); biblioteka (sf); biblioteka (lankstinukas)

pa_data <- rio :: import ("pa_2016_presidential.csv")

Duomenų importavimas ir paruošimas

Toliau naudoju sf st_read () funkcija importuoti Pensilvanijos apskričių šabloną.

pa_geo <- sf :: st_read ("PaCounty2020_08 / PaCounty2020_08.shp",

stringsAsFactors = FALSE)

Man nepatinka pa_geo apskrities stulpelio pavadinimas COUNTY_NAM, todėl pakeisiu jį į „County“ su šiuo kodu:

vardai (pa_geo) [2] <- "County"

Prieš sujungdamas duomenis su savo geografija, noriu įsitikinti, kad apskričių pavadinimai abiejuose failuose yra vienodi. dplyr's anti_join () funkcija sujungia du duomenų rinkinius ir parodo, kurios eilutės neturi turėti degtuką. Rezultatus išsaugosiu duomenų rėmelyje, vadinamame problemomis, ir peržiūrėsiu pirmąsias šešias eilutes su galva () ir pirmuosius tris stulpelius:

problemos <- anti_join (pa_geo, pa_data, by = "County")

galva (problemos [, 1: 3])

MSLINK apygardos COUNTY_NUM geometrija 1 42 MCKEAN 42 MULTIPOLYGON ((((-78.20638 4 ...

Yra viena probleminė eilutė. Taip yra todėl, kad McKean County yra MCKEAN pagal šiuos duomenis, bet McKEAN - kituose duomenų rėmuose. Pakeisiu „McKean“ į visus pa_data kepinius ir paleisiu anti_join () Patikrink dar kartą.

pa_data $ apygarda [pa_data $ apygarda == "McKEAN"] <- "MCKEAN"

anti_join (pa_geo, pa_data, = = apygarda)

Dabar neturėtų būti jokių problemų eilučių.

Kita kodo eilutė sujungia duomenis su geografija:

pa_map_data <- sujungti (pa_geo, pa_data, pagal = "County")

Galiausiai įsitikinsiu, kad mano naujoji geografija ir duomenų objektas naudoja tą patį projekcija kaip mano lapelių plytelės. Projekcija yra gana sudėtinga GIS tema. Kol kas tereikia žinoti, kad man reikia WGS84, kad atitikčiau lankstinuką. Šis kodas nustato mano projekciją:

pa_map_data <- st_transform (pa_map_data, "+ proj = longlat + null = WGS84")

Dabar, kai mano duomenys yra tokios formos, kokios man reikia, turiu dar tris užduotis: Sukurti spalvų paletes kiekvienam kandidatui, sukurti iššokančiuosius žemėlapio žemėlapius ir tada užkoduoti patį žemėlapį.

Spalvų paletės

Pradėsiu nuo paletės.

Aš einu žemėlapiu neapdoroti balsų skirtumai šioje demonstracinėje versijoje, tačiau galbūt norėsite naudoti procentinius skirtumus. Pirmoje žemiau esančio kodo eilutėje naudojami pagrindiniai R diapazonas() funkciją, kad gautumėte mažiausią ir didžiausią balsų skirtumą stulpelyje Marža. Mažiausiam skaičiui priskyriau šviesiausią spalvą, o didžiausiam - tamsiausią.

Tada sukuriu dvi paletes, naudodamas įprastą raudoną spalvą respublikonams, o mėlyną - demokratams. Abiem paletėms naudoju tą patį intensyvumo skalę: lengviausia mažiausiai paraštei, nepriklausomai nuo kandidato, ir didžiausia - didžiausiai, nepriklausomai nuo kandidato. Tai leis man suprasti, kur kiekvienas kandidatas buvo stipriausias pagal vieną intensyvumo skalę. Aš naudoju lankstinukus spalvaNumeric () funkcija su raudonos arba mėlynos spalvos paletės spalva paletėms sukurti. ( domenas argumentas nustato mažiausias ir didžiausias spalvų skalės vertes.)

min_max_values ​​<- diapazonas (pa_map_data $ paraštė, na.rm = TRUE)

trump_palette <- colorNumeric (paletė = "Raudonos",

domain = c (min_max_values ​​[1], min_max_values ​​[2]))

clinton_palette <- colorNumeric (paletė = "Blues",

domain = c (min_max_values ​​[1], min_max_values ​​[[2]]))

Sukuriama kita kodų grupėdu skirtingi duomenų rėmeliai: Po vieną kiekvienam kandidatui, nurodant tik tas vietas, kurias laimėjo kandidatas. Dviejų duomenų rėmelių naudojimas padeda man gerai valdyti iššokančiuosius langus ir spalvas. Kiekvienam galiu naudoti net skirtingą iššokantįjį tekstą.

trump_df <- pa_map_data [pa_map_data $ nugalėtojas == "Trump",]

clinton_df <- pa_map_data [pa_map_data $ nugalėtojas == "Clinton",]

Iššokančių langų

Kita užduotis yra tie iššokantys langai. Žemiau sugeneruoju HTML, įskaitantstiprus žymos paryškintam tekstui ir br žymos eilučių pertraukoms. Jei nesate susipažinę su klijais, breketų viduje esantis kodas yra kintamieji, kurie yra įvertinti. Iššokančiuose languose pateiksiu laimėjusio kandidato vardą, bendrą jų balsų skaičių, kito kandidato vardą ir balsų sumą bei pergalės ribą toje apskrityje.svarstyklės :: kablelis () funkcija prideda kablelį prie tūkstančių ar daugiau balsų skaičiaus irtikslumas = 1 įsitikina, kad tai apvalus sveikasis skaičius be dešimtainių taškų.

Tada kodas tai išpjauna klijai () teksto eilutė į HTML įrankius “HTML () funkcija, kurioje lankstinuke reikia tinkamai parodyti iššokantįjį tekstą.

trump_popup <- Klijai ("{trump_df $ County} COUNTY

Nugalėtojas: Trumpas

D.Trumpas: {svarstyklės :: kablelis (trump_df $ Trump, tikslumas = 1)}

Clinton: {svarstyklės :: kablelis (trump_df $ Clinton, tikslumas = 1)}

Marža: {skalės :: kablelis (trump_df $ marža, tikslumas = 1)} ")%>%

lapply (htmltools :: HTML)

clinton_popup <- Klijai ("{clinton_df $ County} COUNTY

Nugalėtojas: Clinton

Clinton: {svarstyklės :: kablelis (clinton_df $ Clinton, tikslumas = 1)}

D.Trumpas: {svarstyklės :: kablelis (clinton_df $ Trump, tikslumas = 1)}

Marža: {skalės :: kablelis (clinton_df $ paraštė, tikslumas = 1)} ")%>%

lapply (htmltools :: HTML)

Žemėlapio kodas

Pagaliau žemėlapis. Žemėlapio kodas pradedamas naudojant pagrindinio lankstinuko objekto sukūrimą lankstinukas () be pridedant duomenis kaip argumentą pagrindiniame objekte. Taip yra todėl, kad naudosiu du skirtingus duomenų rinkinius. Kita žemiau esančio kodo eilutė nustato fono plyteles į „CartoDB Positron“. (Tai neprivaloma. Galite naudoti numatytąjį, bet man šis stilius patinka.)

informacinis lapelis ()%>%

„addProviderTiles“ („CartoDB.Positron“)

Toliau naudosiu lankstinukus addPolygons () funkcija du kartus, po vieną kiekvieno kandidato duomenų rėmą, uždengtą tame pačiame žemėlapio sluoksnyje.

informacinis lapelis ()%>%

addProviderTiles ("CartoDB.Positron")%>%

addPolygons (

duomenys = trump_df,

fillColor = ~ trump_palette (trump_df $ paraštė),

etiketė = trump_popup,

insultas = TIESA,

smoothFactor = 0,2,

užpildymo talpa = 0,8,

spalva = "# 666",

svoris = 1

) %>%

addPolygons (

duomenys = clinton_df,

fillColor = ~ clinton_palette (clinton_df $ Margin),

etiketė = clinton_popup,

insultas = TIESA,

smoothFactor = 0,2,

užpildymo talpa = 0,8,

spalva = "# 666",

svoris = 1

)

Pirmiau pateiktame kodo bloke nustatau kiekvieno duomenis addPolygons () kiekvieno kandidato duomenų rėmui. „fillColor“ argumentas paima kiekvieno kandidato paletę ir taiko savo pergalės ribą. Iššokantis langas (iš tikrųjų perėjimas etiketė) bus to kandidato HTML, kurį sukūriau aukščiau.

Likusi dalis yra standartinio dizaino. insultas nustato sienų liniją aplink kiekvieną daugiakampį. smoothFactor supaprastina daugiakampio kontūro rodymą; Nukopijavau vertę iš man patikusio „RStudio“ demonstracinio žemėlapio. Ir „fillOpacity“ yra tai, ko jūs tikėjotės.

spalva yra spalvos daugiakampio sienos linija, o ne pats daugiakampis (daugiakampis spalva buvo nustatytas su „fillColor“). svoris yra daugiakampio kraštinės linijos storis pikseliais.

Šis kodas sukuria žemėlapį, panašų į žemiau esantį, tačiau suteikdamas papildomą galimybę užvesti pelės žymeklį (arba paliesti mobilųjį telefoną) ir pamatyti pagrindinius duomenis.

Sharon Machlis,

Filadelfija yra apačioje dešinėje. Galite pamatyti, kaip tai svarbu, atsižvelgiant į gyventojų skaičių, palyginti su visais kitais Pensilvanijos rajonais, kurie žemėlapyje yra dideli, tačiau turi daug mažiau rinkėjų.

Sharon Machlis,

Gali būti įdomu žemėlapį skirtumas neapibrėžtos balsų maržos tarp vienų ir kitų rinkimų, tokių kaip Pensilvanija 2016 m. ir 2020 m. Šis žemėlapis parodytų, kur modeliai labiausiai pasikeitė, ir galėtų padėti paaiškinti pokyčius visoje valstybėje.

Jei jus domina daugiau rinkimų duomenų vizualizacijų, „GitHub“ paskelbiau rinkimų 2 paketą. Galite jį įdiegti tokį, koks yra, arba patikrinti mano R kodą „GitHub“ ir pritaikyti savo reikmėms.

Norėdami gauti daugiau R patarimų, eikite į puslapį „Daugiau su R“.

$config[zx-auto] not found$config[zx-overlay] not found