Ohjelmointi

Kuinka luoda vaalikartta R: ssä

Jos kartoitat esimerkiksi Yhdysvaltojen presidentinvaalien vaalien tuloksia osavaltioittain, voi olla järkevää näyttää vain yksi punainen väri republikaanien voittamille osavaltioille ja yksi sininen sininen demokraattien voittamille valtioille. Tämä johtuu siitä, että ei ole väliä, voittaako ehdokas kolme tuhatta ääntä vai kolme miljoonaa: se on "voittaja vie kaikki".

Mutta kun analysoidaan a osavaltion vaalit mennessä läänitai a kaupunginlaajuiset vaalit mennessä kävelykatu, marginaalilla on merkitystä. Voittajan päättää kokonaismäärä. Itse "Atlantan" voittaminen ei ole kaikki, mitä sinun tarvitsee tietää, kun tarkastelet esimerkiksi Georgian osavaltion laajuisia tuloksia kuvernöörille. Haluat tietää, kuinka monta ääntä demokraatti voitti mennessäja vertaa sitä muihin alueisiin.

Siksi haluan luoda karttoja, jotka voittaja värikoodaa ja värin voimakkuudella, joka osoittaa voittomarginaalin. Se kertoo, mitkä alueet vaikuttivat enemmän ja mitkä vähemmän kokonaistulokseen.

Tässä esittelyssä käytän Pennsylvania 2016: n presidentin tuloksia. Jos haluat seurata mukana, lataa tiedot ja paikkatietojen muotoiset tiedostot:

lataa Pennsylvania 2016 -vaalitulokset läänin ja läänin muotoilutiedostojen mukaan Vaalitiedot ja shapefile. Sharon Machlis

Ladaan ensin joitain paketteja: dplyr, liima, vaaka, htmltools, sf ja esite. Tuon CSO-datatiedoston rion avulla, joten haluat sen myös järjestelmässäsi.

kirjasto (dplyr); kirjasto (liima); kirjasto (vaaka);

kirjasto (htmltools); kirjasto (sf); kirjasto (esite)

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

Tietojen tuonti ja valmistelu

Seuraavaksi käytän sf: itä st_read () toiminto tuoda Pennsylvanian läänien muotoinen tiedosto.

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

stringsAsFactors = EPÄTOSI)

En pidä läänin sarakkeen nimestä COUNTY_NAM pa_geossa, joten vaihdan sen maakuntaan tällä koodilla:

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

Ennen kuin yhdistän tietoni maantieteelliseen tietooni, haluan varmistaa, että lääninimet ovat samat molemmissa tiedostoissa. dplyr's anti_join () funktio yhdistää kaksi tietojoukkoa ja näyttää mitkä rivit ei on ottelu. Tallennan tulokset datakehykseen, jota kutsutaan ongelmiksi, ja tarkastelen kuutta ensimmäistä riviä head (): llä ja kolmea ensimmäistä saraketta:

ongelmat <- anti_join (pa_geo, pa_data, kirjoittanut = "County")

pää (ongelmat [, 1: 3])

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

On yksi ongelma rivi. Tämä johtuu siitä, että McKean County on näissä tiedoissa MCKEAN, mutta toisessa tietokehyksessä McKEAN. Muutan McKeanin olemaan kaikki pa_data-kirjaimet ja suoritan anti_join () Tarkista uudelleen.

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

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

Nyt ei pitäisi olla ongelma-rivejä.

Seuraava koodirivi yhdistää tiedot maantieteeseen:

pa_map_data <- yhdistä (pa_geo, pa_data, kirjoittanut = "County")

Lopuksi aion varmistaa, että uudessa maantieteellisessä ja dataobjektissani käytetään samaa projektio kuten lehtini laatat tekevät. Projektio on melko monimutkainen GIS-aihe. Toistaiseksi tiedän vain, että tarvitsen WGS84: n vastaamaan esitteitä. Tämä koodi asettaa projektioni:

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

Nyt kun tietoni ovat tarvittavassa muodossa, minulla on vielä kolme tehtävää: Luo väripaletit kullekin ehdokkaalle, luo ponnahdusikkunat kartalle ja koodaa sitten itse kartta.

Väripaletit

Aloitan paleteista.

Aion kartoittaa raaka äänierot tässä esittelyssä, mutta haluat ehkä käyttää prosentuaalisia eroja sen sijaan. Alla olevan koodin ensimmäinen rivi käyttää peruskirjaimia R alue () -toiminto saadaksesi pienimmät ja suurimmat äänierot Marginaali -sarakkeeseen. Olen määrittänyt vaalimman värin pienimmälle numerolle ja tummimman suurimmalle.

Seuraavaksi luon kaksi palettia, käyttäen tavanomaista punaista republikaaneille ja sinistä demokraateille. Käytän samaa intensiteettiastetta molemmille paleteille: kevyin pienimmälle marginaalille ehdokkaasta riippumatta ja korkein korkeimmalle marginaalille ehdokkaasta riippumatta. Tämä antaa minulle käsityksen siitä, missä kukin ehdokas oli vahvin yhdellä intensiteettiasteikolla. Käytän esitteitä colorNumeric () toiminto, jonka palettiväri on Punainen tai Sininen, palettien luomiseksi. ( verkkotunnus argumentti asettaa väriasteikon vähimmäis- ja enimmäisarvot.)

min_max_values ​​<- alue (pa_map_data $ marginaali, na.rm = TOSI)

trump_palette <- colorNumeric (paletti = "Punaiset",

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

clinton_paletti <- colorNumeric (paletti = "Blues",

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

Seuraava koodiryhmä luokaksi erilaista datakehystä: Yksi kullekin ehdokkaalle, joka sisältää vain ehdokkaan voittamat paikat. Kahden datakehyksen käyttäminen auttaa minua saamaan tarkan hallinnan ponnahdusikkunoista ja väreistä. Voin jopa käyttää eri pop-up-tekstiä kullekin.

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

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

Ponnahdusikkunat

Seuraava tehtävä on nämä ponnahdusikkunat. Alla tuotan HTML-koodia, mukaan lukienvahva Tunnisteet lihavoidulle tekstille ja br rivinvaihtotunnisteet. Jos et tunne liimaa, {} aaltosulkeissa oleva koodi on muuttujia, jotka arvioidaan. Ponnahdusikkunoissa näytän voittaneen ehdokkaan nimen, sen jälkeen heidän äänensä yhteensä, toisen ehdokkaan nimen ja äänten kokonaismäärän sekä voittomarginaalin kyseisessä läänissä.asteikot :: pilkku () - funktio lisää pilkun tuhannen tai sitä suurempaan numeroarvoontarkkuus = 1 varmistaa, että se on pyöreä kokonaisluku ilman desimaalipilkkuja.

Sitten koodi putki tuo liima() tekstimerkkijono HTML-työkaluiksi ”HTML () toiminto, jonka esitteen on näytettävä ponnahdusikkuna oikein.

trump_popup <- liima ("{trump_df $ County} LÄÄNÄ

Voittaja: Trump

Trump: {asteikot :: pilkku (trump_df $ Trump, tarkkuus = 1)}

Clinton: {asteikot :: pilkku (trump_df $ Clinton, tarkkuus = 1)}

Marginaali: {asteikot :: pilkku (trump_df $ marginaali, tarkkuus = 1)} ")%>%

lapply (htmltools :: HTML)

clinton_popup <- liima ("{clinton_df $ County} LÄÄNÄ

Voittaja: Clinton

Clinton: {asteikot :: pilkku (clinton_df $ Clinton, tarkkuus = 1)}

Trump: {asteikot :: pilkku (clinton_df $ Trump, tarkkuus = 1)}

Marginaali: {asteikot :: pilkku (clinton_df $ marginaali, tarkkuus = 1)} ")%>%

lapply (htmltools :: HTML)

Karttakoodi

Viimeinkin kartta. Karttakoodi alkaa luomalla esite-esine käyttäen esite() ilman lisäämällä tietoja argumenttina pääobjektissa. Tämä johtuu siitä, että käytän kahta erilaista tietojoukkoa. Alla olevan koodin seuraava rivi asettaa taustaruudut CartoDB Positroniksi. (Se on valinnainen. Voit käyttää oletusarvoa, mutta pidän siitä tyylistä.)

esite ()%>%

addProviderTiles ("CartoDB.Positron")

Seuraavaksi käytän esitteitä addPolygons () toimii kahdesti, yksi jokaisen ehdokkaan datakehykselle päällekkäin samalla karttakerroksella.

esite ()%>%

addProviderTiles ("CartoDB.Positron")%>%

addPolygons (

data = trump_df,

fillColor = ~ trump_paletti (trump_df $ marginaali),

label = trump_popup,

aivohalvaus = TOSI,

sileäKerroin = 0,2,

fillOpacity = 0,8,

väri = "# 666",

paino = 1

) %>%

addPolygons (

data = clinton_df,

fillColor = ~ clinton_paletti (clinton_df $ marginaali),

label = clinton_popup,

aivohalvaus = TOSI,

sileäKerroin = 0,2,

fillOpacity = 0,8,

väri = "# 666",

paino = 1

)

Edellä olevassa koodilohkossa asetin tiedot kullekin addPolygons () jokaisen ehdokkaan tietokehykseen. täyttöväri argumentti vie jokaisen ehdokkaan paletin ja soveltaa sitä heidän voittomarginaaliinsa. Ponnahdusikkuna (oikeastaan ​​rollover etiketti) on kyseisen ehdokkaan HTML, jonka luin yllä.

Loput ovat vakiomallia. aivohalvaus asettaa rajaviivan jokaisen polygonin ympärille. smoothFactor yksinkertaistaa monikulmion ääriviivojen näyttöä; Kopioin arvon RStudio-demokartasta, josta pidin. Ja fillOpacity on mitä odotat.

väri- on värin väri monikulmion rajaviiva, ei itse monikulmio (monikulmio väri- asetettiin täyttöväri). paino on monikulmion rajaviivan paksuus pikseleinä.

Tämä koodi luo alla olevan kartan kaltaisen kartan, mutta sillä on lisäksi mahdollisuus siirtää hiiri (tai napauttaa matkapuhelinta) ja nähdä taustalla olevat tiedot.

Sharon Machlis,

Philadelphia on oikeassa alakulmassa. Voit nähdä, kuinka tärkeää se on, väestötietoisesti, verrattuna kaikkiin muihin Pennsylvanian alueisiin, jotka ovat suuria kartalla, mutta joilla on paljon vähemmän äänestäjiä.

Sharon Machlis,

Voi olla mielenkiintoista kartoittaa ero raaka äänimarginaali vaalien ja muiden välillä, kuten Pennsylvania vuonna 2016 vs. 2020. Tämä kartta osoittaisi, missä kuviot siirtyivät eniten, ja se voisi auttaa selittämään muutoksia osavaltion laajuisissa tuloksissa.

Jos olet kiinnostunut lisää vaalitietojen visualisointeja, olen tehnyt G2-sivustolla saataville vaalit2 R -paketin. Voit joko asentaa sen sellaisenaan tai tarkistaa R-koodini GitHubissa ja räätälöidä sen omaan käyttöön.

Jos haluat lisää R-vinkkejä, siirry Do Do With With R -sivulle.