2013-03-09 9 views
5

Próbuję stworzyć mapę świata za pomocą ggplot2 w R. Chcę pokazać PKB na mieszkańca z Brazylii. Występują 2 problemy:Formatowanie mapy ggplot2

  1. W centrum kraju dwie etykiety nie są łatwe do odczytania. Nakładają się.Rozwój liczby nie rozwiązano.

  2. Chciałbym zmienić podział kolorów i nie wiem, jak uzyskać do niego dostęp. Chciałbym użyć kolorów, aby łatwo było zauważyć różnice w PKB.

Moje dane to: https://docs.google.com/file/d/0B_coFit6AovfcEFkbHBjZEJaQ1E/edit

Oto mój kod:

library(maptools) 
gpclibPermit() 
library(ggplot2) 
library(rgdal) 
library(rgeos) 
library(ggmap) 


# read administrative boundaries (change folder appropriately) 
brMap <- readShapePoly("BRASIL.shp") 
brMap 

# read downloaded data (change folder appropriately) 
brRen <- read.csv("Renda.csv", sep = ";", quote = "\"", dec=".", stringsAsFactors = FALSE) 
brRen$rendapc <- as.numeric(as.character(brRen$rendapc)) # format as numeric 

#convert shp to UTF8 
library(descr) 
brMap$ESTADO<-toUTF8(brMap$ESTADO, "IBM850") 

# convert shp data to data frame for ggplot 
as.data.frame(brMap) # para definir a region 
brMap = gBuffer(brMap, width=0, byid=TRUE) #correct problem with Polygons - TopologyException 
brMapDf <- fortify(brMap, region="UF") 
brMapDf 


# merge map and data 
brRenMapDf <- merge(brMapDf, brRen, by.x="id", by.y="Iden") 
brRenMapDf <- brRenMapDf[order(brRenMapDf$order),] 

# limit data to main Europe 
brazil.limits <- geocode(c("Monte Caburaí", "Barra do Chuí", "Serra do Divisor", "Ilhas Martin Vaz")) 
brRenMapDf <- subset(brRenMapDf, long > min(brazil.limits$lon) & long < max(brazil.limits$lon) & lat > min(brazil.limits$lat) & lat < max(brazil.limits$lat)) 

# ggplot mapping 
# data layer 
m0 <- ggplot(data=brRenMapDf) 
# empty map (only borders) 
m1 <- m0 + geom_path(aes(x=long, y=lat, group=group), color='gray') + coord_equal() 
m1 

# fill with education expenditure data 
m2 <- m1 + geom_polygon(aes(x=long, y=lat, group=group, fill=rendapc)) 
m2 


# inverse order (to have visible borders) 
m0 <- ggplot(data=brRenMapDf) 
m1 <- m0 + geom_polygon(aes(x=long, y=lat, group=group, fill=rendapc)) + coord_equal() 
m2 <- m1 + geom_path(aes(x=long, y=lat, group=group), color='black') 
m2 


# over a GoogleMap (not working if not correctly projected) 
map <- get_map(location = 'Brazil', zoom=4) 
m0 <- ggmap(map) 
m1 <- m0 + geom_polygon(aes(x=long, y=lat, group=group, fill=rendapc), data=brRenMapDf, alpha=.9) 
m2 <- m1 + geom_path(aes(x=long, y=lat, group=group), data=brRenMapDf, color='black') 
m2 


# add text 
library(doBy) 
txtVal <- summaryBy(long + lat + rendapc ~ id, data=brRenMapDf, FUN=mean, keep.names=T) 
m3 <- m2 + geom_text(aes(x=long, y=lat, label=rendapc), data=txtVal, col="yellow", hjust=0.5, vjust=0.5, cex=3) 
m3 

Mój wynik chcę poprawić:

enter image description here

+0

Whay o grafikę svg na etykietach? Czy są dostępne? –

Odpowiedz

5

W odniesieniu do zmiany colorcale, ggplot2 ma jednolity sposób obsługi s cale. Funkcja, której szukasz, ma zawsze format scale_{which_scale}_{scale_type}, gdzie which_scale jest estetyczny (to, czego używasz w aes(), na przykład fill lub size), a scale_type może być ciągły lub dyskretny itp. Czego szukasz, jeśli chcesz zmiana skali: fill to scale_fill_continuous, scale_fill_gradient lub scale_fill_gradient2. Zapoznaj się z dokumentacją tych funkcji.

przykład kodu:

m2 <- m1 + geom_polygon(aes(x=long, y=lat, group=group, fill=rendapc)) 
m2 + scale_fill_gradient(low = "blue", high = "red") 
+0

Dziękuję bardzo za pomoc! – user2152340