(Acest articol a fost publicat pentru prima dată pe John Russellși cu amabilitate a contribuit la R-bloggeri). (Puteți raporta problema legată de conținutul acestei pagini aici)
Doriți să vă distribuiți conținutul pe R-bloggeri? dați clic aici dacă aveți un blog, sau aici dacă nu aveți.
Încărcarea și explorarea unui set de date Tidy Tuesday
Una dintre rezoluțiile mele de Anul Nou a fost să devin mai puțin un pânditor și mai mult un făcător în comunitatea Tidy Tuesday. A existat un set de date pe care eram foarte interesat să-l explorez, bazat pe Democrație și Dictatura. Am încărcat setul de date și câteva pachete.
Cod în R
library(tidytuesdayR) library(tidyverse) library(countrycode) #this package looks up ISO codes, which can be useful library(ggflags) #pulls flags library(gganimate) #animations dat <- tidytuesdayR::tt_load(2024, week = 45) democracy <- dat$democracy_data head(democracy)
# A tibble: 6 × 43 country_name country_code year regime_category_index regime_category1 Afghanistan AFG 1950 5 Royal dictatorship 2 Afghanistan AFG 1951 5 Royal dictatorship 3 Afghanistan AFG 1952 5 Royal dictatorship 4 Afghanistan AFG 1953 5 Royal dictatorship 5 Afghanistan AFG 1954 5 Royal dictatorship 6 Afghanistan AFG 1955 5 Royal dictatorship # ℹ 38 more variables: is_monarchy , is_commonwealth , # monarch_name , monarch_accession_year , monarch_birthyear , # is_female_monarch , is_democracy , is_presidential , # president_name , president_accesion_year , # president_birthyear , is_interim_phase , # is_female_president , is_colony , colony_of , # colony_administrated_by , is_communist , …
Acest set de date arată, pentru fiecare an din 1950 până în 2000, clasificări pentru țări din întreaga lume. În spiritul zilei de 6 ianuarie, am ales să mă concentrez pe dacă țările au alegeri libere și corecte, prezentate aici ca has_free_and_fair_election
.
În interesul acestei explorări, nu mă interesează coloniile, care sunt arătate ca NA
în regime_category_index
.
Cod în R
democracy <- democracy |> ## removing colonies as much as possible to get down to countries filter(!is.na(regime_category_index), ## British Virgin Islands oddly keeps showing up in spite of status as colony country_code!="VGB")
Prima explorare – înțelegerea zonelor cu schimbări democratice
Prima mea înclinație în setul de date a fost să scot țările care au avut doar alegeri libere și corecte sau lipsa acestora, pentru a înțelege locurile care au avut progres democratic și retrocedare democratică. Acest lucru a necesitat configurarea unui filtru pentru această lucrare. tabyl
din pachetul de portar este bine configurat pentru asta, deoarece va veni rapid cu numărătoare încrucișate.
Cod în R
democracyfilter <- democracy |> janitor::tabyl(country_name,has_free_and_fair_election) |> filter(`TRUE` > 0 & `FALSE` > 0)
Acest lucru oferă un filtru frumos pentru această lucrare. Pentru a utiliza pachetul ggflags, trebuie ca țările să fie scrise în format iso2c. Din fericire, pachetul uimitor de coduri de țară va face asta pentru dvs. și, în plus, vă poate oferi și continentul, pentru explorări suplimentare.
Cod în R
democraticchanges <- democracy |> inner_join(democracyfilter) |> mutate(iso2=countrycode(country_name,"country.name","iso2c"), continent = countrycode(iso2, "iso2c", "continent")) |> arrange(continent,`FALSE`) |> mutate(country_name=fct_inorder(country_name))
Acum suntem gata să complotăm acest lucru cu ajutorul ggflags
pachet. Să ne uităm la Europa și Africa, două continente asociate cu progresul democratic și cu recul.
Există o mare problemă – ne-am dori ca aceasta să apară ca bare continue, ceea ce geomurile dvs. tipice nu vor face. Cu toate acestea, ne putem gândi la barele ca părți ale unui dreptunghi, care se extind de la începutul până la sfârșitul fiecărui an. Dacă luăm în considerare țările, putem apoi să le trasăm și să redenumim axa y la sfârșit.
Cod în R
## Let's create the y-labels for later on y_lab <- democraticchanges |> distinct(country_name,iso2,continent) |> mutate(y_mid = as.numeric(country_name), name=country_name) ## For Africa Africa <- democraticchanges |> filter(continent=="Africa") |> ggplot(aes(xmin=year, #left boundary of the rectangle xmax=year+1, #right boundary of the rectangle ymin=as.numeric(country_name)-.3, #lower boundary of the rectangle ymax=as.numeric(country_name)+.3, #upper boundary of the rectangle fill=has_free_and_fair_election)) + geom_rect() + # now let's plot flags between the rectangles and the y axis ggflags::geom_flag(data=y_lab |> filter(continent=="Africa"), mapping=aes(y=y_mid, country=tolower(iso2), #ggflags needs lowercase iso2 to work x=1945), inherit.aes=FALSE) + #we want this to be individual to this layer #now to rename the y axis scale_y_continuous(breaks=y_lab$y_mid,labels=y_lab$country_name) + theme_minimal() + theme(legend.position="bottom", legend.text=element_text(size=7), legend.title=element_text(size=7)) + labs(x="", y="", fill="Has Free and Fair Elections") + scale_fill_brewer(palette="Set1") + facet_wrap(~continent,ncol=1,scales="free",strip.position="right") Europe <- democraticchanges |> filter(continent=="Europe") |> ggplot(aes(xmin=year, xmax=year+1, ymin=as.numeric(country_name)-.3, ymax=as.numeric(country_name)+.3, fill=has_free_and_fair_election)) + geom_rect() + ggflags::geom_flag(data=y_lab |> filter(continent=="Europe"), mapping=aes(y=y_mid,country=tolower(iso2),x=1945),inherit.aes=FALSE) + scale_y_continuous(breaks=y_lab$y_mid,labels=y_lab$country_name) + theme_minimal() + theme(legend.position="bottom", legend.text=element_text(size=7), legend.title=element_text(size=7)) + labs(x="", y="", fill="Has Free and Fair Elections") + scale_fill_brewer(palette="Set1") + facet_wrap(~continent,ncol=1,scales="free",strip.position="right") ## Let's take advantage of patchwork to plot these graphs next to each other with a common legend library(patchwork) Europe + Africa + plot_layout(guides="collect") & theme(legend.position = 'bottom')
Acesta este distractiv! Să facem o hartă și să o animam.
gganimation pentru o hartă pentru a arăta progresul/revenirea
Se poate observa dintr-o privire că, în Europa, pare să existe o progresie democratică. În mod similar, în Africa, există o progresie, dar există și o retragere. De asemenea, ar fi foarte util să vedeți asta ca o hartă – în plus, ar fi foarte interesant de văzut ca o hartă animată.
rnaturalearth
este un pachet care vă permite să descărcați cu ușurință chenarele hărții. Patrice Ferlet păstrează un set de date al centroidului pentru țările pe care putem reprezenta și steagurile.
Cod în R
library(rnaturalearth) world <- ne_countries(type="countries",returnclass="sf") coord <- read_csv("https://gist.github.com/metal3d/5b925077e66194551df949de64e910f6/raw/c5f20a037409d96958553e2eb6b8251265c6fd63/country-coord.csv") |> mutate(`Alpha-2 code`=replace_na(`Alpha-2 code`,"NA")) |> rename(code=`Alpha-2 code`, lat=`Latitude (average)`, lon=`Longitude (average)`)
Acum să luăm setul de date despre democrație de mai devreme și left_join
setul de date la setul de date lat/long, precum și setul de date mondial
Cod în R
democracymap <- democracy |> mutate(iso2=countrycode(country_name,"country.name","iso2c"), continent = countrycode(iso2, "iso2c", "continent")) |> select(country_name,year,has_free_and_fair_election,iso2,continent) |> left_join(coord |> select(code,lat,lon),by=c("iso2"="code")) democracymap <- democracymap |> select(country_name,year,has_free_and_fair_election,iso2,lat,lon) |> left_join(world, by=c("iso2"="iso_a2_eh")) |> filter(!is.na(geometry)) |> mutate(year=as.integer(year)) #this is necessary for the animation to progress frame by frame
Construim acest strat cu strat. Vrem o hartă de bază a limitelor actuale, astfel încât să putem lua setul de date actual și să aducem date în valoare de un an.
Cod în R
map <- democracymap |> filter(year==2020, !is.na(geometry)) |> select(-year) map |> ggplot() + geom_sf(aes(geometry=geometry))
Apoi putem stratifica această hartă cu ușurință. Observați că semnele de latitudine și longitudine nu sunt tipice pentru o hartă – pachetul excelent metR include teme și scale utile pentru datele meteorologice, care se aplică și hărților!
Cod în R
democracymap2 <- democracymap |> filter(has_free_and_fair_election==TRUE) library(metR) map |> ggplot() + geom_sf(mapping=aes(geometry=geometry),fill="white",color="black") + geom_sf(data=democracymap2, mapping=aes(geometry=geometry),color=NA,fill="blue", show.legend=FALSE)+ scale_x_longitude() + scale_y_latitude() + facet_wrap(~year) + theme_bw() + theme(axis.text=element_blank(), axis.ticks=element_blank(), strip.text=element_text(size=8, margin = margin(0,0,0,0, "cm")))
Această hartă este puțin copleșitoare, să folosim gganimate
și se concentrează pe Europa și Africa. Comentarii de mai jos pentru a trece prin cel european. Pentru că este greu de redat, l-am salvat local și apoi l-am încărcat pe site. Ura!
Cod în R
#Europe #First a base layer Europe2 <- map |> filter(continent=="Europe") |> ggplot() + # note that fill is the inside and color is the border in geom_sf geom_sf(mapping=aes(geometry=geometry),fill="white",color="black") + #Then the democracy data geom_sf(data=democracymap2 |> filter(continent=="Europe"), mapping=aes(geometry=geometry), color="black", show.legend=FALSE) + ggflags::geom_flag(data=democracymap2 |> filter(continent=="Europe", has_free_and_fair_election==TRUE), mapping=aes(y=lat,x=lon,country=tolower(iso2)), inherit.aes=FALSE) + # gganimate allows you to use {closest_state} to fill in the transition label labs(title="Year: {closest_state}") + #metR scales scale_x_longitude() + scale_y_latitude() + #gganimate transitions for the gif transition_states(year) + theme_bw() + coord_sf(xlim=c(-20,40), ylim=c(30,70), default_crs=sf::st_crs(4326)) #anim_save(filename="img/Europe.gif",animation=Europe2)
Cod în R
#Africa Africa2 <- map |> filter(continent=="Africa") |> ggplot() + geom_sf(mapping=aes(geometry=geometry),fill="white",color="black") + geom_sf(data=democracymap2 |> filter(continent=="Africa"), mapping=aes(geometry=geometry),color="black", show.legend=FALSE) + scale_x_longitude() + scale_y_latitude() + ggflags::geom_flag(data=democracymap2 |> filter(continent=="Africa", has_free_and_fair_election==TRUE), mapping=aes(y=lat,x=lon, country=tolower(iso2)), inherit.aes=FALSE) + labs(title="Year: {closest_state}") + theme_bw() + transition_states(year) + coord_sf(default_crs=sf::st_crs(4326)) #anim_save(filename="img/Africa.gif",animation=Africa2)