注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

云之南

风声,雨声,读书声,声声入耳;家事,国事,天下事,事事关心

 
 
 

日志

 
 
关于我

专业背景:计算机科学 研究方向与兴趣: JavaEE-Web软件开发, 生物信息学, 数据挖掘与机器学习, 智能信息系统 目前工作: 基因组, 转录组, NGS高通量数据分析, 生物数据挖掘, 植物系统发育和比较进化基因组学

网易考拉推荐

[转载]ggplot2绘图入门系列  

2014-02-19 12:27:25|  分类: R&Bioconductor |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |


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

1 什么是ggplot2

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


2 与lattice包的比较

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



建议两种绘图包都可以研究一下。如果时间紧张,需要在一两天之内为论文做一张图,那么推荐用lattice,如果时间充裕,推荐学习ggplot2。


3 基本概念

?图 层(Layer):如果你用过photoshop,那么对于图层一定不会陌生。一个图层好比是一张玻璃纸,包含有各种图形元素,你可以分别建立图层然后叠 放在一起,组合成图形的最终效果。图层可以允许用户一步步的构建图形,方便单独对图层进行修改、增加统计量、甚至改动数据。

?标度(Scale):标度是一种函数,它控制了数学空间到图形元素空间的映射。一组连续数据可以映射到X轴坐标,也可以映射到一组连续的渐变色彩。一组分类数据可以映射成为不同的形状,也可以映射成为不同的大小。

?坐标系统(Coordinate):坐标系统控制了图形的坐标轴并影响所有图形元素,最常用的是直角坐标轴,坐标轴可以进行变换以满足不同的需要,如对数坐标。其它可选的还有极坐标轴。

?位面(Facet):很多时候需要将数据按某种方法分组,分别进行绘图。位面就是控制分组绘图的方法和排列形式。


4 一个例子

下 面用ggplot2包内带的汽车测试数据(mpg)来举个例子,用到的三个变量分别是发动机容量(displ)、高速公路上的每加仑行驶里数(hwy)、 汽缸数目(cyl)。首先加载ggplot2包,然后用ggplot定义第一层即数据来源。其中aes参数非常关键,它将displ映射到X轴,将hwy 映射到Y轴,将cyl变为分类数据后映射为不同的颜色。然后使用+号添加了两个新的图层,第二层是加上了散点,第三层是加上了loess平滑曲线。

library(ggplot2)

p <- ggplot(data=mpg,aes(x=displ,y=hwy,colour=factor(cyl)))

p + geom_point() + geom_smooth()

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

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


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

library(ggplot2)

p <- ggplot(data = mpg,aes(x = hwy))

p <- p + geom_histogram()

summary(p)

data: manufacturer, model, displ, year, cyl, trans,

 drv, cty, hwy, fl, class [234x11]

mapping:  x = hwy

faceting: facet_grid(. ~ ., FALSE)

-----------------------------------

geom_histogram:

stat_bin:

position_stack: (width = NULL, height = NULL)

上 面的信息告诉我们,p对象含有两层,第一层数据层描述了变量和映射方式,第二层是直方图对象(geom_histogram),geom表示几何对象,它 是ggplot中重要的图层控制对象,因为它负责图形渲染的类型。geom_histogram是图形渲染类型的一种,其它类型可参见官网。


每个geom对象都需要有数据输入,数据可以从第一层中自动读取,也可以在aes参数中直接设置。而且每个geom还默认搭配某种统计变换(stat),geom_histogram的默认统计变换是stat_bin。它负责对数据进行分组计数。


下面我们尝试两种更为复杂的直方图,首先将数据按照year这个变量划分为两组,用不同的颜色绘制直方图,而且用频率而非计数来刻画Y轴,并添加密度曲线。

p <- ggplot(mpg,aes(hwy))

p + geom_histogram(position = 'identity',

   alpha=0.5,

   aes(y = ..density..,

   fill = factor(year))) +

   stat_density(geom = 'line',

   position = 'identity',

   aes(colour = factor(year)))

 

如果想将两个直方图分开绘制,也可以使用facet_grid参数,结果如下图所示。


另:在win系统中用ggplot2绘制直方图,其底部有难看的缺口。但在linux系统中正常,不知原因何在,望知情人士不吝赐教。


有 句口诀要牢记:每个geom中都内置了一个stat,每个stat中都内置了一个geom。呵呵,怎么理解呢?geom类基本上是展现数据的原始状况,但 有时候不是的,比如直方图,它是做了分组汇总的,所以直方图里头就有一种统计变换。那么stat类基本上是展现数据提炼后的状况,那么提炼后用什么方式展 现,就有一些选择,比如线条啊,点啊。比如回归线,它是一种stat,它内置的geom就是line。虽然geom和stat分工不同,但它们有紧密的联 系,而且有时候可以做同样的事情。


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)

 



 


 


 


可 以看到dodge方式是将不同年份的数据并列放置;stack方式是将不同年份数据堆叠放置,这也是geom_bar的默认处理方式;fill方式和 stack类似,但Y轴不再是计数,而是以百分比显示;identity方式是不做任何改变直接显示出来,所以需要设置透明度才能看得清楚。


geom_bar是绘制条状几何对象,所以也可以用不经汇集的原始数据进行绘图。下面我们用2001到2010年间的美国GDP增长率举个例子。

y=c(1.1,1.8,2.5,3.6,3.1,2.7,1.9,-0.1,-3.5,3.0)

x=2001:2010

data=data.frame(x,y)

p=ggplot(data,aes(x,y,fill=y))

p+geom_bar(stat="identity")+

   geom_abline(intercept = 0, slope = 0,size=1,colour='gray')+

   geom_text(aes(label=y),hjust=0.5, vjust=-0.5 )+

   scale_y_continuous(limits=c(-3.8,4.2))+

   labs(x='年份', y='GDP增长率%')+

   opts(title = "美国GDP增长率")


 

你好,table是一个生成二维频率表的函数,它会自动为落在两个变量中的样本计数。为了能直接操作data.frame中的变量,所以需要用到with函数,如果不用with的话,可以这么弄:table(mpgclass,mpgyear)


提取中的表格是一种table格式,你可以通过class函数来了解任何一个对象的属性。




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)

 

我们将1999年生产车型用红色圆形表示,2008年用兰色三角形表示,排量用图形的大小表示,并且设置了透明度和jitter以避免样本点之间的重叠。可观察到2008年生产的大排量车型较多,从而油耗较高,单位油耗行驶距离较短。


2 坐标的控制

上图右上角数据点较为稀疏,这种情况下可用对数变换。为了演示ggplot2对图形坐标的控制,我们对X轴和Y轴均进行对数变换,然后对X轴的坐标显示加以限制,只显示X轴数据的均值,以及一倍标准差的坐标。

cty.mean=with(mpg,mean(cty))

cty.sd=with(mpg,sd(cty))

p1 + scale_x_continuous(trans='log',breaks=c(cty.mean-cty.sd,cty.mean,cty.mean+cty.sd), labels=c("high", "mean", "low")) + scale_y_continuous(trans='log')


 


3 文字说明

利用geom_text函数可添加文字说明以增强图形的可读性

p <- ggplot(mtcars, aes(x=wt, y=mpg,colour=factor(cyl),label=rownames(mtcars)))

p + geom_text(hjust=0,vjust=-1,alpha=0.8)+ geom_point(size=3,aes(shape=factor(cyl)))


 


4 矩阵散点图

ggplot2包中也提供了矩阵散点图函数

plotmatrix(USArrests)+geom_smooth()


 



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

ggplot2包也能对时间序列数据绘图,但在处理上需要有些注意的地方。下面我们以上证指数为例进行作图,首先利用quantmod包从yahoo数据源获取从1997年以来的数据,存于变量SSEC中,抽取收盘数字,然后分别提取时间数据和指数数值,绘图结果如下图。

library(quantmod)

library(ggplot2)

getSymbols('^SSEC',src='http://fhqdddddd.blog.163.com/blog/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()

 


我们希望能够在图中加入一些其它的说明元素,以丰富视图中所包含的信息。这些信息包括用不同的颜色区块来表示“江核心”和“胡核心”的执政时期,以及对中国证券市场的若干大事件进行标注。最后的代码和结果如下。

yrng <- range(value)

xrng <- range(time)

data <- data.frame(start=as.Date(c('1997-01-01','2003-01-01')),end=as.Date(c('2002-12-30','2012-01-20')),core=c('jiang','hu'))

timepoint <- as.Date(c('1999-07-02','2001-07-26','2005-04-29','2008-01-10','2010-03-31'))

events <- c('证券法实施','国有股减持','股权分置改革','次贷危机爆发','融资融券试点')

data2 <- data.frame(timepoint,events,stock=value[time %in% timepoint])



p + geom_line()

 + geom_rect(aes(NULL,NULL,xmin = start, xmax = end, fill = core),ymin = yrng[1],ymax=yrng[2],data = data)

 + scale_fill_manual(values = alpha(c('blue','red'),0.2))

 + geom_text(aes(timepoint, stock, label = events),data = data2,vjust = -2,size = 5)

 + geom_point(aes(timepoint, stock),data = data2,size = 5,colour = alpha('red',0.5))




本文引用地址:http://blog.sciencenet.cn/blog-252888-719651.html

另一个:

http://ygc.name/stats/ggplot2.html

Why use ggplot2

ggplot2是我见过最human friendly的画图软件,这得益于Leland Wilkinson在他的著作《The Grammar of Graphics》中提出了一套图形语法,把图形元素抽象成可以自由组合的成分,Hadley Wickham把这套想法在R中实现。

为什么要学习ggplot2,可以参考ggplot2: 数据分析与图形艺术序言

ggplot2基本要素

  • 数据(Data)和映射(Mapping)
  • 几何对象(Geometric)
  • 标尺(Scale)
  • 统计变换(Statistics)
  • 坐标系统(Coordinante)
  • 图层(Layer)
  • 分面(Facet)
  • 主题(Theme)
  评论这张
 
阅读(1285)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017