2013-04-16 7 views
17

Ich möchte einen BarPlot für jeden Standort auf einer Karte mithilfe ggplot2 produzieren, wie durch xingmowang mit Basis Grafiken und eine Reihe von Paketen getan wurde:Balkendiagramme auf Karte mit ggplot2 plotten?

http://nzprimarysectortrade.wordpress.com/2011/10/02/let-r-fly-visualizing-export-data-using-r/

enter image description here

Dies ist verwandten zu Embedding a miniature plot within a plot.

Für den Moment das Beste was ich tun kann, ist Einstimmungswert Größe in einem Jitterbasierten Punkt des Grundstückes zu Punkt:

require(ggplot2) 
require(maps) 

#Get world map info 
world_map <- map_data("world") 

#Creat a base plot 
p <- ggplot() + coord_fixed() 

#Add map to base plot 
base_world <- p + geom_polygon(data=world_map, 
           aes(x=long, 
            y=lat, 
            group=group)) 


#Create example data 
geo_data <- data.frame(long=c(20,20,100,100,20,20,100,100), 
         lat=c(0,0,0,0,0,0,0,0), 
         value=c(10,30,40,50,20,20,100,100), 
         Facet=rep(c("Facet_1", "Facet_2"), 4), 
         colour=rep(c("colour_1", "colour_2"), each=4)) 

#Creat an example plot 
map_with_jitter <- base_world+geom_point(data=geo_data, 
              aes(x=long, 
               y=lat, 
               colour=colour, 
               size=value), 
             position="jitter", 
             alpha=I(0.5)) 

#Add faceting 
map_with_jitter <- map_with_jitter + facet_wrap(~Facet) 

map_with_jitter <- map_with_jitter + theme(legend.position="none") 

print(map_with_jitter) 

Example map plot with ggplot2

Mit einer unelegant Abhilfe:

subset_data <- geo_data[geo_data$Facet=="Facet_1" & 
          geo_data$long=="20",] 
subplot <- qplot(data=subset_data, 
       x=colour, 
       y=value, 
       fill=colour, 
       geom="bar", 
       stat="identity")+theme(legend.position="none") 

print(base_world) 
print(subplot, vp=viewport((200+mean(subset_data$long))/400,(100+mean(subset_data$lat))/200 , .2, .2)) 

enter image description here

+1

Verwandte Frage: http://stackoverflow.com/questions/10368180/plotting-pie-graphs-on-map-in-ggplot –

+2

Was ist hier die Frage? Was hast du probiert? –

+0

siehe '? Annotation_custom' für ein Beispiel der eingesetzten Grafik – baptiste

Antwort

23

Nach oben Datum 2016.12.23: Die ggsubplot -Paket ist nicht mehr aktiv gepflegt und ist archived on CRAN.

Package ‚ggsubplot‘ wurde aus dem CRAN Repository entfernt>
Früher verfügbaren Versionen können aus dem Archiv erhalten werden .>
Archiviert am 2016-01-11 wie vom Betreuer [email protected] angefordert.

ggsubplot funktioniert nicht mit R-Versionen> = 3.1.0. Installieren Sie 3.0.3 R den Code auszuführen:


Sie können in der Tat erreichen dies mit Hilfe des ggsubplot Paket wie Baptiste vermuten lässt.

library(ggsubplot) 
library(ggplot2) 
library(maps) 
library(plyr) 

#Get world map info 
world_map <- map_data("world") 

#Create a base plot 
p <- ggplot() + geom_polygon(data=world_map,aes(x=long, y=lat,group=group)) 

# Calculate the mean longitude and latitude per region, these will be the coördinates where the plots will be placed, so you can tweak them where needed. 
# Create simulation data of the age distribution per region and merge the two. 

centres <- ddply(world_map,.(region),summarize,long=mean(long),lat=mean(lat)) 
mycat <- cut(runif(1000), c(0, 0.1, 0.3, 0.6, 1), labels=FALSE) 
mycat <- as.factor(mycat) 
age <- factor(mycat,labels=c("<15","15-30","20-60",">60")) 
simdat <- merge(centres ,age) 
colnames(simdat) <- c("region","long","lat","Age") 

# Select the countries where you want a subplot for and plot 
simdat2 <- subset(simdat, region %in% c("USA","China","USSR","Brazil", "Australia")) 
(testplot <- p+geom_subplot2d(aes(long, lat, subplot = geom_bar(aes(Age, ..count.., fill = Age))), bins = c(15,12), ref = NULL, width = rel(0.8), data = simdat2)) 

Ergebnis: enter image description here

+0

Jede Möglichkeit, eine y Achse oder mindestens eine Referenzleiste hinzuzufügen, die die Höhe einer bestimmten Anzahl von Einheiten auf der y-Achse zeigt (ref: ref_box, ref_hline, ref_vline nur erlauben Sie angeben, relativ zu Zeichnungsbereich nicht y-Achse Einheiten)? Ich denke, man könnte jedem Behälter einen bekannten Datenpunkt mit einem bekannten Wert auf der y-Achse hinzufügen, der dann in der Legende dargestellt würde. Irgendwelche anderen Lösungen? –

+0

Ich habe das noch nie gemacht, also weiß ich es nicht. Ich werde es prüfen. – JT85

+0

Könnte jemand möglicherweise klären, wie 'geom_bar'' '..count..' Argument funktioniert? – geotheory