Programmēšana

Kā izveidot vēlēšanu karti R

Ja kartējat, piemēram, ASV prezidenta vēlēšanu vēlēšanu rezultātus pēc štatiem, var būt jēga tikai parādīt vienu sarkanu krāsu republikāņu uzvarētajām valstīm un vienu zilo krāsu štatiem, kurus uzvarējuši demokrāti. Tas ir tāpēc, ka nav svarīgi, vai kandidāts uzvar ar trim tūkstošiem balsu vai par trim miljoniem: tas ir “uzvarētājs paņem visu”.

Bet, analizējot a štata vēlēšanas pēc novadsvai a pilsētas mēroga vēlēšanas pēc iecirknis, maržai ir nozīme. Uzvarētāju izlemj kopējā summa. Pats “Atlanta” iegūšana nav viss, kas jums jāzina, piemēram, apskatot Džordžijas štata rezultātus gubernatoram. Jūs vēlaties uzzināt, cik balsu ieguva demokrāts pēcun salīdziniet to ar citām jomām.

Tāpēc man patīk izveidot kartes, kuras uzvarētājs krāso un ar krāsas intensitāti, kas parāda uzvaras robežu. Tas jums pateiks, kuras teritorijas veicināja vairāk un kuras mazāk sekmēja kopējo rezultātu.

Šajā demonstrācijā es izmantošu Pensilvānijas 2016. gada prezidenta rezultātus. Ja vēlaties sekot līdzi, lejupielādējiet datus un ģeotelpiskos formas failus:

lejupielādējiet Pensilvānijas 2016. gada vēlēšanu rezultātus pēc apgabala un apgabala shapefiles Vēlēšanu datu faila un shapefile. Šarona Mačlisa

Vispirms es ielādēju dažus iepakojumus: dplyr, līmi, svarus, htmltools, sf un brošūru. Datu CSV faila importēšanai izmantošu rio, tāpēc to vēlaties arī savā sistēmā.

bibliotēka (dplyr); bibliotēka (līme); bibliotēka (svari);

bibliotēka (HTML rīki); bibliotēka (sf); bibliotēka (brošūra)

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

Datu importēšana un sagatavošana

Tālāk es izmantoju sf's st_read () funkcija importēt Pensilvānijas apgabalu šablonu.

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

stringsAsFactors = FALSE)

Man nepatīk apgabala kolonnas nosaukums COUNTY_NAM pa_geo, tāpēc es mainīšu to uz “County” ar šo kodu:

vārdi (pa_geo) [2] <- "apgabals"

Pirms sapludinu savus datus ar savu ģeogrāfisko atrašanās vietu, es vēlos pārliecināties, ka apgabalu nosaukumi abos failos ir vienādi. dplyr's anti_join () funkcija apvieno divas datu kopas un parāda, kuras rindas nevajag ir sērkociņš. Rezultāti tiks saglabāti datu rāmī, ko sauc par problēmām, un apskatīšu pirmās sešas rindas ar head () un pirmās trīs kolonnas:

problēmas <- anti_join (pa_geo, pa_data, autors = "County")

galva (problēmas [, 1: 3])

MSLINK apgabala COUNTY_NUM ģeometrija 1 42 MCKEAN 42 MULTIPOLYGON (((-78.20638 4 ...

Ir viena problēmu rinda. Tas ir tāpēc, ka McKean County šajos datos ir MCKEAN, bet McKEAN - citos datu rāmjos. Es mainīšu Makkeinu uz visiem pa_data lielajiem burtiem un palaidīšu anti_join () pārbaudi vēlreiz.

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

anti_join (pa_geo, pa_data, autors = "apgabals")

Tagad nevajadzētu būt problēmu rindām.

Nākamā koda rinda apvieno datus ar ģeogrāfiju:

pa_map_data <- apvienot (pa_geo, pa_data, pēc = "apgabals")

Visbeidzot, es pārliecināšos, ka manā jaunajā ģeogrāfiskajā un datu objektā tiek izmantots tas pats projekcija kā to dara manas brošūras flīzes. Projekcija ir diezgan sarežģīta GIS tēma. Pagaidām vienkārši zinu, ka man ir nepieciešams WGS84, lai tas atbilstu brošūrai. Šis kods nosaka manu projekciju:

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

Tagad, kad mani dati ir vajadzīgajā formā, man ir vēl trīs uzdevumi: Izveidot krāsu paletes katram kandidātam, izveidot uznirstošos logus kartei un pēc tam kodēt pašu karti.

Krāsu paletes

Sākšu ar paletēm.

Es gatavojos kartēt neapstrādātas balsu atšķirības šajā demonstrācijā, bet tā vietā jūs varētu vēlēties izmantot procentuālās atšķirības. Pirmajā kodā zemāk esošajā kodā tiek izmantotas bāzes R diapazons () funkcija, lai iegūtu mazākās un lielākās balsu atšķirības slejā Margin. Esmu piešķīris gaišāko krāsu mazākajam skaitlim un tumšāko lielākajam skaitlim.

Tālāk es izveidoju divas paletes, izmantojot parasto sarkano republikāņiem un zilo demokrātiem. Es izmantoju vienādu intensitātes skalu abām paletēm: vieglākā zemākajai robežai neatkarīgi no kandidāta un visaugstākā augstākajai robežai neatkarīgi no kandidāta. Tas man radīs priekšstatu par to, kur katrs kandidāts bija spēcīgākais vienā intensitātes skalā. Es izmantoju brošūru colorNumeric () funkcija ar paletes krāsu Sarkanā vai Zilā, lai izveidotu paletes. (The domēns arguments nosaka krāsu skalas minimālās un maksimālās vērtības.)

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

trump_palette <- colorNumeric (palete = "Sarkanie",

domēns = c (min_max_values ​​[1], min_max_values ​​[2]))

clinton_palette <- colorNumeric (palete = "Blūzs",

domēns = c (min_max_values ​​[1], min_max_values ​​[[2]]))

Nākamā kodu grupa izveidodivi dažādi datu rāmji: Katram kandidātam pa vienam, norādot tikai kandidāta iegūtās vietas. Divu datu rāmju izmantošana man palīdz precīzi kontrolēt uznirstošos logus un krāsas. Katram es pat varu izmantot atšķirīgu uznirstošo tekstu.

trump_df <- pa_map_data [pa_map_data $ uzvarētājs == "Trump",]

clinton_df <- pa_map_data [pa_map_data $ uzvarētājs == "Clinton",]

Uznirstošie logi

Nākamais uzdevums ir uznirstošie logi. Zemāk es ģenerēju HTML, ieskaitotspēcīgs tagi treknrakstam un br tagi rindiņu pārtraukumiem. Ja neesat pazīstams ar līmi, {} iekavās esošais kods ir mainīgie, kas tiek novērtēti. Uznirstošajos logos es parādīšu uzvarētāja kandidāta vārdu, kam seko viņu balsu kopskaits, otra kandidāta vārds un balsu kopsumma, kā arī uzvaras starpība šajā apgabalā. Thesvari :: komats () funkcija pievieno komatu skaitlisko balsu kopsummai tūkstoš vai vairāk, unprecizitāte = 1 pārliecinās, ka tas ir apaļš vesels skaitlis bez cipariem aiz komata.

Pēc tam kods to caurulē līme () teksta virkne HTML rīkos ”HTML () funkcija, kurai brošūrai ir pareizi jāparāda uznirstošais teksts.

trump_popup <- līme ("{trump_df $ County} COUNTY

Uzvarētājs: Tramps

Tramps: {svari :: komats (trump_df $ Trump, precizitāte = 1)}

Klintone: {svari :: komats (trump_df $ Clinton, precizitāte = 1)}

Marža: {svari :: komats (trump_df $ starpība, precizitāte = 1)} ")%>%

lapply (htmltools :: HTML)

clinton_popup <- līme ("{clinton_df $ County} COUNTY

Uzvarētājs: Klintone

Klintone: {svari :: komats (clinton_df $ Clinton, precizitāte = 1)}

Tramps: {svari :: komats (clinton_df $ Trump, precizitāte = 1)}

Marža: {svari :: komats (clinton_df $ starpība, precizitāte = 1)} ")%>%

lapply (htmltools :: HTML)

Kartes kods

Beidzot karte. Kartes kods sākas ar brošūras pamata objekta izveidošanu, izmantojot brošūra () bez pievienojot datus kā argumentu galvenajā objektā. Tas ir tāpēc, ka es izmantošu divas dažādas datu kopas. Nākamā rinda zemāk esošajā kodā nosaka fona elementus kā CartoDB Positron. (Tas nav obligāti. Jūs varat izmantot noklusējumu, bet man tas patīk.)

brošūra ()%>%

addProviderTiles ("CartoDB.Positron")

Tālāk es izmantošu brošūru addPolygons () funkcija divas reizes, katra kandidāta datu rāmim pa vienam kartes slānim.

brošūra ()%>%

addProviderTiles ("CartoDB.Positron")%>%

addPolygons (

dati = trump_df,

fillColor = ~ trump_palete (trump_df $ starpība),

label = trump_popup,

insults = TRUE,

smoothFactor = 0,2,

fillOpacity = 0,8,

color = "# 666",

svars = 1

) %>%

addPolygons (

dati = clinton_df,

fillColor = ~ clinton_palette (clinton_df $ Margin),

label = clinton_popup,

insults = TRUE,

smoothFactor = 0,2,

fillOpacity = 0,8,

color = "# 666",

svars = 1

)

Iepriekš minētajā kodu blokā es iestatīju datus katram addPolygons () katra kandidāta datu rāmim. The fillColor arguments ņem katra kandidāta paleti un pieliek to savai uzvaras robežai. Uznirstošais logs (faktiski kursors etiķete) būs šī kandidāta HTML kods, kuru es izveidoju iepriekš.

Pārējais ir standarta dizains. insults nosaka robežu līniju ap katru daudzstūri. smoothFactor vienkāršo daudzstūra kontūras attēlojumu; Es nokopēju vērtību no RStudio demo kartes, kas man patika. Un fillOpacity ir tas, ko jūs varētu sagaidīt.

krāsa ir krāsa daudzstūra robežas līnija, nevis pats daudzstūris (daudzstūris krāsa tika iestatīts ar fillColor). svars ir daudzstūra robežlīnijas biezums pikseļos.

Šis kods ģenerē karti, piemēram, zemāk redzamo, bet ar papildu iespēju virzīt peli (vai pieskarties mobilajam tālrunim) un redzēt pamatā esošos datus.

Sharon Machlis,

Filadelfija atrodas apakšējā labajā stūrī. Jūs varat redzēt, cik svarīgi tas ir pēc iedzīvotāju skaita, salīdzinot ar visiem citiem Pensilvānijas apgabaliem, kas kartē ir lieli, bet tur ir daudz mazāk vēlētāju.

Sharon Machlis,

Varētu būt interesanti kartēt atšķirība neapstrādātās balsu starpības starp vienām un citām vēlēšanām, piemēram, Pensilvānijā 2016. gadā salīdzinājumā ar 2020. gadu. Šī karte parādīs, kur modeļi visvairāk mainījās, un varētu palīdzēt izskaidrot izmaiņas valsts mēroga rezultātos.

Ja jūs interesē vēlēšanu datu vizualizācija, es vietnē GitHub esmu darījis pieejamu vēlēšanu2 paketi. Varat to instalēt tādu, kāds tas ir, vai pārbaudīt manu R kodu vietnē GitHub un pielāgot to savām vajadzībām.

Lai iegūtu vairāk R padomu, dodieties uz lapu Do More With R.

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