Created
May 22, 2012 21:36
-
-
Save xccds/2771760 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
\documentclass[UTF8,10pt]{ctexart} | |
\usepackage[a4paper,%%textwidth=129mm,textheight=185mm, %%193-8 | |
text={160mm,260mm},centering]{geometry} | |
\pagestyle{empty} | |
\begin{document} | |
\title{用散点图示范ggplot2的核心概念} | |
\author{肖凯} | |
\maketitle | |
\abstract{ | |
本文稿是第五届R语言会议演讲内容的一部分,试图用散点图示例来说明ggplot2包的核心概念,以方便初学者快速上手。同时这也是笔者应用knitr包的一个练习。该示例所用数据是ggplot2包内带的mpg数据集。} | |
\section{Data和Mapping} | |
<<fig.width=5, fig.height=3, message=FALSE, tidy=FALSE, fig.align="center">>= | |
library(ggplot2) | |
p <- ggplot(data=mpg,mapping=aes(x=cty,y=hwy)) | |
p + geom_point() | |
@ | |
\textbf{ggplot}函数是用来构建基本的图形对象,相当于是一张空白的画布。其中我们需要定义可视化的数据对象(Data),以及数据变量到图形属性之间的映射(Mapping)。在上面的图形里, 我们使用了mpg数据框,并将cty变量映射到X轴,hwy映射到Y轴。 | |
\section{几何对象Geom} | |
只有画布是不够的,还需要定义用什么样的图形来表现数据。geom代表我们能在图中实际看到的图形元素,如点、线、多边形等。在上图我们使用了point这种几何对象来展现数据,这样就画出了散点图。我们还可以用summary函数来观察图形对象的内部数据。 | |
<<tidy=FALSE>>= | |
summary(p + geom_point()) | |
@ | |
数据不仅可以映射到数轴上,我们还可以将年份变量映射为颜色属性。 | |
<<fig.width=5, fig.height=3, message=FALSE, tidy=FALSE, fig.align="center">>= | |
p <- ggplot(data=mpg,mapping=aes(x=cty,y=hwy,colour=factor(year))) | |
p + geom_point() | |
@ | |
\section{统计变换Stat} | |
统计变换是对原始数据进行了某种提炼或归纳。散点图没有经过统计变换,它展现了数据的原貌。但有时候我们需要提炼后数据,例如下图的平滑曲线就是一种统计变换,它去除了数据的原貌。 | |
<<fig.width=5, fig.height=3, message=FALSE, tidy=FALSE, fig.align="center">>= | |
p <- ggplot(data=mpg,mapping=aes(x=cty,y=hwy,colour=factor(year))) | |
p + stat_smooth() | |
@ | |
你或许会奇怪为什么会有两条平滑曲线,那是因为我们在底层画布定义了颜色属性的映射,底层的设置会影响到所有在其基础上的几何对象和统计变换。 | |
\section{图层Layer} | |
我们可以将上面的散点和平滑线合并起来,如果只需要一条平滑,就需要在平滑函数中单独设置映射。 | |
<<fig.width=5, fig.height=3, message=FALSE, tidy=FALSE, fig.align="center">>= | |
p <- ggplot(data=mpg,mapping=aes(x=cty,y=hwy)) | |
p + geom_point(aes(colour=factor(year))) + stat_smooth() | |
@ | |
下面的命令和之前的是等价的。 | |
<<fig.keep='none' ,fig.width=5, fig.height=3, message=FALSE, tidy=FALSE, fig.align="center">>= | |
p <- ggplot() | |
d <- p + geom_point(data=mpg, mapping=aes(x=cty,y=hwy,colour=factor(year))) + | |
stat_smooth(data=mpg, mapping=aes(x=cty,y=hwy)) | |
print(d) | |
@ | |
这时我们可以引入图层的概念了,一个图层好比是一张玻璃纸,包含有各种图形元素,你可以分别建立图层然后叠放在一起,组合成图形的最终效果。图层可以允许用户一步步的构建图形,方便单独对图层进行修改、增加统计量、甚至改动数据。 | |
如果我们观察d对象中的信息,会发现一些有趣的东西。这里除了底层画布之外,有两个图层,分别是几何对象散点和统计变换平滑线。仔细观察会发现几何对象层中有一个默认为空的统计变换stat,而统计变换层中也有一个默认的geom,毕竟提炼后的数据也需要一种几何图形来展现。 | |
<<>>= | |
summary(d) | |
@ | |
\section{标度Scale} | |
映射只负责将变量关联到某个图形属性,但并不负责具体的取值。例如Mapping参数将年份变量映射到颜色属性,但具体哪一年用哪种颜色显示,它并不管。谁来管呢?由标度来控制。通常用户可以不用去关注标度,ggplot2系统会自动处理细节,但当用户想干预的时候,就可以出手。如果我们不满意之前的颜色,可以用下面的标度函数设置需要的色彩。 | |
<<fig.width=5, fig.height=3, message=FALSE, tidy=FALSE, fig.align="center">>= | |
p <- ggplot(data=mpg,mapping=aes(x=cty,y=hwy)) | |
p + geom_point(aes(colour=factor(year)))+ | |
scale_color_manual(values =c('blue2','red4'))+ | |
stat_smooth() | |
@ | |
\section{分面Facet} | |
条件绘图是将数据按某种方式分组后分别绘图。分面就是控制条件绘图的方法和排列形式。下图就是将数据按年份变量分组后绘图。这只需要增加一行简单的代码,从中可以看到ggplot的威力在于可以逐步的修改、完善图形。 | |
<<fig.width=5, fig.height=3, message=FALSE, tidy=FALSE, fig.align="center">>= | |
p <- ggplot(data=mpg,mapping=aes(x=cty,y=hwy)) | |
p + geom_point(aes(colour=factor(year)))+ | |
scale_color_manual(values =c('blue2','red4'))+ | |
stat_smooth()+ | |
facet_wrap(~ year,ncol=1) | |
@ | |
\section{最后的调整} | |
下面我们要对图形精细调整,首先用透明度和扰动解决上图中点的重叠问题,此外还要将排量映射为点的大小。最后增加图名和图例名称。 | |
<<fig.width=6, fig.height=6, message=FALSE, tidy=FALSE, fig.align="center">>= | |
p <- ggplot(data=mpg,mapping=aes(x=cty,y=hwy)) | |
p + geom_point(aes(colour=class,size=displ), alpha=0.5,position = "jitter")+ | |
stat_smooth()+ | |
facet_wrap(~ year,ncol=1)+ | |
opts(title='fuel economy of car')+ | |
labs(y='highway miles per gallon', | |
x='city miles per gallon') | |
@ | |
ggplot2中几个重要的核心概念都已经涉及到了,还有坐标系统和位置调整没有提到。希望这篇短文对你有用,由此进入ggplot2的世界,领略数据可视化的力与美。各位也可访问我的博客作进一步的交流。xccds1977.blogspot.com(需翻墙),或是给我发电邮xccds1977@gmail.com。 | |
\end{document} |
Yihui,请问用knitr怎么把html转成pdf? 谢谢
Latex Error: File 'cetexart.cls' not found
what's wrong with it?
代码中出现中文后不显示或者显示乱码到底如何解决啊
现在貌似编不出来了?
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
嗯,这个示例文档非常好!
我注意到你一直在重复使用
message=FALSE, tidy=FALSE, fig.align="center"
,其实你可以把它们作为全局选项设置,就不必在每个代码段中都设置了。例如把这段代码放在\begin{document}
之后:很高兴看见knitr在Windows下的中文文档竟然可以顺利编译出来,不过你的代码中都没有中文,所以关系不大,否则就麻烦了。