Folosind gganimate și ggflags pentru a privi progresul democratic

URMĂREȘTE-NE
16,065FaniÎmi place
1,142CititoriConectați-vă

(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_category   
                                                 
1 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))

Harta lumii

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")))

O fațetă a lumii

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)

Alegeri libere și corecte în Europa
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)

Alegeri libere și corecte în Africa
Dominic Botezariu
Dominic Botezariuhttps://www.noobz.ro/
Creator de site și redactor-șef.

Cele mai noi știri

Pe același subiect

LĂSAȚI UN MESAJ

Vă rugăm să introduceți comentariul dvs.!
Introduceți aici numele dvs.