2013-03-03 1 views
3

J'ai des données sur les flux de navetteurs du recensement de 2001. Je l'ai converti de "plat" à "long" forme en utilisant melt du paquet R reshape2 et placé origines et destinations dans la même ligne parce que ggplot2 accepte seulement les entrées de trame de données. Mon problème est que j'ai fini par doubler les données pour chaque ligne, de sorte que chaque ligne (ligne) a une origine et une destination. Je suis sûr qu'il existe une solution plus concise, impliquant probablement une forme encore plus longue de mes données.Comment dessiner des flux dans ggplot2 en fonction d'une matrice de flux

Pour le problème spécifique, j'ai produit un petit exemple détaillé de Hereford:

# prepare data + packages 
library(ggplot2) 
library(ggmap) 
flows.mini <- flows.ft[1:100,] 
save(flows.mini, file="flows.mini.RData") 
load("flows.mini.RData") 
head(flows.mini) 

variable X.1 value  X1.x  X2.x  X1.y  X2.y n nr 
1 00GANY 00GANY 605 -2.699389 52.06554 -2.699389 52.06554 605 1 
2 00GANY 00GAPA 135 -2.742064 52.04099 -2.699389 52.06554 135 2 
3 00GANY 00GAQD 25 -2.733890 51.93402 -2.699389 52.06554 25 3 
    fcols 
1 500+ 
2 100-500 
3 10-100 

Pour reproduire les mesures prises par les deux dernières lignes, s'il vous plaît télécharger le fichier RDATA (2 kb): http://dl.dropbox.com/u/15008199/flows.mini.RData et reproduire le terrain:

mini-flows-plot

Voilà comment je l'ai tracé obtenu:

# plot flows by doubling-up 
hford <- qmap("hereford", source = "stamen", maptype = "toner", extent = "normal", maprange=FALSE) 

hford + geom_path(data= flows.mini, aes(x=c(X1.x,X1.y), y=c(X2.x, X2.y), 
     group = c(nr, nr), color = c(fcols,fcols), size= c(n,n)), 
     lineend = "round") + 
    scale_size_continuous(range = c(0.05,5)) + 
    scale_color_discrete(breaks = c("0-10", "10-100", "100-500", "500+")) + 
    coord_map() 

Je pense que vous serez d'accord que les doubles attributs sont inefficaces, donc, pour reformuler ma question: comment puis-je les supprimer?

+0

Pourquoi utilisez-vous 'geom_path'? Vos différentes lignes sont-elles connectées les unes aux autres? – juba

+0

Aucune raison; geom_lines semble produire le même résultat. J'ai essayé les deux et ne peut voir aucune différence entre les deux dans ce cas ... – RobinLovelace

Répondre

3

Je ne suis pas sûr de comprendre vraiment la question, mais si vous utilisez geom_segment au lieu de geom_path, résout-il le problème que vous décrivez de "doubler les attributs"?

Quelque chose comme:

hford + geom_segment(data= flows.mini, aes(x=X1.x,y=X2.x, xend=X1.y, yend=X2.y, 
     group = nr, color = fcols, size= n), 
     lineend = "round") + 
    scale_size_continuous(range = c(0.05,5)) + 
    scale_color_discrete(breaks = c("0-10", "10-100", "100-500", "500+")) + 
    coord_map() 

enter image description here

+0

Oui cela répond à la question. Il s'agissait d'une question spécifique sur la façon d'éviter d'utiliser 2n comme le nombre de cas d'attributs (résolus) et plus généralement sur la façon de tracer des données de flux en utilisant ggplot2. Je pense que votre réponse pourrait avoir résolu le dernier problème aussi, car le segment semble avoir été conçu pour ces applications et peut montrer la direction avec une flèche: http://docs.ggplot2.org/0.9.3/geom_segment.html. Nous étudierons les attributs changeants de la flèche. Merci. – RobinLovelace

Questions connexes