evawinkler / APPR-2019-20

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

Grafi- vizualizacija #3

Open evawinkler opened 4 years ago

evawinkler commented 4 years ago

Pozdravljeni, zanima me, ali obstaja kakšna funkcija, ki bi dva grafa združila v enega ( za primerjavo podatkov)? Poleg tega me zanima, ali morajo biti vsi podatki oz. tabele predstavljene s grafom ali zemljevidom v poročilu oz. ali lahko samo nekatere ugotovitve iz podatkov opišem brez prikaza? Hvala za pomoč!

timotejvesel commented 4 years ago

Mislim, da takšna splošna funkcija ne obstaja. Kjer je to smiselno, lahko dva grafa sama združiš v enega. Grafa g1 in g2 bi lahko na primer združila tako

g <- ggplot() + geom_line(data = vsota.zasedena, aes(x=leto, y=vsota, color="zasedena")) + 
  geom_line(data = vsota.prosta, aes(x=leto, y=vsota, color="prosta")) + 
  scale_colour_manual(name = "", values=c(zasedena="blue", prosta="red"))

\ V poročilu naj bodo predstavljene le informacije ter rezultati, ki so pomembni. Menim, da lahko kakšen rezultat opišeš tudi brez grafičnega prikaza, vendar se mi zdi, da so v večini primerov rezultati bolj pregledni oziroma razumljivi, če jih še vizualiziramo. Mogoče lahko na zadnje vprašanje bolje odgovori @jaanos, da ne bom slučajno širil kakšnih napačnih informacij.

jaanos commented 4 years ago

Če imaš podatke na isti lestvici (da jih je torej sploh smiselno prikazovati na istem grafu), potem naj bodo tudi v istem stolpcu v razpredelnici. Tako bi bilo smiselno razpredelnico mesta pretvoriti v tako obliko, npr.

mesta <- full_join(prosta.mesta, zasedena.mesta) %>%
  gather(key=tip, value=stevilo, prosta, zasedena)

Potem lahko narišeš graf, pri katerem podatke barvaš glede na tip (prosta/zasedena mesta):

library(scales)
g <- ggplot(mesta %>% group_by(leto, tip) %>% summarise(vsota=sum(stevilo, na.rm=TRUE)),
            aes(x=leto, y=vsota, color=tip)) + geom_line() +
  scale_x_continuous(breaks=seq(2008, 2018, 2)) +
  scale_y_continuous(labels=comma_format(big.mark=""))

S funkcijo scale_x_continuous se tukaj poskrbi za lestvico na osi x (pri teh podatkih se sicer oznake izrišejo na 1.5 leta, kar ne izgleda najlepše), funkcija comma_format (iz knjižnice scales) pri scale_y_continuous pa poskrbi za lep izpis oznak na osi y - privzeto se namreč pri velikih številih uporablja eksponentna notacija (npr. 2e+05 za 200000), parameter big.mark pa določa ločilo tisočic (privzeto je to vejica).

Vendar pa so v tem primeru podatki enega in drugega tipa kar precej različnih velikosti, tako da se gibanje števila prostih mest na zgornjem grafu ne vidi lepo. Zato bo morda bolje narisati en graf pod drugim - tako je lahko os x (leta) enaka pri obeh, os y (vsota) pa je potem pri vsakem grafu drugačna. Več grafov se lahko nariše s pomočjo funkcije facet_grid, ki kot prvi argument sprejme izraz oblike stolpec1 ~ stolpec2, pri čemer grafi v posameznih vrsticah ustrezajo različnim vrednosti v stolpec1, grafi v posameznih stolpcih pa različnim vrednostim v stolpec2 (če želiš samo eno vrstico ali stolpec, se na ustrezno mesto postavi pika). Načeloma so vsi grafi istega tipa, a je mogoče z nastavitvijo parametra data pri funkcijah geom_* risati tudi različne tipe grafov, npr.

# Podatke pripravimo vnaprej za kasnejše filtriranje
mesta.vsote <- mesta %>% group_by(leto, tip) %>%
  summarise(vsota=sum(stevilo, na.rm=TRUE))
g <- ggplot() + aes(x=leto, y=vsota, color=tip) + facet_grid(tip ~ ., scales="free_y") +
  geom_line(data=mesta.vsote %>% filter(tip == "zasedena")) +
  geom_point(data=mesta.vsote %>% filter(tip == "prosta")) + 
  scale_x_continuous(breaks=seq(2008, 2018, 2)) +
  scale_y_continuous(labels=comma_format(big.mark="")) +
  guides(color=FALSE)

Ker je pri aes podan parameter color=tip, je poskrbljeno za barvanje grafov (sicer pa je mogoče barve podati tudi posebej, kot si imela do sedaj), izriše pa se tudi legenda - tukaj je ne potrebujemo, zato jo skrijemo z guides(color=FALSE) (konkretno, skrije se legenda za barvo črte/pik).

Kar se tiče predstavitve rezultatov, se strinjam s @timotejvesel. Predstavitev samo v besedilu bi bila smiselna npr. v primeru, ko imamo eno samo število in tako ni ravno smiselno izrisovati grafa.