Programiranje

Kako ustvariti zemljevid volitev v R

Če načrtujete rezultate volitev na primer ameriških predsedniških volitev po državah, je lahko smiselno prikazati samo eno rdečo barvo za države, ki so jih zmagali republikanci, in eno modro za države, ki so jih zmagali demokrati. To je zato, ker je vseeno, ali kandidat zmaga s tri tisoč glasovi ali tremi milijoni: to je "zmagovalec vzame vse."

Toda pri analizi rezultatov a državne volitve avtor okrožjeali a volitve po mestu avtor predel, marža je pomembna. Skupni seštevek je tisti, ki odloča o zmagovalcu. Zmaga v "Atlanti" sama ni vse, kar morate vedeti, če na primer gledate rezultate zvezne države Georgia za guvernerja. Zanimalo bi vas, koliko glasov je demokrat osvojil avtorin to primerjajte z drugimi področji.

Zato rad ustvarjam zemljevide, ki jih zmagovalec barvno kodira in z intenzivnostjo barve, ki prikazuje mejo zmage. To vam pove, katera področja so k skupnemu rezultatu prispevala več in katera manj.

V tej predstavitvi bom uporabil predsedniške rezultate v Pensilvaniji 2016. Če želite nadaljevati, prenesite podatke in datoteke geoprostorskih oblik:

prenesite rezultate volitev v Pensilvaniji 2016 po okrožjih in okrožjih shapefiles Datoteka z informacijami o volitvah in shapefile. Sharon Machlis

Najprej naložim nekaj paketov: dplyr, lepilo, tehtnice, htmltools, sf in letake. Za uvoz podatkovne datoteke CSV bom uporabil rio, zato boste to želeli tudi v svojem sistemu.

knjižnica (dplyr); knjižnica (lepilo); knjižnica (tehtnice);

knjižnica (htmltools); knjižnica (sf); knjižnica (zloženka)

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

Uvoz in priprava podatkov

Nato uporabim sf st_read () funkcija za uvoz oblike datoteke okrožij Pensilvanije.

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

stringsAsFactors = FALSE)

Ime stolpca COUNTY_NAM v pa_geo mi ni všeč, zato ga bom spremenil v »County« s to kodo:

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

Preden združim podatke s svojo geografijo, se želim prepričati, da sta imeni okrajev v obeh datotekah enaki. dplyr's anti_join () funkcija združi dva nabora podatkov in pokaže, katere vrstice ne imajo tekmo. Rezultate bom shranil v podatkovni okvir, imenovan težave, in si ogledal prvih šest vrstic z glavo () in prve tri stolpce:

težave <- anti_join (pa_geo, pa_data, avtor = "County")

glava (težave [, 1: 3])

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

Obstaja ena vrstica s težavami. To je zato, ker je okrožje McKean v teh podatkih MCKEAN, v drugem okviru podatkov pa McKEAN. Zamenjal bom McKeana, tako da bo vse meje v pa_data, in zagnal anti_join () preveri ponovno.

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

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

Zdaj ne bi smelo biti težavnih vrstic.

Naslednja vrstica kode združi podatke z geografijo:

pa_map_data <- spajanje (pa_geo, pa_data, by = "County")

Nazadnje se bom prepričal, da moj novi geografski in podatkovni objekt uporablja enako projekcija kot to počnejo moje ploščice z letaki. Projekcija je precej zapletena GIS tema. Za zdaj samo vedite, da potrebujem WGS84, da se ujema z letakom. Ta koda določa mojo projekcijo:

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

Zdaj, ko so moji podatki v obliki, ki jo potrebujem, imam še tri naloge: Ustvari barvne palete za vsakega kandidata, ustvari pojavna okna za zemljevid in nato kodiraj sam zemljevid.

Barvne palete

Začel bom s paletami.

Bom zemljevid surove razlike v glasovanju v tej predstavitvi, vendar boste morda želeli namesto tega uporabiti odstotne razlike. Prva vrstica v spodnji kodi uporablja osnovne R-je obseg () funkcija, da dobite najmanjšo in največjo razliko v glasovanju v stolpcu Margin. Najmanjšemu številu sem dodelil najsvetlejšo barvo, največjemu pa najtemnejšo.

Nato ustvarim dve paleti, pri čemer uporabim običajno rdečo za republikance in modro za demokrate. Za obe paleti uporabljam enako lestvico intenzivnosti: najlažjo za najnižjo mejo, ne glede na kandidata, in najvišjo za najvišjo mejo, ne glede na kandidata. To mi bo dalo idejo, kje je bil vsak kandidat najmočnejši na posamezni lestvici intenzivnosti. Uporabljam letake colorNumeric () funkcija z barvo palete Reds ali Blues za ustvarjanje palet. (The domene argument nastavi najmanjšo in največjo vrednost za barvno lestvico.)

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

trump_palette <- colorNumeric (palette = "Rdeče",

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

Clinton_palette <- colorNumeric (palette = "Blues",

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

Ustvari naslednjo kodno skupinodva različna podatkovna okvira: Eno za vsakega kandidata, ki vsebuje samo mesta, ki jih je kandidat osvojil. Če imam dva podatkovna okvira, mi pomaga natančno nadzirati pojavna okna in barve. Za vsakega lahko uporabim celo različno pojavno besedilo.

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

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

Pojavna okna

Naslednja naloga so ta pojavna okna. Spodaj ustvarim nekaj HTML-ja, vključno zmočna oznake za krepko besedilo in br oznake za prelome vrstic. Če lepila ne poznate, je koda v oklepajih {} spremenljivke, ki se ocenijo. V pojavnih oknih bom prikazal ime zmagovalnega kandidata, ki mu bo sledilo skupno število glasov, ime in skupno število glasov drugega kandidata ter meja zmage v tej državi. Thetehtnice :: vejica () funkcija doda vejico številskim številom glasov tisoč ali več innatančnost = 1 poskrbi, da gre za okroglo celo število brez decimalnih mest.

Koda nato to napelje lepilo () besedilni niz v htmltools 'HTML () funkcijo, kateri letak mora pravilno prikazati pojavno besedilo.

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

Zmagovalec: Trump

Trump: {lestvice :: vejica (trump_df $ Trump, natančnost = 1)}

Clinton: {lestvice :: vejica (trump_df $ Clinton, natančnost = 1)}

Rob: {lestvice :: vejica (trump_df $ Rob, natančnost = 1)} ")%>%

lapply (htmltools :: HTML)

Clinton_popup <- lepilo ("{Clinton_df $ County} COUNTY

Zmagovalec: Clinton

Clinton: {lestvice :: vejica (Clinton_df $ Clinton, natančnost = 1)}

Trump: {lestvice :: vejica (Clinton_df $ Trump, natančnost = 1)}

Rob: {lestvice :: vejica (Clinton_df $ Rob, natančnost = 1)} ")%>%

lapply (htmltools :: HTML)

Koda zemljevida

Končno zemljevid. Koda zemljevida se začne z ustvarjanjem osnovnega predmeta letaka z uporabo brošura() brez dodajanje podatkov kot argumenta v glavni predmet. To je zato, ker bom uporabil dva različna nabora podatkov. Naslednja vrstica v spodnji kodi nastavi ploščice ozadja na CartoDB Positron. (To ni obvezno. Lahko uporabite privzeti, vendar mi je ta slog všeč.)

letak ()%>%

addProviderTiles ("CartoDB.Positron")

Nato bom uporabil letake addPolygons () deluje dvakrat, po en za podatkovni okvir vsakega kandidata, prekrit na isti plasti zemljevida.

letak ()%>%

addProviderTiles ("CartoDB.Positron")%>%

addPolygons (

podatki = trump_df,

fillColor = ~ trump_palette (trump_df $ Margin),

label = trump_popup,

kap = TRUE,

smoothFactor = 0,2,

fillOpacity = 0,8,

barva = "# 666",

teža = 1

) %>%

addPolygons (

podatki = Clinton_df,

fillColor = ~ Clinton_palette (Clinton_df $ marža),

label = Clinton_popup,

kap = TRUE,

smoothFactor = 0,2,

fillOpacity = 0,8,

barva = "# 666",

teža = 1

)

V zgornjem bloku kode nastavim podatke za vsakega addPolygons () funkcijo za podatkovni okvir vsakega kandidata. The fillColor argument vzame paleto vsakega kandidata in jo uporabi na njihovi zmagovalni meji. Pojavno okno (pravzaprav prevračanje nalepko) bo HTML tega kandidata, ki sem ga ustvaril zgoraj.

Ostalo je standardna zasnova. možganska kap nastavi mejno črto okoli vsakega poligona. smoothFactor poenostavlja prikaz obrisa poligona; Vrednost sem skopiral z demo zemljevida RStudio, ki mi je bil všeč. In fillOpacity je tisto, kar bi pričakovali.

barva je barva meja poligona, ne sam poligon (poligon barva je bil nastavljen z fillColor). utež je debelina obrobe poligona v pikslih.

Ta koda ustvari zemljevid, kot je spodnji, vendar z dodano zmožnostjo premikanja miške (ali tapkanja na mobilnem telefonu) in ogled osnovnih podatkov.

Sharon Machlis,

Spodaj desno je Philadelphia. Lahko vidite, kako pomemben je glede na prebivalstvo v primerjavi z vsemi ostalimi območji Pensilvanije, ki so velika na zemljevidu, vendar imajo veliko manj volivcev.

Sharon Machlis,

Mogoče bi bilo zanimivo preslikati Razlika v surovem številu glasov med enimi in drugimi volitvami, na primer v Pensilvaniji leta 2016 v primerjavi z letom 2020. Ta zemljevid bi pokazal, kje so se vzorci najbolj premaknili, in bi lahko razložil spremembe v rezultatih po vsej državi.

Če vas zanima več vizualizacij podatkov o volitvah, sem na GitHubu dal na voljo paket volitev2 R. Lahko ga namestite takšnega, kakršen je, ali preverite mojo kodo R na GitHubu in ga prilagodite za lastno uporabo.

Za več nasvetov R pojdite na stran Naredite več z R.

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