Programovanie

Ako vytvoriť volebnú mapu v R

Ak mapujete výsledky volieb, povedzme, amerických prezidentských volieb podľa štátu, môže mať zmysel iba zobraziť jednu červenú farbu pre štáty, ktoré vyhrajú republikáni, a jednu modrú farbu pre štáty, ktoré vyhrajú demokrati. Je to preto, že nezáleží na tom, či kandidát vyhrá o tri tisíc hlasov alebo o tri milióny: Je to „víťaz berie všetko“.

Ale pri analýze výsledkov a štátne voľby od kraj, alebo a celomestské voľby od okrsok, na marži záleží. O víťazovi rozhoduje celková suma. Samotná výhra v Atlante nie je všetko, čo potrebujete vedieť, napríklad pri pohľade na celoštátne výsledky gruzínskeho guvernéra. Chceli by ste vedieť, koľko hlasov získal demokrat od, a porovnajte to s inými oblasťami.

Preto rád tvorím mapy, ktoré sú farebne odlíšené od víťaza a s intenzitou farieb ukazujúcim okraj víťazstva. To vám povie, ktoré oblasti prispeli viac a ktoré menej prispeli k celkovému výsledku.

V tejto ukážke použijem prezidentské výsledky z Pennsylvánie z roku 2016. Ak chcete pokračovať, stiahnite si údaje a súbory geopriestorových tvarov:

Stiahnite si výsledky volieb v Pensylvánii 2016 podľa krajov a súborov shapefiles Volebný dátový súbor a shapefile. Sharon Machlis

Najprv načítam niektoré balíčky: dplyr, lepidlo, váhy, htmltools, sf a leták. Použijem rio na import dátového súboru CSV, takže ho budete chcieť tiež vo svojom systéme.

knižnica (dplyr); knižnica (lepidlo); knižnica (váhy);

knižnica (htmltools); knižnica (sf); knižnica (leták)

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

Import a príprava dát

Ďalej používam sf’s st_read () funkcia na import súboru tvarov pennsylvánskych krajov.

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

stringsAsFactors = FALSE)

Nepáči sa mi názov stĺpca kraja COUNTY_NAM v doméne pa_geo, takže ho pomocou tohto kódu zmením na „kraj“:

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

Predtým, ako spojím svoje údaje s mojou geografiou, chcem sa ubezpečiť, že názvy krajov sú v oboch súboroch rovnaké. dplyr’s anti_join () funkcia zlučuje dva súbory údajov a ukazuje, ktoré riadky nie mať zápas. Výsledky uložím do dátového rámca nazývaného problémy a pozriem sa na prvých šesť riadkov s head () a prvé tri stĺpce:

problémy <- anti_join (pa_geo, pa_data, autor = "County")

hlava (problémy [, 1: 3])

MSLINK County COUNTY_NUM geometria 1 42 MCKEAN 42 MULTIPOLYGON (((-78.20638 4 ...

Je tu jeden problémový riadok. Je to preto, že okres McKean je v týchto dátach MCKEAN, ale v druhom dátovom rámci McKEAN. Zmením McKeana na všetky čiapky v pa_data a spustím anti_join () skontroluj znova.

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

anti_join (pa_geo, pa_data, by = "County")

Teraz by nemali byť žiadne problémové riadky.

Nasledujúci riadok kódu zlučuje údaje s geografiou:

pa_map_data <- zlúčiť (pa_geo, pa_data, autor = "kraj")

Na záver sa ubezpečím, že moja nová geografická a dátová položka používa to isté projekcia ako to robia moje letáčiky. Projekcia je dosť zložitá téma GIS. Zatiaľ viem, že potrebujem WGS84, aby zodpovedal letáku. Tento kód nastavuje moju projekciu:

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

Teraz, keď sú moje údaje v potrebnom tvare, mám ďalšie tri úlohy: Vytvoriť palety farieb pre každého kandidáta, vytvoriť kontextové okná pre mapu a potom kódovať samotnú mapu.

Farebné palety

Začnem paletami.

Idem mapovat hrubé rozdiely v hlasovaní v tejto ukážke, ale možno budete chcieť použiť percentuálne rozdiely. Prvý riadok v nižšie uvedenom kóde používa základné R. rozsah () funkcia na získanie najmenšieho a najväčšieho rozdielu hlasov v stĺpci Okraj. Najmenej farbe som priradil najsvetlejšiu farbu a najväčšiemu počtu najtmavšiu farbu.

Ďalej vytvorím dve palety pomocou konvenčnej červenej pre republikánov a modrej pre demokratov. Pre obidve palety používam rovnakú stupnicu intenzity: najsvetlejšiu pre najnižšiu maržu bez ohľadu na kandidáta a najvyššiu pre najvyššiu maržu bez ohľadu na kandidáta. Takto získate predstavu o tom, kde bol každý kandidát najsilnejší na jednej stupnici intenzity. Používam letáky colorNumeric () funkciou s farbou palety červenej alebo modrej farby, aby ste vytvorili palety. (The doména argument nastavuje minimálne a maximálne hodnoty pre farebnú škálu.)

min_max_values ​​<- rozsah (pa_map_data $ Margin, na.rm = TRUE)

trump_palette <- colorNumeric (paleta = "červené",

doména = c (min_max_values ​​[1], min_max_values ​​[2]))

clinton_palette <- colorNumeric (paleta = "Blues",

doména = c (min_max_values ​​[1], min_max_values ​​[[2]]))

Vytvorí sa ďalšia skupina kódovdva rôzne dátové rámce: Jeden pre každého kandidáta, ktorý obsahuje iba miesta, ktoré kandidát získal. Mať dva dátové rámce mi pomáha získať jemnú kontrolu nad vyskakovacími oknami a farbami. Pre každú môžem dokonca použiť iný vyskakovací text.

trump_df <- pa_map_data [pa_map_data $ Winner == "Trump",]

clinton_df <- pa_map_data [pa_map_data $ Winner == "Clinton",]

Vyskakovacie okná

Ďalšou úlohou sú tieto kontextové okná. Ďalej generujem niekoľko HTML vrátanesilný značky pre tučný text a br značky na zalomenie riadkov. Ak nepoznáte lepidlo, kód v zložených zátvorkách {} sú premenné, ktoré sa vyhodnocujú. V rozbaľovacích oknách zobrazím meno víťazného kandidáta, za ktorým nasleduje jeho celkový počet hlasov, meno a celková suma hlasov druhého kandidáta a rozpätie víťazstva v danom kraji. Theváhy :: čiarka () - funkcia pridá čiarku k celkovému číslu hlasovania tisíc alebo viac a -presnosť = 1 zaisťuje, že je to celé číslo bez desatinných miest.

Kód to potom zreťazí lepidlo () textový reťazec do htmltools “HTML () funkcia, ktorá príručka potrebuje na správne zobrazenie vyskakovacieho textu.

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

Víťaz: Trump

Trump: {scales :: comma (trump_df $ Trump, precision = 1)}

Clinton: {scales :: comma (trump_df $ Clinton, precision = 1)}

Okraj: {scales :: comma (trump_df $ Margin, precision = 1)} ")%>%

lapply (htmltools :: HTML)

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

Víťaz: Clinton

Clinton: {scales :: comma (clinton_df $ Clinton, precision = 1)}

Trump: {scales :: comma (clinton_df $ Trump, precision = 1)}

Okraj: {scales :: comma (clinton_df $ Margin, precision = 1)} ")%>%

lapply (htmltools :: HTML)

Kód mapy

Nakoniec mapa. Mapový kód začína vytvorením základného objektu letáku pomocou leták () bez pridanie údajov ako argumentu v hlavnom objekte. Je to preto, že budem používať dva rôzne súbory údajov. Nasledujúci riadok v nižšie uvedenom kóde nastavuje dlaždice pozadia na CartoDB Positron. (To je voliteľné. Môžete použiť predvolený, ale tento štýl sa mi páči.)

leták ()%>%

addProviderTiles ("CartoDB.Positron")

Ďalej použijem leták addPolygons () fungovať dvakrát, jeden pre dátový rámec každého kandidáta prekrytý rovnakou mapovou vrstvou.

leták ()%>%

addProviderTiles ("CartoDB.Positron")%>%

addPolygons (

data = trump_df,

fillColor = ~ trump_palette (trump_df $ Margin),

štítok = trump_popup,

zdvih = PRAVDA,

smoothFactor = 0,2,

fillOpacity = 0,8,

color = "# 666",

hmotnosť = 1

) %>%

addPolygons (

data = clinton_df,

fillColor = ~ clinton_palette (clinton_df $ Margin),

label = clinton_popup,

zdvih = PRAVDA,

smoothFactor = 0,2,

fillOpacity = 0,8,

color = "# 666",

hmotnosť = 1

)

Vo vyššie uvedenom bloku kódu som nastavil údaje pre každú z nich addPolygons () funkciu do dátového rámca každého kandidáta. The fillColor argument vezme paletu každého kandidáta a použije ju na jeho okraj víťazstva. Vyskakovacie okno (v skutočnosti rollover štítok) bude HTML tohto kandidáta, ktoré som vytvoril vyššie.

Zvyšok je štandardný dizajn. mŕtvica nastavuje hraničnú čiaru okolo každého mnohouholníka. smoothFactor zjednodušuje zobrazenie polygónových obrysov; Hodnotu som skopíroval z ukážkovej mapy RStudio, ktorá sa mi páčila. A fillOpacity je to, čo by ste čakali.

farba je farba mnohouholníková hraničná čiara, nie samotný mnohouholník (mnohouholník farba bol nastavený s fillColor). váha je hrúbka hraničnej čiary mnohouholníka v pixeloch.

Tento kód generuje mapu, ako je tá dole, ale s pridanou schopnosťou posúvať kurzor myši (alebo klepnúť na mobil) a zobraziť podkladové údaje.

Sharon Machlis,

Philadelphia je vpravo dole. Môžete vidieť, aké dôležité je to z hľadiska počtu obyvateľov v porovnaní so všetkými ostatnými oblasťami Pensylvánie, ktoré sú na mape veľké, ale majú oveľa menej voličov.

Sharon Machlis,

Mohlo by byť zaujímavé zmapovať rozdiel v hrubých maržiach medzi niektorými voľbami, napríklad v Pensylvánii v rokoch 2016 vs. 2020. Táto mapa by ukázala, kde sa vzory najviac posunuli, a mohla by pomôcť vysvetliť zmeny v celoštátnych výsledkoch.

Ak vás zaujíma viac vizualizácií volebných údajov, sprístupnil som na stránkach GitHub balík voleb2R. Môžete si ho nainštalovať tak, ako je, alebo si pozrieť môj R kód na GitHub a prispôsobiť ho pre vlastnú potrebu.

Ďalšie tipy R nájdete na stránke Robte viac s R.

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