您好,欢迎访问三七文档
PRESENTEDBY:JensenKINDOJan20,2015数据可视化是数据分析中个一个很重要的环节,也是一项很重要的能力。大家都知道R的绘图能力很强大,而其强大的绘图能力来源于一个很重要的包——ggplot2.本次课程将简要介绍ggplot2的绘图语法以及应用,希望对大家有所帮助。ggplot2采用了图层的设计方式,用户可以从原始图层开始,首先绘制原始数据,然后不断地添加图形注释和统计汇总结果。这种绘图方式与分析问题中的结构化思维是一致的。所以我们首先来学习图形语法。最基础的部分是如何将你想要可视化的数据以及一系列数据中的变量对应到图形属性的映射。几何对象(geom)代表你在图中实际看到的图形元素,如点、线、多边形等;统计变换(stats)是对数据进行的某种汇总。例如,将数据分组技术以创建直方图,或将一个二维的关系用线性模型进行解释。统计变换是可选的,但通常非常有用。标度(scale)的作用是将数据的取值映射到图形空间,例如用颜色、大小或形状来表示不同的取值。展现标度的常见做法是绘制图例和坐标轴————它们实际上是从图形到数据的一个映射。坐标系(coord)描述了数据是如何映射到图形所在的平面的,它同时提供看图所需的坐标轴和网格线。我们通常使用的是笛卡尔坐标系,但也可以将其变换为其他类型,如极坐标和地图投影。分面(facet)描述了如何将数据分解为各个子集,以及对子集作图并联合进行展示。上面这么一大段概念的表述可能让很多朋友有点头晕,那我们就以具体实例来具体解释这些图形语法。首先介绍我们的数据集:diamonds数据集包含了约54000颗钻石的价格和质量的信息,数据存放在ggplot2软件包中,大家安装ggplot2后即可打开该数据集。这组数据涵盖了反映钻石质量的四个“C”——克拉重量(carat)、切工(cut)、颜色(color)和净度(clarity),以及五个物理指标——深度(depth)、钻面宽度(table),x,y和z.原始数据样本量太大,我们从中随机选取200份数据作为自此课程的试验数据。set.seed(2015)dsmall-diamonds[sample(nrow(diamonds),200),]qplot(carat,price,data=diamonds)这是一句很简单的代码,我们做出了钻石克拉和钻石价格的散点图。从散点图中可以看出变量之间有很强的相关关系,这种相关关系似乎是指数型的,所以我们需要对变量进行变换。qplot(log(carat),log(price),data=diamonds,color=color)可以发现,经对数变换后,散点图基本成线性趋势。但是值得注意的是图中的元素有很大的重叠,所以不可冒然下结论l如何向图中添加钻石的颜色和切工信息呢?我们只掉颜色、大小、形状都是图形属性,而每一个图形属性都可以对应一个标度函数。于是我们可以把颜色信息映射到点的颜色上,把切工信息映射到点的形状上。qplot(carat,price,data=dsmall,colour=color)qplot(carat,price,data=dsmall,shape=cut)当然我们可以用函数I()来手动设定图形属性,比如我们想让点的颜色为红色,可以使用colour=I(‘red’)。有时候数据量很大,元素重叠较多,我们可以使用alpha图形属性,其取值从0(完全透明)变动到1(完全不透明)。通常透明度可以用分数表示,很显然分母越大,图像越透明。qplot(carat,price,data=diamonds,alpha=I(1/10))qplot(carat,price,data=diamonds,alpha=I(1/50))qplot(carat,price,data=diamonds,alpha=I(1/500))前面我们都是以散点图为实例,可是很多情况下我们却要使用平滑曲线拟合,要使用箱图,这种情况下我们该怎么做?幸运的是,ggplot2包各我们提供了很简单的方法——几何对象。当我们要做散点图时,只需要将几何对象指定为‘point’;当我们只需加上‘smooth’,更神奇的是我们还可以添加曲线的标准误;当我们将几何对象指定为‘boxplot’可以绘制箱图。下面以具体实例展现:qplot(carat,price,data=dsmall,geom=c('point','smooth'))当数据量较小时method=‘loess’是默认选项,使用的是局部回归的方法。曲线的平滑程度可以用span参数控制,其取值范围从0(很不平滑)到1(很平滑)。qplot(carat,price,data=dsmall,geom=c('point','smooth'),span=0.2)qplot(carat,price,data=dsmall,geom=c('point','smooth'),span=1)我们可以调用mgcv包来拟合一个广义相加模型,具体方法是使用methond=‘gam’,formula=y~s(x)。对于数据量超过1000时使用该公式:y~s(x,bs=‘cs’)。qplot(carat,price,data=diamonds,geom=c('point','smooth'),method='gam',formula=y~s(x))qplot(carat,price,data=diamonds,geom=c('point','smooth'),method='gam',formula=y~s(x,bs='cs'))前面我们讲了如何将图形属性映射到图像上,有时候我们在作图时会有这样的需求,比如我们想知道不同颜色钻石重量的情况,这时我们就需要分面。qplot()中默认的分面方法是将图形拆分为若干个窗格,这可以通过如row_var~col_var的表达式进行指定。我们可以指定任意数量的行变量和列变量,但如果当变量数超过两个时,生成的图形可能会非常大,以至于不适合在屏幕上展示。如果只想指定一行或一列,可以使用.作为占位符,例如row_var~.会创建一个单列多行的图形矩阵。此图展示的是不同颜色钻石重量的分布直方图,纵坐标是样本量的大小,如果想让纵坐标为样本频率,可以使用以下语句qplot(carat,..density..,data=diamonds,facets=color~.,geom='histogram',binwith=0.1,xlim=c(0,3))qplot(carat,data=diamonds,facets=color~.,geom='histogram',binwidth=0.1)一个图中应该包含:1.xlim,ylim:设置x轴和y轴的显示区间。2.main:图形的主标题。3.xlab,ylab:设置x轴和y轴的标签。以实际例子来展示一下。qplot(carat,price/carat,data=dsmall,ylab=expression(frac(price,carat)),xlab='Weight(carats)',main='Smalldiamonds',xlim=c(.2,1))在了解了qplot用法后,我们开始学习ggplot2的绘图语法。首先需要了解的概念有:1.几何对象(geom):点(point)、条形(bar)、箱子(boxplot)、线(line)2.标度变换:比如讲钻石的颜色数据转换为电脑可以识别的物理单位。运用ggplot()函数绘制图像时有两个主要的参数:数据和图形属性映射。这两个参数被设为绘图的默认参数,只有在新添加的图层里设定了新参数时,默认值才会被修改。参数指定绘图所用的默认数据集(必须是数据框),只需要将图形属性和变量名放到函数aes()的括号里面即可。比如我们需要将carat作为x,将price作为y,cut作为colour,语句如下:p-ggplot(diamonds,aes(carat,price,colour=cut))这段代码运行后什么也看不见,不会产生图像,因为我们没有添加图层。最简易的图层是只设定一个几何对象,如果给图形对象添加一个几何对象(point)就会得到一个散点图。p-p+layer(geom=point)现在看一段稍微复杂的代码p-ggplot(diamonds,aes(x=carat))p-p+layer(geom=bar,geom_params=list(fill=steelblue),stat=bin,stat_params=list(binwidth=2))这段代码对图层的设定非常细致但是过于繁琐,由于每个几何对象都对应着一个默认的几何对象参数,所以对于一个图层我们只需要设定stat或geom参数即可。下面的代码将生成和左边一样的图层。geom_histogram(binwidth=2,fill=steelblue)ggplot2对数据的要求很简单,必须是一个数据框。Ggplot2会从我们给定的数据框中提取绘图所需要的变量,并生成一个新的数据集,而不是直接在原始数据上进行数据变换。这样做的好处是我们可以很方便的使用相同的代码、不同的数据集绘图——只需要改变数据集即可。用%+%来添加新的数据集以代替原来的数据集。p-ggplot(dsmall,aes(carat,price,colour=color))+geom_point()pdsmall-transform(dsmall,carat=carat^2)p%+%dsmall前面我们已经讲过可以通过aes来设置参数,比如要把carat当作x,price当作y,只需要aes(carat,price)。但是我们要注意区分设定和映射的区别。下面两句代码回会画出什么样的图形呢?p-ggplot(diamonds,aes(carat,price))p+geom_point(colour=darkblue)p+geom_point(aes(colour=darkblue))之所以会出现这样的画面是因为p+geom_point(colour=darkblue)将颜色设定为深深蓝色,而第二句p+geom_point(aes(colour=“darkblue”))是将colour映射到‘darkblue’颜色。实际上是先创建了一个只含有‘darkblue’字符型的变量,然后将colour映射到这个新变量。因为这个新变量的值是离散性的,所以默认的颜色标度将用色轮上等间距的颜色,并且此处新变量只有一个值,因此这个颜色就是桃红色。分组在ggplot2里,几何对象可以大致分为个体几何对象和群组几何对象两大类。个体几何对象对数据框的每一条数据绘制一个可以区别于其他个体的图形对象。例如,点几何对象用点来表示每一条观测。相反地,群组几何对象用来表示多条观测,它们可以是某个统计摘要的一个结果,或者是几何对象的基础展示,例如多边形。线条和路径介于这两者之间:每条线多由许多段组成,而每条线段又代表两个点。如何控制哪些观测用那种图形元素,这就是分组(group)图形属性的工作。先介绍我们下面要使用的数据集,我们将使用nlme包里的Oxboys数据集,该数据记录了26名男孩(Subject)在不同时期(Occasion)所测定的身高(height)和中心化后的年龄(age).部分数据见右表。比如我们得到每个男孩的生长轨迹,我们需要按每个男孩分组。p-ggplot(Oxboys,aes(age,height,group=Subject))+geom_line()左边的图是一副时间序列图,每条线代表一个男孩。通过此图可以看到每个男孩成长轨迹,但是不能识别哪个男孩是哪条轨迹。修改默认分组。如果图像中含有离散性变量,而我们却想绘制连接所有分组的线条。在此例中Occasion是一个离散性变量,所以默认分组变量就是Occasion。要在此基础上添加个体轨迹,我们需要用aes(group=Subject)修改第一层的默认分组。boysbox
本文标题:ggplot2
链接地址:https://www.777doc.com/doc-6282852 .html