spelapovrzenic / APPR-2014-15

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

zemljevid #7

Closed spelapovrzenic closed 9 years ago

spelapovrzenic commented 9 years ago

Živjo, imam par vprašanj. namreč v 2.zemljevidu o evropskih državah. 1.)graf se mi lepo izriše, rada pa bi obarvala tiste države ki imajo v podatku NA, z npr belo, kako se to naredi? 2.)rada bi dodala tudi imena držav, sem že poizkušala, vendar nastane problem, saj mi pokaže imena držav celega sveta, saj sem zemljevid vzeli iz celotnega sveta. Kako bi torej iz teh imen izluščila samo evropske in jih nato tudi dala v zemljevid? 3.)(nevem če smo že delali na vajah) rada bi dodala nekakšno legendo barv, da bi bilo razvidno katera barva prikazuje najmanjšo vrednost, katera največjo, pač da se barve prelivajo, vendar bi rabila pomoč.

najlepša hvala za vse vaše odgovore in prijaznost

jaanos commented 9 years ago

Trenutno dobiš barve kot elemente vektorja - kjer je podatek NA, bo tak tudi indeks in posledično barva, kar pomeni, da je ne nariše, oziroma pusti barvo ozadja. Če bi želela manjkajoče podatke postaviti na belo, bi lahko storila

barve[is.na(eeuro[, 6])] <- "white"

Imena držav lahko črpaš iz zemljevida, ki ga rišeš (torej EU), ali pa iz podatkov (eeuro). Izkaže se, da nekaterih držav v zemljevidu ni - od tvojih npr. manjkata Malta in Liechtenstein (ker gre za grob zemljevid, očitno manjkajo majhne države - po želji ga lahko nadomestiš z nekoliko natančnejšim). Poleg tega so v stolpcu name nekatera imena pokrajšana - polna imena (kot v razpredelnici euro) imaš v stolpcu name_long. Tako bi lahko preurejanje nekoliko poenostavili:

manjkajoce.drzave <- c("Albania", "Belarus", "Kosovo", "Moldova", "Russian Federation", "Ukraine")
drzave <- c(rownames(euro), manjkajoce.drzave)
drzave <- drzave[drzave %in% svet$name_long]
EU <- svet[svet$name_long %in% drzave,]

# Preuredimo podatke, da jih bomo lahko izrisali na zemljevid.
manjkajo <- ! manjkajoce.drzave %in% rownames(euro)
M <- as.data.frame(matrix(nrow=sum(manjkajo), ncol=length(euro)))
names(M) <- names(euro)
row.names(M) <- manjkajoce.drzave[manjkajo]
eeuro <- rbind(euro, M)[as.character(EU$name_long),]

Nekatere države sem še dodal, da ne bo lukenj na zemljevidu. Imena potem dobimo npr. iz rownames(eeuro), ali pa EU$name (če želimo nekoliko okrajšati ime). Lahko se omejiš na izbor imen, ki jih želiš izpisati. Nekatera imena ne bodo najbolje postavljena, tako da jih lahko ročno prestavimo; lahko seveda tudi spremenimo (npr. skrajšamo) imena:

izbor <- !is.na(eeuro[,6])
koordinate <- coordinates(EU[izbor,])
imena <- as.character(EU$name[izbor])
rownames(koordinate) <- imena
names(imena) <- imena
koordinate["Norway",1] <- koordinate["Norway",1] - 2
koordinate["Cyprus",2] <- koordinate["Cyprus",2] - 1
imena["United Kingdom"] <- "United\nKingdom"

Sedaj bi lahko imena napisala na obstoječ zemljevid s

text(koordinate, imena)

Seveda lahko tudi za druge parametre (npr. velikost pisave) na podoben način kot zgoraj delaš posebne primere (začneš seveda z vektorjem, ki ima same privzete vrednosti, pa ga po potrebi popravljaš).

Kar se legende tiče, imaš dve možnosti. Ena je ta, da jo sama narišeš (lahko si pomagaš npr. z rect), druga pa ta, da uporabiš spplot. Žal se pri tej možnosti dorisovanje nekoliko zakomplicira, saj je potrebno vse postoriti znotraj ukaza - tako bo treba poskrbeti za imena držav, pa tudi države z manjkajočimi podatki, saj spplot ne podamo vektorja barv za vsako državo, pač pa iz vrednosti prikazane spremenljivke poračuna barvo:

# Narišimo zemljevid v PDF.
cat("Rišem zemljevid...\n")
pdf("slike/europa.pdf")

EU$voda2005 <- eeuro[,6]
print(spplot(EU, "voda2005", xlim=c(-25, 40), ylim=c(33, 73),
             main = "Preskrba z vodo v Evropi (leto 2005)",
             col.regions = topo.colors(100),
             sp.layout = list(
               list("sp.polygons", EU[is.na(eeuro[,6]),], fill = "white"),
               list("sp.text", koordinate, imena, cex = 0.3)),
             par.settings = list(panel.background=list(col="lightyellow"))))

dev.off()

Pri pdf raje ne podaj velikosti papirja, saj lahko potem zemljevid prikazuje večje območje, kot si želiš (graf lahko popačimo, zemljevida pa seveda nočemo). Dorisani elementi so podani z sp.layout - temu damo seznam seznamov, katerih prvi element je ime klicane funkcije, sledijo pa njeni parametri. Izkaže se namreč, da sp.polygons in sp.text rišeta na napačno mesto, če ju pokličemo naknadno.

Mimogrede, na koncu risanja prvega zemljevida ti manjka dev.off(). Ukaza source("lib/uvozi.zemljevid.r") za tem ne rabiš izvesti še enkrat, saj je bila potrebna funkcija že definirana.

Še to: opažam, da si na GitHub naložila nekatere datoteke iz zemljevidov, ki tja sicer ne sodijo, ampak niso bile navedene v .gitignore in jih je tako git ponudil za commitanje. Svetujem, da pobrišeš mapo zemljevid/europa (znotaj katere se nahajajo vse problematične datoteke) in narediš commit (pri čemer obkljukaš vse sedaj pobrisane datoteke). Potem sledi navodilom na spletni učilnici za sinhronizacijo z vzorčnim repozitorijem - tja sem naložil novo verzijo datoteke .gitignore; poleg tega sem dodal še program clearpdf.r, ki poskrbi za to, da se delovno okolje in PDF-ji počistijo (tako lahko potem preizkusiš, če ti program res deluje, ko ga poženeš).

spelapovrzenic commented 9 years ago

Najlepša hvala za vse odgovore!

Imam pa še zadnji dve uprašanji: 1.)sedaj sem spremenila tudi prvi zemljevid o povprečni porabi vode v sloveniji; vendar še vedno ne vem kako bi sama dopisala legendo, da bi bilo vidno katera barva pomeni največ katera najmanj; kot ste mi že svetovali z rect , vendar mi nikoli ne vrže pravilno legendo.

2.) odločila sem se da uporabim spplote tudi za 3 različna leta, da bom lahko primerjala ali količina porabe narašča/pada v posameznih regijah. Grafe sem zrisala, sedaj pa imam spet težavo, kako bi napisala imena regij na zemljevid; poskušala sem tako kot ste mi že vi pokazali, da v spplotu z sp.layout, vendar imam problem kako dobiti koordinate? saj moja tabela ne vsebuje šumnikov, zato ko naredim : koordinate <- coordinates ... mi jih ne zazna vseh, saj se razlikujejo ravno zaradi teh šumnikov; torej jih moram verjetno nekako na roke sama napisati? in verjetno potem tudi imena regij?

Hvala in lp

jaanos commented 9 years ago

Z rect bi dejansko morala na roke narisati legendo, tako da to v bistvu odsvetujem - je pa načeloma izvedljivo. Tako bo najbolje, če vse grafe narediš z spplot. Koordinate dobiš iz zemljevida - v tvojem primeru je to slo:

print(spplot(slo, "vode2003", col = topo.colors(50),
             main = "Poraba vode na prebivalca (leto 2003)",
             sp.layout = list(list("sp.text", coordinates(slo), slo$NAME_1, cex = 0.3))))

Seveda lahko tudi tukaj, podobno kot pri zemljevidu Evrope, po potrebi še premikaš ali spreminjaš imena. Podobno narediš tudi za ostale zemljevide - če se odločiš premikati in spreminjati oznake, lahko te iste spremembe upoštevaš pri vseh zemljevidih (seveda jih narediš samo enkrat).

Ena možnost brez spplot je sicer tudi ta, da so barve neposredno primerljive med seboj že brez legende - vzameš npr. odtenke rumene barve, kjer ti bela prikazuje najmanjše vrednosti, živo rumena pa največje:

barve =rgb(1, 1, (n:1)/n)[unlist(1+(n-1)*norm.povprecje)]

Na vajah smo imeli primer z rdečimi odtenki, a smo tam spreminjali prosojnost (četrti, neobvezen parameter funkcije rgb) - ker imaš nastavljeno barvo ozadja, bi potem namesto bele videli barvo ozadja. Seveda bi lahko tudi drugače mešali barve. Pomanjkljivost tega pristopa je v tem, da brez legende ne vemo, za kakšne številske vrednosti gre (lahko samo primerjamo).

Še to: na repozitoriju imaš datoteko .RData. Svetujem ti, da jo pobrišeš - s posodobljeno datoteko .gitignore ti je potem ne bo več ponujalo pri commitih.

spelapovrzenic commented 9 years ago

Hvala za vse te odgovore! :)

Zapiram issue

jaanos commented 9 years ago

Še en popravek: pri spplot namesto col uporabimo col.regions (ta določa barve območij, col pa barve črt med njimi).

spelapovrzenic commented 9 years ago

aha, hvala, sem spremenila :)