显示标签为“ggplot2”的博文。显示所有博文
显示标签为“ggplot2”的博文。显示所有博文

星期日, 七月 20, 2014

python和ggplot2

python有个非常强大的工具,那就是ipython notebook。用户可以在浏览器中直接编写python脚本,并立即得到输出结果。这类文档可以存为ipynb分享给其它人,也可以存为html直接放在网站上,非常有利于学习交流。

在R语言方面就缺乏这类工具,不过ipython有一种“魔法”,可以在ipython中运行其它语言。在数据分析时,可以将python和R代码混编,充分利用两种语言的优势。以可视化为例,R的ggplot2图形语法可谓是独步江湖,python中虽然已经有不少优秀的绘图库。但总不及ggplot2用得习惯。下面的小例子就是示范在ipython notebook中画ggplot2。

首先是用numpy库建立两个向量,再用%load_ext建立python和R的连接机制。之后在ipython notebook的一个cell里面就可以使用%R后面接R代码行,或者使用%%R使用代码块。如果要在R代码块中读入python的对象,需要使用-i参数。

其它例子可以参见这个,python中也有人复制了ggplot语法,可参见这里

星期六, 十月 06, 2012

Economist风格的统计绘图

《Economist》(经济学人)是一份由伦敦经济学人报纸有限公司出版的杂志,于1843年9月由詹姆士·威尔逊创办。杂文章写得机智,幽默,有力度,严肃又不失诙谐,并且注重于如何在最小的篇幅内告诉读者最多的信息。杂志主要关注政治和商业方面的新闻,但是每期也有一两篇针对科技和艺术的报导,以及一些书评。从2012年1月28日的那一期杂志开始,《经济学人》杂志开辟了中国专栏,为有关中国的文章提供更多的版面。

杂志不仅文章内容精彩,排版和图片也非常具有特色。其中的统计图片均是以蓝色为基调,简洁而大气。如果你想绘制出这种风格的统计图,现在也很简单了。只需要使用R语言中大名鼎鼎的ggplot2包,以及Jeffrey Arnold新开发的ggthemes包,就能轻易的实现了。

ggthemes包还不能从CRAN库中安装,所以需要从github上下载原始文档,编译成zip本地安装包,最后在R中进行安装加载就可以使用了。如果你已经安装了Rtools,也可以使用devtools包中的install_github()函数来直接安装github上的R包。

下面就是用ggplot2+ggthemes包作的一个小例子,其中重要的就是要用到theme_economist()和scale_color_economist()这两个函数来实现economist风格的统计图。很简单吧!ggthemes包中还有其它主题可供使用,慢慢研究。


p <- ggplot(data=mpg, mapping=aes(x=cty,y=hwy))
p + geom_point(aes(color=factor(year)),
               alpha=0.5,position = "jitter")+
    stat_smooth()+
    theme_economist() + scale_color_economist()+
    labs(title = '汽车型号与油耗',
         y = '每加仑高速公路行驶距离',
         x = '每加仑城市公路行驶距离',
         colour = '年份')

星期六, 八月 04, 2012

中国的环境状况在全球的位置

由美国耶鲁大学和哥伦比亚大学联合推出的“年度全球环境绩效指数”(EPI)排名在2012年年初放出。此排名旨在评估一个国家的环境政策,环境卫生与生态系统之平衡的状态,涵盖10项领域共22项环境指标,涉及领域包括气候变化、农业、渔业、森林、水源、空气污染及环境负担等。详细报告和数据都可以在网站主页找到。本文就使用这个数据集来观察中国的环境状况在全球的位置。
上面的小提琴图即是22项指标的分布,叠加的红色圆点表示了中国得分位置。这些指标已经被研究人员进行了转换,所有的指标均是得分越高越好。从这些得分点可以看出,中国在森林保护(FORGROINV)和生物多样性(PACOV)方面做得还不错,CO2排放(CO2GDP)和饮用水(WATSUPINV)等方面做得一般,在PM2.5和室内空气(INDOOR)等方面处于垫底情况。更多的指标说明请参看报告主页。其中的EPI是环境绩效评价的综合得分。

星期四, 七月 26, 2012

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


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

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

星期四, 六月 28, 2012

用ggmap包进行地震数据的可视化

最近又发现了一个比较好玩的包ggmap。从名字上可以猜测出来,它的作用就是将ggplot2和map相结合。这样R语言用户能方便的获取各种静态地图数据,并在其基础上使用强大的ggplot绘图工具。ggmap包整合了四种地图资源,分别是Google、OpenStreetMaps、Stamen和Cloudmade。为了演示ggmap的作用,本例是从地震信息网获取最近一周的地震数据,得到其经纬度,然后以散点形式绘制在google地图上,另外也显示地震发生的密度估计。这个思路本质上和之前的一篇博文是一致的,但用ggmap包实现起来更为简单。

星期二, 六月 19, 2012

ggplot的图形组合与添加jpeg文档的方法


最近有位朋友问了一个关于ggplot2作图的问题。涉及到多个图形组合的问题,所以还是费了一些时间来解决,自己也从中学习了一些新东西。顺手将这个画图的过程扔上来当作一篇博文吧。下图就是最后的结果。画这个图有几个障碍,一个是二维散点的置信椭圆,另一个是一维直方图的边缘显示。解决的方法是用ellipse包来生成置信椭圆数据,并且用gridExtra包来组合多个图形,还要用opts来去除图例标注的显示。

星期四, 六月 07, 2012

北上广三地的空气质量抽样比较


从前看《龙文鞭影》里的小故事,印象中有“秦宓论天”这么一个典故。在莫谈国事的天朝,“天”乃是肉食者的禁脔,草民无权过问,茶馆里只能谈天气。但最近不仅不能谈“天”,据说连“天气”也不能谈了。所谓越是禁止的就越有破禁的快感。今天就来专门谈一谈天气。武汉的天气我们已经谈过,本文就来干涉下上海、北京和广州三地的天气内政,焦点即是这三个城市的空气质量情况。

我们的思路是从Twitter上采集空气质量数据,由于美国上海领事馆目前只公布了不到700条信息,所以我们只采集了660条,该数据是每小时公布一次,也就得到了最近约一个月的数据。我们的重点是AQI(Air Quality Index)数字。关于AQI的解释可以看这里。 收集的数据发现有少量是缺失值,这可能是仪器故障、爆表或是人员失误。而且广州领事馆发布的数据有不少格式不符的。数据收集之后进行了预处理,以转成容易处理的数据框格式。然后我们绘制了小提琴图,以观察不同城市的AQI数据,数值越大表明空气质量越差。

星期五, 六月 01, 2012

红楼梦文本折腾纪要


虽然对红学一无所知,对文本挖掘只是“略懂”,但并不妨碍我们勇于折腾的生活方式。上周参加了第五届R会议,学到不少好东西,其中一个就是中文分词的工具。当然要找个对象来折腾一下啦。本次的黑手就伸向了被人蹂躏无数次的小说《红楼梦》。

折腾的思路基本上就是:1、将文本按章回划分。2、按章回获取某些统计量,看能否区别前八十回和后四十回。3、中文分词后以空间向量模型方法构造词条-文档关系矩阵。4、计算文档间距离后用多维标度方法降到二维展现120回的散点图形。

先从网上扒拉下一个纯文本的文档,也不知道什么版本。先用记事本打开后转成UTF8格式,然后在R中读入资料。此时的存储格式是list格式,list的每一个元素是文本中的一段。首先找出文本的章节划分点,然后计算出每一章节的段落数。下图即是这120回的段落数条形图,似乎在后四十回段落数量较少,而且趋于稳定,不如前八十回变化大。对二者作一个wilcox检验,证实了数量较少的显著性。同时用置换检验也证实了这一点。


星期六, 五月 19, 2012

用glmnet包实施套索算法(LASSO)


当我们使用数据训练分类器的时候,很重要的一点就是要在过度拟合与拟合不足之间达成一个平衡。防止过度拟合的一种方法就是对模型的复杂度进行约束。模型中用到解释变量的个数是模型复杂度的一种体现。控制解释变量个数有很多方法,例如变量选择(feature selection),即用filter或wrapper方法提取解释变量的最佳子集。或是进行变量构造(feature construction),即将原始变量进行某种映射或转换,如主成分方法和因子分析。变量选择的方法是比较“硬”的方法,变量要么进入模型,要么不进入模型,只有0-1两种选择。但也有“软”的方法,也就是Regularization类方法,例如岭回归(Ridge Regression)套索方法(LASSO:least absolute shrinkage and selection operator)

这两种方法的共同点在于,将解释变量的系数加入到Cost Function中,并对其进行最小化,本质上是对过多的参数实施了惩罚。而两种方法的区别在于惩罚函数不同。但这种微小的区别却使LASSO有很多优良的特质(可以同时选择和缩减参数)。下面的公式就是在线性模型中两种方法所对应的目标函数:

星期四, 五月 10, 2012

用ggplot2包来绘制地图


自从四月份进行重大升级之后,0.90版的ggplot2包更新了很多新功能。之前的博文谈到了升级版的二维直方图。今天我们要谈的是绘制地图的新功能。其图形元素主要是通过geom_map来实现,在它的帮助文档中只描述了如何绘制美国地图,而美国地图是系统内maps包所自带的地图数据。其它图家地图数据则要从外部导入,本文则尝试从 GADM 获取中国行政区域数据,然后用ggplot2包进行绘图。GADM是世界行政区域(或行政区域界线)位置的空间数据库,可以用于地理信息系统和类似软件。这个数据库也提供了R语言数据格式。

本例的目的是结合地理数据和水资源数据,以说明中国人均水资源拥有量的分布情况。基本步骤是先导入地理信息数据,将其转为ggplot2可以处理的数据框格式,将水资源数据整合进来,最后绘制成图。在下图中,红色代表了人均水资源拥有量较低的地区,黄绿色代表较高的地区。多年以来,华北地区都是有名的缺水地区,而长江以南水资源相对较为丰富,这一点很容易观察出来。而西藏、青海人口数量少,使人均水资源偏高。此外,根据全国水资源公报的数字,全国平均的人均水资源量是2200立方米。我们可以根据这一数字,将低于平均数的省份单独显示出来。顺便说下,公鸡的另一只腿可不是我吃了,数据原本如此。

星期四, 五月 03, 2012

日历中的夏天


看着有节,摸着无节--打一生活用品

不知不觉,夏日已慢慢临近。姑娘们飞扬的裙角,小贩叫卖的西瓜,蚊蝇嗡嗡的声音,以及翻过的一页日历,都提醒着你--夏天快来了。夏季有着不同的定义,根据中国人的日历,我们所俗称的夏季从“立夏”开始,到“立秋”结束。在气候学上,若连续五天平均温度超过22度,则算作夏季的开始,若五天平均温度低于22度则算作入秋。而天文学上的夏季一般是指6、7、8三个月。

我们想知道:哪一种夏季的定义更合乎我们的感觉?还是用数据可视化来说话吧。这项任务基本上有两个步骤,一是获取某城市的2011年日平均温度数据,二是根据数据绘制日历热图(Calendar Heatmap)

星期日, 四月 01, 2012

清明时节说死刑

死刑是自人类社会发展以来就诞生的一种剥夺人生命的刑罚。死刑除了是对于不守规则的事件的惩罚外,也是对破坏规则的情况的一种极重度的威吓。这个史前就已有的制度,是对进行不容于社会的行为的严厉惩罚之一。世界上几乎每一个国家或地区都曾有过“死刑”这种刑罚制度,时至今日,仍有一些国家继续存有并继续执行死刑。然而多数国家已经废止了死刑,有些国家则是已经10年以上未执行过死刑,或是仅允许在战时使用死刑。

在最近卫报的一则文章中,根据从2007到2011年的死刑数据进行了一些可视化工作。特别是根据大赦国际最近公布的一份报告,给出了一份死刑执行情况的气泡地图。形象的说明了当今世界上还有哪些国家在判决与执行死刑。本文则是照猫画虎,以说明R语言中googleVis包ggplot2包的使用方法。

星期日, 三月 18, 2012

ggplot2的新特性:升级版的二维直方图

ggplot2包可称得上是R语言中最为复杂和炫目的绘图包了。本博客也用了一系列文章对该包进行了介绍。在最近的3月初,其版本从0.89升级到了0.90,升级后的新版本提供了许多新的功能。其中之一是加强了对二元变量统计指标的显示能力。在之前的版本中,只能在图形中显示一元变量的统计指标(stat_summary)。对于二元变量只能显示简单的计数指标(stat_bin2d)。新版本相当于在二者基础上的升级,其主函数为stat_summary2d或者stat_summary_hex。下面我们先来熟悉下老版本中的两个函数,再介绍新函数。还有一点要注意的是,R内核需要升级到2.14以上才能使用新的ggplpot2。

本文的例子是R中内置的钻石数据(diamonds),其中用到的变量包括价格(price),重量(carat)以及某种尺寸指标(depth)。先绘制carat和price之间的散点图来了解二者关系,从下图可见,由于数据量过大,尽管使用了透明度参数,散点仍非常密集。

星期六, 二月 18, 2012

数字显微镜下的林书豪

现在网络上最为炙手可热的人物恐怕就是NBA新星林书豪(Jeremy Lin)了,但是俗话说:不怕不识货,就怕货比货。这位初生牛犊与其它NBA巨星相比,到底有多么优秀?还有多少差距?还是让数字来说话吧。首先从这里下载2011-2012NBA赛季的球员数据,该数据中共有四百位球员,取得分最多的前一百位球员,将其数据拷贝到Excel中,并将林同学的数据添加在最后,删除了所属球队和排名之后我们得到了一个CSV数据文件。数据中的变量说明附后。

第一步:我们先画出这些变量的相关系数图,以剔除一些冗余的变量,从下图可看到深兰色方块即表示两组数据间有较强正相关,那么我们只需取其中一组数据即可,例如TRB(篮板总数)就可以代替ORB/DRB/BUK。由此我们提取MP/FGA/FGP/X3PP/FT/FTP/TRB/AST/STL/PF/TOV/PTS这12个变量作进一步处理。

星期三, 二月 15, 2012

用ggplot2包绘制风向风速玫瑰图

风向风速玫瑰图(wind rose)是气象学家常用的图形工具,描述了在一个特定的地点,其风速和风向是如何分布的。风向风速图实际上是一种条形图的扩展,它使用网格化的极坐标系统,用不同的方位来汇集风向及其频数,频率最大的方位,表示该风向出现次数最多。并且还用不同的颜色带来区别风速的大小。在本例中我们首先使用ggplot2包来绘制如下的风向风速图,再用专门工具进行示例。

星期日, 一月 29, 2012

ggplot2绘图入门系列之五:时间序列(完)

ggplot2包也能对时间序列数据绘图,但在处理上需要有些注意的地方。下面我们以上证指数为例进行作图,首先利用quantmod包从yahoo数据源获取从1997年以来的数据,存于变量SSEC中,抽取收盘数字,然后分别提取时间数据和指数数值,绘图结果如下图。
library(quantmod)
library(ggplot2)
getSymbols('^SSEC',src='yahoo',from = '1997-01-01')
close <- (Cl(SSEC))
time <- index(close)
value <- as.vector(close)
p <- ggplot(data.frame(time,value),aes(time,value))
p + geom_line()

星期五, 一月 27, 2012

ggplot2绘图入门系列之四:再说散点图

前文中已初步介绍了散点图的绘制方法,本文介绍一些细节方面的参数设置。

1 色彩和形状的控制
数据特征不仅可以用坐标来表示,也可以用不同的色彩或形状来表示。仍以mpg数据集为例,所用到的变量有cty(城市中行驶距离),hwy(高速路行驶距离),displ(排量大小),year(生产年份)
library(ggplot2)
p <- ggplot(mpg, aes(cty, hwy))
p1 <- p + geom_point(aes(colour = factor(year),shape = factor(year), size = displ), alpha = 0.6, position = 'jitter')
print(p1)

星期四, 一月 19, 2012

ggplot2绘图入门系列之三:位置调整与条形图

位置调整(Position adjustments)是针对同一图层内元素的位置进行微调的方法。它包括五种设置,分别是stack、dodge、fill、identity、jitter。

我们用条形图来展示其用法,仍使用mpg数据集,其中用到的变量是class,即生产汽车的类型,以及year生产年份。下面的条形图是将各类型的汽车数量进行汇集,并以年份作为分组变量。我们首先载入扩展包,然后用频数表对数据进行大致的了解,最后绘制了四种条形图。
library(ggplot2)
with(mpg,table(class,year))
p <- ggplot(data=mpg,aes(x=class,fill=factor(year)))
p + geom_bar(position='dodge')
p + geom_bar(position='stack')
p + geom_bar(position='fill')
p + geom_bar(position='identity',alpha=0.3)
 

星期日, 一月 15, 2012

ggplot2绘图入门系列之二:图层控制与直方图

前文所述,ggplot2使用图层将各种图形元素逐步添加组合,从而形成最终结果。第一层必须是原始数据层,其中data参数控制数据来源,注意数据形式只能是数据框格式。aes参数控制了对哪些变量进行图形映射,以及映射方式,aes是Aesthetic的缩写。

下面我们来绘制一个直方图作为示例。数据集仍采取mpg,对hwy变量绘制直方图。首先加载了扩展包,然后用ggplot函数建立了第一层,hwy数据映射到X轴上;使用+号增加了第二层,即直方图对象层。此时p被视为一种层对象,使用summary函数可得到关于它的更多信息,print(p)命令即可进行绘图。

星期五, 一月 13, 2012

ggplot2绘图入门系列之一:导论

1 什么是ggplot2
ggplot2是用于绘图的R语言扩展包,其理念根植于《Grammar of Graphics》一书。它将绘图视为一种映射,即从数学空间映射到图形元素空间。例如将不同的数值映射到不同的色彩或透明度。该绘图包的特点在于并不去定义具体的图形(如直方图,散点图),而是定义各种底层组件(如线条、方块)来合成复杂的图形,这使它能以非常简洁的函数构建各类图形,而且默认条件下的绘图品质就能达到出版要求。

2 与lattice包的比较
ggplot2和lattice都属于高级的格点绘图包,初学R语言的朋友可能会在二者选择上有所疑惑。从各自特点上来看,lattice入门较容易,作图速度较快,图形函数种类较多,比如它可以进行三维绘图,而ggplot2就不能。ggplot2需要一段时间的学习,但当你跨过这个门槛之后,就能体会到它的简洁和优雅,而且ggplot2可以通过底层组件构造前所未有的图形,你所受到的限制只是你的想象力。