BraMira / Mirjam-Spela

Projekt pri predmetu OPB 2015/2016
0 stars 4 forks source link

Zemljevid #10

Closed BraMira closed 8 years ago

BraMira commented 8 years ago

Pozdravljeni, imam par vprašanj v zvezi z zemeljvidom.

Najprej me zanima, če se da obliko zemljevida mogoče spremeniti? Namreč ni mi preveč všeč,da je prikazan tako raztegnjeno.

In pa kako bi se dalo narediti, da ko greš z miško čez določeno državo, da bi pisalo poleg ime države in št. napadov v tej državi, če se to sploh, da narediti.

jaanos commented 8 years ago

Obliko zemljevida lahko fiksiraš tako, da mu prišteješ npr. theme(aspect.ratio = 1/2). Ta vrednost bo v redu za prikaz celega sveta; za posamezne celine dobiš ustrezno vrednost tako, da deliš višino prikazanega dela z višino. Svetujem, da raje kot da imaš en if stavek za vsako celino, zbereš meje v razpredelnici, kjer vsaki celini ustreza ena vrstica, potem pa po potrebi meje in razmerje izračunaš iz ustrezne vrstice, npr.

    lim <- data.frame(xmin = c(-25, 20, -20, -20, 80, -20),
                      xmax = c(60, 200, 59, -170, 190, -120),
                      ymin = c(-40, -10, 35, 10, -50, -70),
                      ymax = c(37, 80, 71, 80, 10, 20))
    if (!is.null(input$kontinent) && input$kontinent!=0){
      ln <- lim[input$kontinent,]
      g <- g + coord_cartesian(xlim=c(ln[,"xmin"],ln[,"xmax"]),
                               ylim=c(ln[,"ymin"],ln[,"ymax"])) +
        theme(aspect.ratio=(ln[,"ymax"]-ln[,"ymin"])/(ln[,"xmax"]-ln[,"xmin"]))
    }
    g

Kar se tiče interaktivnih zemljevidov, z ggplot2 najbrž ne bo šlo, lahko pa si pogledata knjižnico Leaflet, ki to omogoča.

BraMira commented 8 years ago

Hvala za pomoč.

Glede interaktivnega zemljevida, predvidevam, da bi bil začetek v server.R (ob tem da ignoriram prejšnji zemljevid) nekak tak:

  output$map <- renderLeaflet({
    nap3 <- ttt4 %>% select(attack,country,continent_id,start_date,end_date)
    HH <- nap3 %>% group_by(attack,region=country) %>% summarise() %>% 
      group_by(region) %>% summarise(stevilo=count(attack))%>%data.frame
    if (!is.null(input$datum)) {
      HH <- nap3 %>% filter(start_date >= input$datum[1],
                            end_date <= input$datum[2])%>% group_by(attack,region=country) %>% summarise() %>% 
        group_by(region) %>% summarise(stevilo=count(attack))%>%data.frame
    }
    zem <- map("world",regions=HH$region,fill=TRUE)
    leaflet(data=zem)%>% addTiles() %>% addPolygons(fillColor = "yellow",stroke=FALSE)
  })

Verjetno tu ni smiselno gledati posebej za kontinente.

Ne vem pa kako naredim barve, da izražajo intenziteto napadov in pa rada bi, da je možnost klika na državo, in se potem izpiše št. napadov (pozneje mogoče tudi gl.mesto, št. prebivalcev)

BraMira commented 8 years ago

Pa se opravičujem za grdo kodo, ne vem zakaj mi je ni lepo izpisalo.

jaanos commented 8 years ago

Lahko narediš nekaj takega:

library(gsubfn)

  output$map <- renderLeaflet({
    HH <- ttt4 %>% select(attack,country,continent_id,start_date,end_date)
    if (!is.null(input$datum)) {
      HH <- HH %>% filter(start_date >= input$datum[1],
                            end_date <= input$datum[2])
    }
    HH <- HH %>% group_by(attack,region=country) %>% summarise() %>%
      group_by(region) %>% summarise(stevilo=count(attack))%>%data.frame
    HH$region[HH$region=="United States"]<- "USA"
    HH$region[HH$region=="United Kingdom"]<- "UK"
    nap <- setNames(HH$stevilo, HH$region) # spravimo število napadov v poimenovan vektor
    zem <- map("world",regions=HH$region,fill=TRUE, plot=FALSE) # plot=FALSE poskrbi, da se zemljevid ne izriše še v RStudiu
    imena <- zem$names %>% strapplyc("^([^:]+)") %>% unlist() # nekatere države so v več delih; ime države je do prvega dvopičja
    napadi <- nap[imena] # pripravimo število napadov za vsako narisano ozemlje
    popup <- paste0("<b>", imena, "</b><br />Število napadov: ", napadi) # pripravimo vsebino pojavnega okenca
    barve <- rgb(napadi, napadi, 0, maxColorValue = max(nap)) # pripravimo barve
    leaflet(data=zem)%>% addTiles() %>%
      addPolygons(fillColor = barve,stroke=FALSE, popup = popup)
  })

Seveda lahko uporabiš tudi kakšno drugo barvno lestvico, npr. kaj iz knjižnice RColorBrewer.

BraMira commented 8 years ago

Hvala za pomoč.

Kako dobim druge barvne lestvice? Rada bi uporabila npr. barve <- brewer.pal(n=9,name="YlOrRd"), vendar se države z istim št. napadov ne pobarvajo isto (probala sem še barve <- brewer.pal(n=9,name="YlOrRd")[c(napadi)]).

Pa še eno malenkost sem opazila in sicer, ko v aplikaciji hočem spremeniti interval datuma za katerega se zemljevid izriše, se nič ne zgodi.

jaanos commented 8 years ago

Če hočeš "linearno" lestvico, lahko narediš tako:

barve <- brewer.pal(n=9,name="YlOrRd")[8*napadi/max(nap)+1]

Glede na to, da pa razporeditev napadov ni ravno linearna, lahko poskusiš z bolj enakomerno razporeditvijo barv:

df <- ecdf(nap)
barve <- brewer.pal(n=9,name="YlOrRd")[8*df(napadi)+1]

Kar se datuma tiče, je problem ta, da imaš v aplikaciji dve vnosni polji z imenom datum. Če enega spremeniš, bo delovalo.

BraMira commented 8 years ago

Najlepša hvala, sedaj vse deluje.

Še eno vprašanje, in sicer pri prvi aplikaciji(seznam napadov), če izbereš preveč "pogojev", javi "napako", da object start_date ne obstaja, saj ni bilo nobenih napadov s temi pogoji. Radi bi da se v tem primeru prikaže sporočilo, da naj uporabnik izbere drug datum. Probala sem nekaj takega, vendar ne vem kam točno moram to vstaviti (če je sploh pravilno):

validate(need(!is.null(input$datum[1])),"Select another date")
jaanos commented 8 years ago

Problem je v tem, da se prazen rezultat pretvori v tabelo brez stolpcev - če potem na tej delaš select, bo prišlo do napake. Vse operacije je torej potrebno opraviti pred pretvorbo v razpredelnico.

Vseeno bo koristno uporabiti validate, da se izpiše sporočilo v primeru, ko ni rezultatov:

    nap1 <- nap1 %>% select(Start=start_date, End=end_date, Location=place, Country=country,Continent=name.y,
                  Type= type, "Max. deaths"=max_deaths, "Confirmed victims"=confirmed, Injured=injured, "Dead perpetrators"=dead_perpetrators, Perpetrator=perpetrator, "Part of"=part_of,
                  "Population of country"=population, "Area (mi2)"=area,  "Main religion"=name, "Followers"=followers.x, "Proportion (%)"=proportion.x
                  ) %>% data.frame()
    validate(need(nrow(nap1) > 0, "No attacks match the criteria."))
    nap1
BraMira commented 8 years ago

Sedaj mislim da vse dela. A lahko probate, če vam tudi, sicer je to zadnja verzija za predstavitev v četrtek.

jaanos commented 8 years ago

Tudi meni vse lepo deluje.

BraMira commented 8 years ago

A moram to jaz kje objaviti za jutrišnjo predstavitev ali to naredite vi? Laptopa namreč ne bove imele s sabo.

jaanos commented 8 years ago

Ni treba - aplikacija pri meni deluje, tako da je to to.