xlMuRlx / APPR-2017-18

Repozitorij z gradivi za predmet Analiza podatkov s programom R v študijskem letu 2017/18
MIT License
0 stars 0 forks source link

Vizualizacija #2

Open xlMuRlx opened 6 years ago

xlMuRlx commented 6 years ago

Pri vizualizaciji me zanima, kako bi lahko preuredil urejenost držav na x-osi. Ko R bere podatke iz tabel, namreč vedno države na abscisi ureja po abecednem vrstnem redu, namesto da bi bile urejene enako kot v tabeli, kar bi bilo bolje za branje iz samih grafov, saj bi nam navrglo več informacij.

Poleg tega bi mi prišel prav kakšen nasvet pri uporabi zemljevida, natančneje me zanima kako bi lahko podatke iz tabele sesta prikazal na uvoženem zemljevidu sveta.

xlMuRlx commented 6 years ago

Nasveta za uporabo zemljevida ne potrebujem več, saj sem sam razrešil težavo. Kljub temu pa me še vedno zanima, če obstaja kakšen način za preurejanje držav na abscisi.

Naletel sem tudi na problem, da uvožen zemljevid ne razdeli Združenega Kraljestva na 4 različne države, kar pa bi zaradi svojih podatkov potreboval. Zaradi tega sem moral "zavreči" podatke o treh državah (Wales, Severna Irska in Škotska) pri risanju zemljevidov, vendar me zanima če obstaja kakšna elegantejša rešitev.

jaanos commented 6 years ago

Za preurejanje lahko uporabiš funkcijo reorder, ki ji poleg imen podaš še vektor, po katerem urejaš:

graf.zmage <- ggplot(prva, aes(x = reorder(ekipa, -stevilo), y = stevilo)) + geom_col() +
  xlab("Država") + ylab("Število") + ggtitle("Število zmag 20 ekip z največ zmagami") +
  theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust = 1))

Kot vidiš, lahko namesto geom_bar s parametrom stat = "identity" uporabiš tudi geom_col. S theme lahko oblikuješ posamezne elemente grafa - v tem primeru se oznake na osi x zarotirajo za 90 stopinj (in ustrezno poravnajo).

Za zemljevid pa svetujem, da uporabiš drugega, ki vsebuje tudi razdelitev Velike Britanije:

zemljevid <- uvozi.zemljevid("http://www.naturalearthdata.com/http//www.naturalearthdata.com/download/110m/cultural/ne_110m_admin_0_map_units.zip",
                             "ne_110m_admin_0_map_units", encoding = "UTF-8") %>%
  pretvori.zemljevid()

Za identifikacijo držav potem uporabi stolpec NAME_LONG.

xlMuRlx commented 6 years ago

Vaši napotki so mi prišli zelo prav. Kljub temu pa imam še 2 vprašanji. Kot prvo me zanima, kako bi lahko s funkcijo reorder države v grafu graf.goli razporedil enako kot so razporejene v graf.uvrstitve. Poleg tega pa me zanima tudi, kako bi na zemljevid lahko dodal imena obarvanih držav (pri grafu graf.prvaki).

jaanos commented 6 years ago

Če želiš urejati po istem kriteriju, ga bo treba pridružiti v prikazane podatke, npr.

graf.goli <- ggplot(inner_join(peta, sedma), aes(x = reorder(ekipa, povp_uvrstitev), y = stevilo)) + 
  geom_col(color = 'black', fill = 'blue')

Tukaj inner_join (ker ni drugače povedano) združuje po stolpcu z istim imenom, torej ekipa.

Besedilo lahko na graf dodajaš z geom_text in parametrom label pri aes, npr.

graf.prvaki + geom_text(data = inner_join(zemljevid, sesta, by = c("NAME_LONG" = "ekipa")) %>%
                          group_by(NAME_LONG) %>% summarise(long = mean(long), lat = mean(lat)),
                        aes(x = long, y = lat, label = NAME_LONG),
                        color = "red", size = 2)

Pozicije oznak so tukaj izračunane kot povprečja koordinat točk, ki določajo posamezne države.

Vendar pa zna biti tak graf hitro neberljiv (najbrž tudi izbira barve besedila ni najbolj posrečena). Glede na to, da so vse zmagovalke iz Evrope ali Južne Amerike, bi bilo smiselno narisati samo ti dve celini, npr.

graf.prvaki <- ggplot(data = zemljevid %>% filter(CONTINENT %in% c("Europe", "South America"),
                                                  NAME_LONG != "Russia") %>%
                        left_join(sesta, by = c("NAME_LONG" = "ekipa"))) + 
  geom_polygon(aes(x = long, y = lat, group = group, fill = st_naslovov), color = "black") +
  geom_text(data = inner_join(zemljevid, sesta, by = c("NAME_LONG" = "ekipa")) %>%
              group_by(NAME_LONG, CONTINENT) %>%
              summarise(avg_long = mean(long), avg_lat = mean(lat)),
            aes(x = avg_long, y = avg_lat, label = NAME_LONG), color = "red") +
  facet_wrap(~ reorder(CONTINENT, -as.numeric(CONTINENT)), scales = "free") +
  ggtitle("Vse zmagovalke svetovnih prvenstev") + xlab("") + ylab("") +
  guides(fill = guide_colorbar(title = "Število naslovov"))

Funkcija facet_wrap nariše več grafov glede na podani pogoj (tukaj se reorder uporabi, da se Južna Amerika prikaže pred Evropo, pri čemer izkoristimo dejstvo, da je stolpec CONTINENT faktor in ga lahko pretvorimo v število). Podatki morajo potem biti skupni, zato so podani že pri ggplot - pri geom_text so še vedno podani svoji podatki, saj ne želimo besedila izpisovati za vsako točko na zemljevidu. Pri geom_polygon sem dodal še color = "black", da se vidijo meje držav.