2016-05-08 1 views
2

Je voudrais créer une carte où les états sont colorés selon un critère, et hachurés (ou différenciés d'une manière ou d'une autre) selon des critères différents. Jusqu'à présent, ce que j'ai estggplot mappage remplissage basé sur deux conditions différentes

library(ggmap) 
library(mapdata) 
library(ggplot2) 
library(dplyr) 
region<-c("california","nevada","oregon","washington") 
var1<-c(0,1,0,1) 
var2<-c(3,4,4,3) 
my_data<-data.frame(region, var1, var2) 
all_states_map <- map_data("state") 
Total <- inner_join(all_states_map,my_data, by = "region") 
Total$var1<-as.factor(Total$var1) 
my_map <- ggplot() + geom_polygon(data=Total, aes(x=long, y=lat, group = Total$group, fill=Total$var1),colour="white", 
         show.legend=TRUE) + scale_fill_manual(values=c("blue","gray")) 

Alors maintenant, mes états sont codés par couleur selon que var1 est 0 ou 1. Est-il possible de superposer quelque chose au-dessus de ce à hachurer états où var2 est 3, et laisser seul les états où var2 est 4?

Edit: ce que je voudrais est quelque chose comme ceci: my map

+0

Vous pourriez avoir à faire quelque chose comme cet exemple: http://stackoverflow.com/questions/21677489/fill-geospatial-polygons-with-pattern-r –

Répondre

1

cela pourrait ne pas être idéal, mais aide peut-être d'une certaine façon?

library(ggmap) 
library(mapdata) 
library(ggplot2) 
library(dplyr) 
library(sp) 
region<-c("california","nevada","oregon","washington") 
var1<-c(0,1,0,1) 
var2<-c(3,4,4,3) 
my_data<-data.frame(region, var1, var2) 
all_states_map <- map_data("state") 
Total <- inner_join(all_states_map,my_data, by = "region") 
Total$var1<-as.factor(Total$var1) 

randomPoints <- NULL 

# For each region find a set of points inside each state 
for(i in region){ 
    sub <- subset(Total, region == i) 
    sub.sr = SpatialPolygons(list(Polygons(list(Polygon(sub[,1:2])), "a"))) 

    smple <- as.data.frame(spsample(sub.sr, n = 100, "regular")) 

    temp <- data.frame(x = smple[,1], y = smple[,2], region = i, var1 = unique(sub$var1), var2 = unique(sub$var2)) 
    randomPoints <- rbind(randomPoints, temp) 
} 

ggplot() + 
    geom_polygon(data=Total, aes(x=long, y=lat, group = group, fill=var1), color = "white") + 
    geom_point(data = randomPoints, aes(x = x, y = y, shape = as.factor(var2)), size = 1) + 
    scale_shape_manual(values = c(1, 2)) 

enter image description here

2

Est-ce quelque chose à ce que vous aimeriez voir?

ggplot() + geom_polygon(data=Total, aes(x=long, y=lat, group = group, 
         fill = paste(var1, var2, sep = ", ")), colour="white") + 
      scale_fill_manual(values=c("blue","gray", "green", "red")) + 
      labs(fill = "(var1, var2)") 

enter image description here

Une autre option est que vous définissez la transparence comme une autre dimension de la parcelle, de sorte que ce serait, ce qui pourrait être plus proche de ce que vous voulez?

ggplot() + geom_polygon(data=Total, aes(x=long, y=lat, group = group, 
         fill = var1, alpha = as.factor(var2)), colour="white") + 
      scale_fill_manual(values=c("blue","red")) + 
      scale_alpha_manual(values = c(0.5, 1)) + 
      labs(alpha = "var2", fill = "var1") 

enter image description here

+0

Je pourrais finir par avoir besoin faire quelque chose comme ça, mais ce n'est pas exactement ce que je veux. J'ai édité la question avec un exemple. Je cherche un moyen de faire en sorte que les deux choses semblent indépendantes. – user5457414

1

On dirait qu'il n'y a pas de solution facile à ce problème dans ggplot. Une façon de différencier pourrait être d'utiliser différents contours autour des polylignes comme dans cet exemple:

ggplot() + 
    geom_polygon(data=Total, aes(x=long, y=lat, group = Total$group, 
           fill=Total$var1,colour=as.factor(var2)), 
           ,size=3,show.legend=TRUE) + 
    scale_fill_manual(values=c("blue","gray"))+ 
    scale_color_manual(values=c("black",NA)) 

contour example1

Mais comme vous pouvez le voir les résultats dans une largeur de ligne incompatible entre la Californie et les autres Etats en raison de l'ordre de traçage des polygones. Nous pouvons résoudre ce problème d'une façon rapide et sale en augmentant la groupnumber des États où var2 est égal à 3:

Total2<-Total%>% 
    mutate(group=ifelse(var2==3,group+100,group)) 

ggplot() + 
    geom_polygon(data=Total2, aes(x=long, y=lat, group = Total2$group, 
           fill=Total2$var1,colour=as.factor(Total2$var2)), 
       ,size=3,show.legend=TRUE) + 
    scale_fill_manual(values=c("blue","gray"))+ 
    scale_color_manual(values=c("black",NA)) 

contour example2

Si vous voulez vraiment aller pour le vous hachures peut devoir abandonner ggplot pour celui-ci:

Fill Geospatial polygons with pattern - R