anamavsenik / 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

shiny #4

Closed anamavsenik closed 6 years ago

anamavsenik commented 6 years ago

Pozdravljeni!

Imam dve težavi. Zanima me, na kakšen način bi lahko naredila kot imam pri zadnjem grafu v poročilu, da bi bilo tudi pri orodju shiny takšen graf. Torej na x osi bi bila leta, na y plače, velikost balončka bi bili izdatki, uporabnik pa bi si sam izbral državo za katero želi sledeč prikaz. Prav tako sem poskusila v datoteki Ui napisati funkcijo, ki bi pretvarjala zemljevid glede na izbrano leto, a imam težave pri povezovanju drsnika s samo tabelo, torej od kod naj bere podatke za prikaz.

Hvala in lep pozdrav, Ana Marija Kravanja

jaanos commented 6 years ago

Najprej predlagam, da pri uvozu razpredelnic minimalne_place_v_evropi in izdatki_za_potovanja poskrbiš, da je leto številska spremenljivka - pri mutate, kjer to poskrbiš za plače oziroma izdatke, torej dodaj še parameter leto = parse_number(leto). Če želiš potem v grafu EUminimum ohraniti diskretno barvno lestvico za leta, pri aes uporabi parameter color = factor(leto). Naslov legende za leto lahko potem popraviš tako, da grafu prišteješ npr. guides(color = guide_legend("Leto")).

Svetujem, da Shiny aplikacijo organiziraš kot v vzorcu - v ui.R naj bo samo uporabniški vmesnik, v server.R pa naj poteka dejansko izrisovanje grafov glede na vhod iz uporabniškega vmesnika. Potrebne podatke si pripravi že v preostalih programih. Tako bo najbolje, če že v uvoz.r narediš

povpr.place.stat.reg. <- separate(povpr.place.stat.reg., starost,
                                  into = c("regija", "starost"), sep=",")

Potem v vizualizacija.r pripraviš podatke za izris v poročilu:

povpr.place.stat.reg.n <- povpr.place.stat.reg.%>%
  filter(spol == "Spol - SKUPAJ", starost == "Starost - SKUPAJ", regija != "SLOVENIJA") %>%
  group_by(regija) %>% summarise(povprecje = mean(povpr.placa))

Tako ne prepišeš razpredelnice povpr.place.stat.reg., ki jo boš potrebovala v Shinyju. V poročilu potem seveda popravi, da izrisuješ iz povpr.place.stat.reg.n.

Da prikažeš tako graf kot zemljevid (vsakega v svojem zavihku), naj bo v ui.R npr.

library(shiny)

shinyUI(fluidPage(
  tabsetPanel(
    tabPanel("Minimalne plače in izdatki za potovanja",
      sidebarPanel(
        selectInput("drzava",
                    label = "Izberite državo",
                    choices = sort(unique(primerjava_tabel$DRZAVA)),
                    selected = "Slovenia")
      ),
      mainPanel(plotOutput("graf.min"))
    ),
    tabPanel("Povprečne plače po regijah",
      titlePanel("Povprečne plače po regijah v letih 2008-2016"),
      sidebarPanel(
        selectInput("leto",
                    label = "Izberite leto",
                    choices = 2008:2016,
                    selected = 2016)
      ),
      mainPanel(plotOutput("zemljevid"))
    )
  )
))

Tukaj torej samo določiš vhodne elemente (z imenoma drzava in leto) ter izhodne elemente (z imenoma graf.min in zemljevid), ki se bodo izrisali v server.R:

library(shiny)

shinyServer(function(input, output) {
  output$graf.min <- renderPlot({
    ggplot(primerjava_tabel %>% filter(DRZAVA == input$drzava)) +
      aes(x = leto, y = place, size = izdatki) + geom_point() +
      ggtitle("Minimalne plače in izdatki za potovanja")
  })

  output$zemljevid <- renderPlot({
    ggplot() + geom_polygon(data = povpr.place.stat.reg. %>% filter(spol == "Spol - SKUPAJ",
                                                                    starost == "Starost - SKUPAJ",
                                                                    regija != "SLOVENIJA",
                                                                    leto == input$leto) %>%
                              right_join(zemljevid, by = c("regija" = "IME")),
                            aes(x = long, y = lat, group = group, fill = povpr.placa))
  })
})

Vrednosti vhodnih elementov torej dobiš kot polja v objektu input, izhodne elemente pa z ustreznimi funkcijami render* podaš kot polja objekta output.

Potem lahko aplikacijo Shiny vključiš v poročilo kot

```{r shiny, echo = FALSE}
shinyAppDir("shiny", options=list(width="100%", height=500))
```

V glavi poročila potem tudi odkomentiraj vrstico runtime: shiny - če tega ne storiš, bo ob prevajanju ugotovilo, da imaš Shiny, in te vprašalo, ali ga želiš pognati kot Shiny - če odgovoriš Yes, Always, bo to vrstico samo dodalo.

anamavsenik commented 6 years ago

Ali je v redu da mi pri vizualizaciji in pri shiny, ko riše zemljevid vedno javi napako: Warning: Column regija/IME joining character vector and factor, coercing into character vector ?

jaanos commented 6 years ago

To je samo opozorilo, ker imaš v zemljevidu za imena faktor, v podatkih pa imaš imena regij v znakovnem stolpcu. Če vse deluje pravilno in dovolj hitro, potem lahko tako opozorilo ignoriraš. Če se ti pa zdi, da je izrisovanje prepočasno, lahko poskrbiš, da imaš tudi v podatkih faktor z istimi vrednostmi kot v zemljevidu (v ta namen lahko uporabiš funkcijo parse_factor - potem se imena notranje shranijo kot številke in je zato primerjava imen hitrejša).

anamavsenik commented 6 years ago

Projekt sem dokončala, zanima me, če bi svetovali še kakšne popravke. Sicer pa je pripravljen za oddajo.

Lp, Ana Marija Kravanja

jaanos commented 6 years ago

V redu, bom dodal povezavo na repozitorij za zagovore, tako da se lahko z @alenFMF domeniš za termin zagovora. Če boš še kaj spreminjala, mi prosim javi, da posodobim povezavo.

Predlagal bi samo dva lepotna popravka:

anamavsenik commented 6 years ago

Najlepša hvala. Sem že spremenila.

jaanos commented 6 years ago

V redu, sem dodal povezavo na zadnji commit.