2016-05-08 15 views
2

Ich möchte eine Karte, wo die Staaten sind nach einem Kriterium gefärbt, und kreuzschraffiert (oder irgendwie anders differenziert) nach einem anderen Kriterien. Bisher, was ich habe, istggplot Mapping Füllung basierend auf zwei verschiedenen Bedingungen

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")) 

So jetzt meine Zustände sind farbkodiert basierend darauf, ob var1 0 oder 1. Gibt es eine Möglichkeit, etwas oben auf, dass zu überlagern Staaten Kreuzschraffur wo var2 3 ist, und verlassen Alleine die Zustände, in denen var2 4 ist?

Edit: so etwas wie das, was Ich mag würde, ist: my map

+0

Sie könnten so etwas wie dieses Beispiel zu tun haben: http://stackoverflow.com/questions/21677489/fill-geospatial-polygons-with-pattern-r –

Antwort

1

Das ist nicht ideal sein könnte, sondern hilft vielleicht in irgendeiner Weise?

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

Ist das etwas in der Nähe zu dem, was Sie sehen möchten?

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

Eine weitere Option ist, dass Sie die Transparenz als eine andere Dimension der Handlung gesetzt, so dass es sein würde, die näher sein könnte, was Sie wollen?

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

ich am Ende vielleicht brauchen so etwas zu tun, aber es ist nicht genau das, was ich will. Ich habe die Frage mit einem Beispiel bearbeitet. Ich suche nach einer Möglichkeit, die zwei verschiedenen Dinge unabhängig aussehen zu lassen. – user5457414

1

Es sieht aus wie es für dieses Problem in ggplot keine einfache Lösung. Eine Möglichkeit zur Differenzierung könnte unterschiedliche Konturen wie in diesem Beispiel um die Polylinien zu verwenden:

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

Aber wie Sie dies führt zu einer inkonsistenten Linienbreite zwischen Kalifornien sehen und den anderen Staaten wegen die Polygonauftragsreihenfolge. Wir können dieses Problem beheben, in einer schnellen und schmutzigen Weg durch die Group der Staaten erhöhen, in denen var2 gleich 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

Wenn Sie wirklich die Sie gehen wollen für Schraffur kann ggplot verlassen haben für diese:

Fill Geospatial polygons with pattern - R