星期四, 七月 26, 2012

中国国内航线信息的可视化


上图是对国内机场和航线信息进行了一个简单的可视化。圆点表示了中国163个机场的位置,线条显示了5381条航线。之前曾在这个网站见到了作者用R语言来对全世界的航线进行可视化。正所谓见贤思齐,本图就是模仿山寨的结果。但是这个图的生成没有原文那么复杂,所用到的地理图形包和步骤也与原例略有不同,比较失败的是没有展现出原图的夜景效果。具体实施的步骤如下:

  • 从这个网站下载到机场数据和航线数据;
  • 从中挑选出中国的机场和国内航线,并加以整理;
  • 用ggmap包读取谷歌地图;
  • 将机场和航线信息绘制在地图上。

library(ggmap)
data.port <- read.csv('d:\\airports.dat',F)
data.line <- read.csv('d:\\routes.dat',F)
library(stringr)
# 找到中国的机场
portinchina <- str_detect(data.port[,'V4'], "China")
chinaport <- data.port[portinchina,]
# 去除少数几个没有编号的机场
chinaport <-chinaport[chinaport$V5!='',
                      c('V3','V5','V7','V8','V9')]
names(chinaport) <- c('city','code','lan','lon','att')
 
# 找出国内航班
lineinchina <- (data.line[,'V3'] %in% chinaport$code) & (data.line[,'V5'] %in% chinaport$code)
chinaline <- data.line[lineinchina,c('V3','V5','V9')]
names(chinaline) <- c('source','destination','equipment')
 
#构建一个函数,根据机场编码得到经纬度
findposition <- function(code) {
    find <- chinaport$code==code
    x <- chinaport[find,'lon']
    y <- chinaport[find,'lan']
    return(data.frame(x,y))
}
 
# 将机场编码转为经纬度
from <- lapply(as.character(chinaline$source),findposition)
from <- do.call('rbind',from)
from$group <- 1:dim(from)[1]
names(from) <- c('lon','lan','group')
 
to <- lapply(as.character(chinaline$destination),findposition)
to <- do.call('rbind',to)
to$group <-1:dim(to)[1]
names(to) <-c('lon','lan','group')
data.line <- rbind(from,to)
temp<- data.line[data.line$group<100,]
# 用ggmap包从google读取地图数据,并将之前的数据标注在地图上。
ggmap(get_googlemap(center = 'china', zoom=4,
                    maptype='roadmap'),extent='device')+
    geom_point(data=chinaport,aes(x=lon,y=lan),
               colour = 'red4',alpha=0.8)+
    geom_line(data=data.line,aes(x=lon,y=lan,group=group),
              size=0.1,alpha=0.05,color='red4')

有兴趣的同学还可以进一步研究,哪个航线最远,分布如何,哪条航线最多,航线飞机档次如何,哪个机场海拔最高,哪个机场最忙....

17 条评论:

  1. 此评论已被作者删除。

    回复删除
  2. 看你博客收益匪浅。
    我最近有个想法,因本人在计算机语言上不太精通,R正在努力学习中,我想通过Blooberg提供的Open API,用R读取其数据。有一个R包叫Rbbg可以实现读取收费的bloomberg数据,如果利用Rbbg从Open API读取数据,那就非常棒了。
    Bloomberg's Open API:http://www.openbloomberg.com/open-api/

    Rbbg:http://findata.org/rbloomberg/
    这个包以前叫rbloomberg,现在改名为Rbbg,CRAN上没有这个包,安装方法是:install.packages("Rbbg", repos = "http://r.findata.org")
    我自己无能为力,如果您要是有时间研究一下。

    回复删除
    回复
    1. 这个应该不是免费的数据来源,需要先装好bloomberg的软件。你看http://findata.org/rbloomberg/rbloomberg-manual-0-4-144.pdf这份文档中的这句话:RBloomberg will only work on a Bloomberg workstation.

      我也尝试装这个包,没法建立连接。如果你是要一般的股票数据的话,也可以用yahoo的数据源。

      删除
  3. 非常感谢您的回复!
    从yahoo里调用一般股票数据的方法我已搞懂了。最近想研究欧债危机,所以需要欧洲多个国家债券收益率和CDS spread。我知道bloomberg上有这些数据,但这都是要钱的。今天早上发现Bloomberg提供了Open API,好像通过C/C++,Java等可以免费获得其数据。可是我不懂如何操作,不知道你是否了解。

    回复删除
    回复
    1. 不好意思啊,不会java,也不会C。

      删除
  4. 学长,这个airlines.dat 的数据集需要翻墙才能下载吗??我现在在不下来。。

    回复删除
    回复
    1. 不需要翻,这网站下载是很慢,好像还不支持多线程下载。

      删除
  5. 我是r2.15.1的版本,其他包都是最新的。但是运行最后一部分报错:
    1: Removed 1 rows containing missing values (geom_point).
    2: Removed 14 rows containing missing values (geom_path).
    请问是什么原因?
    还有在另一个地方你的代码是错的。data.line <- read.csv。。。这句错了

    回复删除
    回复
    1. 因为地图不够大的原因漏画了中国边疆地区一个点,所以会有警告。但这个关系不大。

      那行代码错在哪里?

      删除
    2. 1已经被修改好了。
      2但是由于缺失这些数据,最后的图无法绘出。只有点,没有线。如何修改?

      删除
    3. 解决了没有线的问题了吗?

      删除
  6. 博主 知道哪里能下到生物数据吗?
    就是那种 病例的DNA SNP 一类的

    回复删除
    回复
    1. 我对生物了解不多,你可以到这里看看。http://www.bioconductor.org/ 国外还是有很多公开的生物数据的。有些书上也提供了数据资源。

      删除
    2. 博主,您好,我想问一下,就您做的这个图,如果想以路径(ggmap::route)的形式来展示,而不是直线(geom_line),可以同时展示多条路径吗

      删除
    3. 我看见有人这么做过,但是线路过多的话,可以画不出来

      删除
  7. 我在最后画图的时候出现Error: Discrete value supplied to continuous scale
    这个应该怎么办?

    回复删除
  8. 只出来了点,没有出来线,不知怎么解决? 查看了data.line和data.port的数据都是正确的。 需要调用其他的库吗? 还是说data.line 那里是不对的啊, geom_line(data=data.line,aes(x=lon,y=lan,group=group) 这个group=group 何解???

    回复删除