Programování

Jak vytvořit volební mapu v R.

Pokud mapujete volební výsledky, řekněme, amerických prezidentských voleb podle státu, může mít smysl zobrazit pouze jednu červenou barvu pro státy vyhrané republikány a jednu modrou barvu pro státy vyhrané demokraty. Je to proto, že nezáleží na tom, zda kandidát vyhraje o tři tisíce hlasů nebo o tři miliony: Je to „vítěz bere vše“.

Ale při analýze výsledků a státní volby podle okresnebo celoměstské volby podle okrsek, na marži záleží. O vítězi rozhoduje celkový součet. Samotná výhra v Atlantě není vše, co potřebujete vědět, například když se podíváte na celostátní výsledky guvernéra v Gruzii. Chtěli byste vědět, kolik hlasů demokrat získal podlea porovnat to s jinými oblastmi.

Proto rád vytvářím mapy, které jsou barevně odlišeny podle vítěze a s intenzitou barvy ukazující okraj vítězství. To vám řekne, které oblasti přispěly více a které méně přispěly k celkovému výsledku.

V této ukázce použiji prezidentské výsledky z Pennsylvánie 2016. Chcete-li pokračovat, stáhněte si data a soubory geoprostorových tvarů:

stáhněte si výsledky voleb v Pensylvánii 2016 podle krajů a krajských tvarových souborů volební datový soubor a tvarový soubor. Sharon Machlis

Nejprve načtu nějaké balíčky: dplyr, lepidlo, váhy, htmltools, sf a leták. Použiji rio k importu datového souboru CSV, takže to budete chtít také ve svém systému.

knihovna (dplyr); knihovna (lepidlo); knihovna (váhy);

knihovna (htmltools); knihovna (sf); knihovna (leták)

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

Import a příprava dat

Dále používám sf st_read () funkce pro import tvaru souboru pennsylvánských krajů.

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

stringsAsFactors = FALSE)

Nelíbí se mi název okresního sloupce COUNTY_NAM v pa_geo, takže ho pomocí tohoto kódu změním na „County“:

jména (pa_geo) [2] <- "kraj"

Než sloučím svá data s geografií, chci se ujistit, že názvy krajů jsou v obou souborech stejné. dplyr's anti_join () funkce sloučí dvě datové sady a ukazuje, které řádky ne mít shodu. Výsledky uložím do datového rámce zvaného problémy a podívám se na prvních šest řádků s head () a první tři sloupce:

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

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

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

Je tu jeden problémový řádek. Je to proto, že McKean County je MCKEAN v těchto datech, ale McKEAN v druhém datovém rámci. Změním McKeana na všechny čepice v pa_data a spustím anti_join () zkontrolovat znovu.

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

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

Nyní by neměly existovat žádné problémové řádky.

Další řádek kódu sloučí data s geografií:

pa_map_data <- sloučit (pa_geo, pa_data, by = "County")

Nakonec se ujistím, že moje nová geografie a datový objekt používají to samé projekce jak to dělají moje letáky. Projekce je docela složité téma GIS. Prozatím jen vím, že potřebuji WGS84, aby odpovídal letáku. Tento kód nastavuje moji projekci:

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

Nyní, když jsou moje data ve tvaru, který potřebuji, mám další tři úkoly: Vytvořit barevné palety pro každého kandidáta, vytvořit vyskakovací okna pro mapu a poté kódovat samotnou mapu.

Barevné palety

Začnu paletami.

Chystám se mapovat hrubé rozdíly v hlasování v této ukázce, ale místo toho můžete použít procentní rozdíly. První řádek v níže uvedeném kódu používá základní R. rozsah() funkce pro získání nejmenších a největších rozdílů hlasování ve sloupci Okraj. Přiřadil jsem nejsvětlejší barvu nejmenšímu číslu a nejtmavší největšímu číslu.

Dále vytvořím dvě palety pomocí konvenční červené pro republikány a modré pro demokraty. Pro obě palety používám stejnou stupnici intenzity: nejsvětlejší pro nejnižší rozpětí bez ohledu na kandidáta a nejvyšší pro nejvyšší rozpětí bez ohledu na kandidáta. To mi dá představu o tom, kde byl každý kandidát nejsilnější na jedné stupnici intenzity. Používám letáky colorNumeric () funkce s barvou červené nebo modré barvy palety k vytvoření palety. (The doména argument nastavuje minimální a maximální hodnoty pro barevnou š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]]))

Vytvoří se další skupina kódůdva různé datové rámce: Jeden pro každého kandidáta, obsahující pouze místa, která kandidát vyhrál. Mít dva datové rámce mi pomáhá získat jemnou kontrolu nad vyskakovacími okny a barvami. Dokonce mohu pro každý použít jiný vyskakovací text.

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

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

Vyskakovací okna

Dalším úkolem jsou tato vyskakovací okna. Níže generuji nějaké HTML včetněsilný značky pro tučný text a br značky pro zalomení řádků. Pokud nejste obeznámeni s lepidlem, jsou kód uvnitř složených závorek proměnné, které jsou vyhodnocovány. V rozbalovacích oknech zobrazím jméno vítězného kandidáta, za ním následuje jeho součet hlasů, jméno a součet hlasů druhého kandidáta a rozpětí vítězství v tomto kraji. Theváhy :: čárka () Funkce přidá čárku k součtu číselných hlasů tisíc nebo více apřesnost = 1 zajišťuje, že se jedná o celé číslo bez desetinných míst.

Kód pak potrubí, že lepidlo() textový řetězec do htmltools “HTML () funkce, který leták potřebuje ke správnému zobrazení vyskakovacího textu.

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

Vítěz: Trump

Trump: {scales :: comma (trump_df $ Trump, přesnost = 1)}

Clinton: {scales :: comma (trump_df $ Clinton, přesnost = 1)}

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

lapply (htmltools :: HTML)

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

Vítěz: Clinton

Clinton: {scales :: comma (clinton_df $ Clinton, přesnost = 1)}

Trump: {scales :: comma (clinton_df $ Trump, přesnost = 1)}

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

lapply (htmltools :: HTML)

Kód mapy

Nakonec mapa. Mapový kód začíná vytvořením základního objektu letáku pomocí leták() bez přidání dat jako argumentu do hlavního objektu. Je to proto, že budu používat dva různé soubory dat. Další řádek v níže uvedeném kódu nastaví dlaždice pozadí na CartoDB Positron. (To je volitelné. Můžete použít výchozí, ale tento styl se mi líbí.)

leták ()%>%

addProviderTiles ("CartoDB.Positron")

Dále použiji letáky addPolygons () funkce dvakrát, jeden pro datový rámec každého kandidáta překrytý stejnou mapovou vrstvou.

leták ()%>%

addProviderTiles ("CartoDB.Positron")%>%

addPolygons (

data = trump_df,

fillColor = ~ trump_palette (trump_df $ Margin),

štítek = trump_popup,

zdvih = PRAVDA,

smoothFactor = 0,2,

fillOpacity = 0,8,

color = "# 666",

hmotnost = 1

) %>%

addPolygons (

data = clinton_df,

fillColor = ~ clinton_palette (clinton_df $ Margin),

štítek = clinton_popup,

zdvih = PRAVDA,

smoothFactor = 0,2,

fillOpacity = 0,8,

color = "# 666",

hmotnost = 1

)

Ve výše uvedeném bloku kódu jsem nastavil data pro každého addPolygons () funkce do datového rámce každého kandidáta. The vyplň barvu argument vezme paletu každého kandidáta a použije ji na hranici jeho vítězství. Vyskakovací okno (ve skutečnosti rollover označení) bude HTML tohoto kandidáta, které jsem vytvořil výše.

Zbytek je standardní konstrukce. mrtvice nastaví hraniční čáru kolem každého mnohoúhelníku. smoothFactor zjednodušuje zobrazení polygonového obrysu; Zkopíroval jsem hodnotu z ukázkové mapy RStudio, která se mi líbila. A fillOpacity je to, co byste očekávali.

barva je barva mnohoúhelník hranice, ne samotný mnohoúhelník (mnohoúhelník barva byl nastaven s vyplň barvu). hmotnost je tloušťka hraniční čáry mnohoúhelníku v pixelech.

Tento kód generuje mapu, jako je ta níže, ale s přidanou schopností přejet myší (nebo klepnout na mobil) a zobrazit podkladová data.

Sharon Machlis,

Philadelphia je vpravo dole. Vidíte, jak důležité je to populačně ve srovnání se všemi ostatními oblastmi Pensylvánie, které jsou na mapě velké, ale mají mnohem méně voličů.

Sharon Machlis,

Může být zajímavé zmapovat rozdíl v hrubých maržích mezi volbami, jako je Pensylvánie v letech 2016 vs. 2020. Tato mapa by ukázala, kde se vzory nejvíce posunuly, a mohla by pomoci vysvětlit změny v celostátních výsledcích.

Pokud vás zajímá více vizualizací volebních údajů, zpřístupnil jsem balíček voleb2R na GitHubu. Můžete jej nainstalovat tak, jak je, nebo se podívat na můj R kód na GitHub a přizpůsobit jej pro vlastní potřebu.

Další tipy pro R najdete na stránce Udělejte více s R.

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