Skip to content

Instantly share code, notes, and snippets.

@xccds
Created May 22, 2012 21:36
Show Gist options
  • Save xccds/2771760 to your computer and use it in GitHub Desktop.
Save xccds/2771760 to your computer and use it in GitHub Desktop.
\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
Copy link

yihui commented May 23, 2012

嗯,这个示例文档非常好!

我注意到你一直在重复使用message=FALSE, tidy=FALSE, fig.align="center",其实你可以把它们作为全局选项设置,就不必在每个代码段中都设置了。例如把这段代码放在\begin{document}之后:

<<setup, include=FALSE>>=
opts_chunk$set(message=FALSE, tidy=FALSE, fig.align="center")
@

很高兴看见knitr在Windows下的中文文档竟然可以顺利编译出来,不过你的代码中都没有中文,所以关系不大,否则就麻烦了。

@Aijnauyus
Copy link

Yihui,请问用knitr怎么把html转成pdf? 谢谢

@Tlexander
Copy link

Latex Error: File 'cetexart.cls' not found

what's wrong with it?

@xwydq
Copy link

xwydq commented Jan 2, 2014

代码中出现中文后不显示或者显示乱码到底如何解决啊

@JackieMium
Copy link

现在貌似编不出来了?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment