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 MachlisNajprv 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} COUNTYVíť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.