标签归档:animation

粉丝地图的可视化

Rweibo问世以来,我就对它的可视化感到兴趣盎然。通过它我们可以得到微博关注者的各项信息,其中比较有意思的一项是地点(location),这也就意味着,通过关注者的location(省市),可以找到他们的地理分布信息,同时,又可以得到他们的粉丝数目信息(可以判断是否是“微博名人”)。所以,既然万事俱备,为什么不用它做个“粉丝地图”来展示个人的粉丝信息呢?通过如下五步,我便基本得到了我想要的效果。

  1. 收集关注者的信息,整理地点信息;
  2. 获取并整理经纬度信息;
  3. 结合Himsic与ggmap包绘制图形;
  4. 结合animation包绘制动态图形。

1. 收集关注者的信息,整理location信息

首先,收集关注者的信息,并进行整理,我的做法是去除在“海外”,或者所在地为“其他”的人群(如果市的信息为“其他”而省份不为“其他”,令它与省份相同)。整理工作的代码如下:

roauth < - createOAuth(app_name = "pudding", access_name = "rweibo")
my_fri <- friendships.friends(roauth, uid = 2530951134, count = 200, cursor = 0)
save(my_fri, file = "my_fri.rda")
fri = my_fri[[1]]
info1=lapply(fri,function(x) c(x$name,x$location,x$followers_count))
info=do.call(rbind,info1)
loc=strsplit(info[,2]," ")
a=do.call(rbind,loc)
a[,1][a[,1]=="台湾"]="台"
a[,2][a[,2]=="台湾"]="台"
a[,2][a[,2]=="其他"]=a[,1][a[,2]=="其他"]
 
myfri=data.frame(name=info[,1],province=a[,1],city=a[,2],loc=apply(a,1,paste,collapse=" ")
 ,follower=as.numeric(info[,3]))
myfri=myfri[which(myfri$province!="其他"&myfri$province!="海外"),]

2. 获取并整理经纬度信息

不过,有了地理位置的名称是不够的,我们必须知道他们的经纬度信息,这一部分信息可以通过网页抓取而得:

library(XML)
# get data from web
webpage < - "http://blog.csdn.net/svrsimon/article/details/8255051"
tables <- readHTMLTable(webpage, stringsAsFactors = FALSE)
raw <- tables[[1]]
zh_posi <- raw[-1, ]
colnames(zh_posi) = c("province", "city", "county", "lon", "lat")
save(zh_posi, file = "zh_posi.rda")
zh_posi$loc = apply(zh_posi[, 1:3], 1, paste, collapse = " ")
zh_posi[, 4:5] = apply(zh_posi[, 4:5], 2, as.numeric)

get.loc <- function(loc) {
    pro = grepl(loc[1], zh_posi$loc)
    cit = grepl(loc[2], zh_posi$loc)
    match = which(pro & cit)
    show(match)
    return(c(mean(zh_posi$lon[match]), mean(zh_posi$lat[match])))
}

b = apply(myfri[, 2:3], 1, get.loc)
myfri$lon = b[1, ]
myfri$lat = b[2, ]

鉴于关注人数在某些地区过于集中,此处只取在这些地区的均值表示:

library(sqldf)
myfri2 = sqldf("select province,city, avg(lon) as m_lon,avg(lat) as m_lat, avg(follower) as m_fol from myfri group by province,city")
Encoding(myfri2$province) = "UTF-8"
Encoding(myfri2$city) = "UTF-8"

继续阅读粉丝地图的可视化

在R中实现动态气泡图

最近我逐渐发现了ggplot2这个包的好处——只要用过一次,就再也不想回头使用R中自带的作图函数了。前两天鼓捣完一个地图的数据,又受到统计之都最新文章的影响,我忽然想起了Hans Rosling在TED上的精彩演讲。在图中横坐标是国民收入,纵坐标是国民的期望寿命,气泡的大小则是该国人口。整个图从1800年的统计数据开始,一直到2009年不断动态地展示,图上的气泡也随着时间变化不停地抖动上升。有一位在斯坦福专做可视化的博士用JavaScript在网页上重现了这段动态效果图,点开页面即可观看:http://bost.ocks.org/mike/nations/

于是今天我便将这个图尝试着用R中的ggplot2与animation包实现了出来,边实现边研究ggplot2的用法,花了一天的时间做成了下面的这个视频

简单地说一下流程:首先是数据文件的获取。数据能够在github上找到,但是数据是JSON格式的,只有一行,因此我的大部分代码都在为让数据变成一个二维矩阵的形式而努力着……很多国家会出现某些年没有统计数据的情况,因此我用了线性插值填补。最后,有两个国家只有一年有数据,我只能将它们删掉了。

弄好了数据就可以使用ggplot2画图了。为了让图像好看,我调整了图像的属性,比如圆圈的大小范围,学习加边框,学习图中加文字(annotate)等语法。但我现在感觉还是有一些地方能够微调改进。

最后使用animation包中的saveMovie函数,结合ffmpeg导出成了一个视频。

最后附上代码

用R动态的显示开店序列和空间分布

作者简介:陈少飞,美国Tango Management Consulting公司高级地理研究分析员,主要工作为在连锁零售/餐饮的商业地产咨询中,从空间优化的角度给客户制订选址方案,并预测店面销售额。05年开始接触R,主要研究R在地理信息科学方面的应用,包括可视化,空间回归,地统计和空间最优化等。

一张图可以解说一个场景,而很多张图连续起来形成的动画就可以讲一个故事。

7-Eleven 便利店是源于美国的全球最大的便利连锁店,后来被日本伊藤洋华堂公司收购,在全球拥有42000家持有或连锁的店面,在美国本土也有超过8000家店。动态的显示美国8000家店的开店序列和空间分布,可以揭示这家连锁企业的发展规律,也对其他零售连锁企业的发展有着借鉴作用。

从这个动画中,我们可以看到7-Eleven起源于达拉斯,但是很快就把店面开到东西海岸。在发展早期迅速走出本地市场的举动,让其很快占领了美国的主要市场,赢得了口碑,接下来不断的在这些已有市场增加店的密度。80年代后期,前阶段的扩张导致7-Eleven遭遇财政危机,频临破产,开店速度明显降低。进入到2000年后,随着日资的收购,资金获得保障,开店速度重新加快。2010年后,不受金融危机的影响,开始跳出现有市场,在新的市场迅速拓展,这一阶段又稍显盲目。

结合开店数目的静态时序图,我们可以更直观的了解7-Eleven的扩张速度。

7-11

该动画采用了R里的animation 包,并得到了该包的作者谢益辉的指点。数据来自于现任美国7-Eleven市场规划部的总监,分析解读来自前任美国7-Eleven地产部副总裁。