如何基于流矩阵在ggplot2中绘制流程

时间:2013-03-03 22:50:46

标签: r ggplot2 ggmap

我有2001年人口普查的通勤流量数据。我使用来自melt R包的reshape2将其从“平面”转换为“长”形式,并将原点和目标放在同一行中,因为ggplot2仅接受数据框输入。

我的问题是我最终加倍了每行的数据,因此每行(行)都有一个起点和一个目的地。我确信有一个更简洁的解决方案,可能涉及更长的数据形式。

为了解决问题,我从赫里福德制作了一个小例子:

# 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

要重现最后两行的步骤,请下载RData文件(2 kb):http://dl.dropbox.com/u/15008199/flows.mini.RData并重现该图:

mini-flows-plot

这就是我绘制它的方式:

# 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() 

我认为你会同意双重属性是低效的,所以,重新说出我的问题:如何删除它们?

1 个答案:

答案 0 :(得分:3)

我不确定我是否真的理解这个问题,但是如果你使用geom_segment代替geom_path,它是否会解决你所描述的“将属性加倍”的问题?

类似的东西:

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