qplot()的局限在于它只能使用一个数据集和一组图形映射,解决这个问题的办法就是使用图层。每个图层可以有自己的数据集和图形属性映射,附加的数据元素可以通过图层添加到图形中。
本文主要对图层、几何对象、统计变换和位置调整的工作方式作一些技术说明:如何对它们进行调用和自定义。
在qqplot2语法莉,一个图层至少包含五个组成部分:
当我们调用qplot()时,该函数其实帮我们做了很多幕后的工作:创建一个图形对象,添加图层并且展示结果。在整个过程中它使用了很多默认的绘图参数。如果你希望手动创建图形对象,那就要使用到ggplot()函数,ggplot()主要有数据和图形属性映射两个默认参数,使用者只有在图层里设定新的参数,默认值才能够被修改。参数数据指的是绘图需要用到的数据集,格式必须是数据框(data.frame)格式。参数映射只需要将图形属性、变量名放到aes()内即可。
p<-ggplot(diamonds,aes(carat,price,colour=cut))
这个图形对象在加上图层之前无法显示,因此什么也看不见。
最简单的图层一般只设置一个图形对象,这是数据可视化的一种方法。如果给图层添加一个点的几何对象(point geom),就可以得到一个散点图。
p<-p+layer(geom=‘point’)
注意这里使用了+来添加图层,该图层使用了默认的数据以及映射,并且选择了另外两个默认参数,统计变换和位置调整。 下面的图层设定列出了更多的参数:
layer(geom,geom_params,stat,stat_params,data,mapping,position)
下面给出一个更复杂的代码:
p<-ggplot(diamonds,aes(x=carat))
p<-p+layer(
geom=“bar”,
params=list(fill=“steelblue”,binwidth=2),
stat=“bin”,
position = ‘identity’
)
p
上述代码过于繁琐。事实上我们可以通过快捷函数来简化上述代码。因为每一个几何对象都对应着一个默认的统计变换和位置参数,而每一个统计变换都对应着一个默认的几何参数。所以对于一个图层,我们只需要设定stat或者geom即可。 下面这段代码将会生成于上述相同效果的图形:
p<-ggplot(diamonds,aes(x=carat)) + geom_histogram(binwidth=2,fill=“steelblue”)
所以这类函数都有相同的形式——以geom_或者stat_开头
geom_XXXX(mapping,data,…,stat,position)
stat_XXXX(mapping,data,…,geom,position)
它们的参数定义了图层的各个组件:
mapping, 一组图形的属性映射,通过aes()函数来设定;
data, 一个数据集,它可以修改默认的数据集,如果该参数被省略,那么默认数据集就会被使用;
…, geom或者stat参数,例如直方图的组距(binwidth)或者loss函数的带宽(bandwidth)
geom\stat,我们可以修改geom值或者stat值。它是一窜字符串,包含将要使用的几何对象或者统计变量的名称。使用默认值将会得到标准图形。
position, 选择一种调整对象重合的方式
ggplot2对数据集的要求很简单:必须是一个data.frame。ggplot2会从给定的数据框里提取出绘图所需的变量,并生成一个新的数据集,而非在原有数据集上进行数据变换,关于数据变换,可以考虑plyr,reshape两个包。因为保持数据集要比保存多个变量要有用的多,所以无论是别人发送的数据还是重复运行自己的代码,数据框都会非常方便。
ggplot这种限制也方便我们使用相同代码,不同数据集进行绘图。我们只需要改变数据集即可,比如用**%+%来添加新的数据集以代替老的数据集(不直接食用+的原因是因为R语言限制不能直接对数据集直接用+**)。
p <-ggplot(mtcars,aes(mpg,wt,colour=cyl))+geom_point()
p
mtcars <- transform(mtcars,mpg=mpg^2)
p %+% mtcars
更改数据时,可以任意改变他的值和维数,但是如果一个变量从离散型变成连续型或者从连续型变成离散型,那么就需要改变相应的标度。
ggplot2的数据是以副本而不是引用的形式存储的。这样做有两个好处:一、如果数据改变了,图形也不会改变;二、ggplot2都是自含型的,所以它们可以被存储在(save())磁盘上,并且之后可以直接被加载运行(load())。
aes()函数用来将数据变量映射到图形中,从而使变量变成可以被感知的图形。aes()函数有一系列的参数:
aes(x=weight,y=height,colour=age)
这里我们将X映射到weight,将Y映射到height,将颜色映射到age。 注意最好不要用非数据集以外的变量(diamonds$carat),因为这样无法将数据dou封装到一个对象里。
aes(x=weight,y=height,colour=aqrt(age))
注意也可以使用变量的函数值作为参数。
每个aes()里的变量都将包含于数据集中,这是保证ggplot2对象都是自含型的重要方式之一,这样方便存储和重复使用。
5.1 图和图层
ggplot2默认的图形属性设定可以在图形对象初始化时设定,也可以之后用**+** 来修改。
p <-ggplot(mtcars)
p <-p+aes(wt,hp)
5.2 设定和映射
除了可以将一个图形映射到一个遍变量,也可以在图层参数里设定一个单一值(如colour=“red”)。图形属性可以更具观测的不同而变化,但是参数则不行,下面的例子用图层的colour参数设定点的颜色:
p <- ggplot(mtcars,aes(mpg,wt))+geom_point(colour=“darkblue”)
p <- ggplot(mtcars,aes(mpg,wt))+geom_point(aes(colour=“darkblue”) )
这里将colour映射到“darkblue”颜色,实际上是先创建了一个只含有“darkblue”字符的变量,然后将colour映射到新的变量上。因为这个新变量的值是离散的,所以默认的眼色标度将用色轮上等距的颜色,并且此处新变量只有一值,因此这个颜色是桃红色的。
几何对象,简称为geom,它执行着图层的实际渲染,控制生成图像类型。例如用点几何对象(point geom)生成散点图,用线几何对象(line geom)生成折线图。
每个几何对象都有一组它能识别的图形属性和一组绘图所需的值。例如,一个点含有颜色、大小、形状等属性,以及坐标x、y的位置。一个条形几何对象包含高度和条宽、边界颜色等图像属性。
每个几何对象都有一个统计变换,并且每个统计变换都有一个默认的几何对象。例如封箱(bin)统计变换默认使用条形图(bar geom)来绘制直方图。
统计变换简称stat ,即对数据进行统计变换,它通常以某种方式对数据进行汇总。例如,平滑(smoother)是一个很有用的统计变换,它能在一些条件约束的限制下计算给定x的y的平均值。为了阐明统计变换在图形中的意义,一个统计变换必须是一个位置尺度不变量,即f(x+a)=f(x)+a 并且f(b*x)=b*f(x)。这样才能保证改变图形标度时,数据变换保持不变。
统计变化可以将输入数据集当作输入,将返回的数据集当做输出,因此通缉变换可以向原数据集中插入新的变量。例如,常用来绘制直方图的stat_bin统计变换后会生成如下几种变量:
count,每个组里观测值的数目
density,每个组里观测值的密度
X,组的中心位置
这些生成变量可以被直接调用。例如直方图一般将条形图的高度赋值为观测值的频数,如果你喜欢更传统的直方图,也可以用密度来代替:
ggplot(diamond,aes(carat))+geom_histogram(aes(y=…density…),binwidth=0.1)
生成的变量名必须要用…围起来。这样可以防止原始数据集和生成变量重名时造成混淆,并且以后处理代码时你可以很清晰的分辨出哪些变量是由统计变换生成的。每个统计变换的文档里都列出了其生成变量名的名词。
所谓位置调整,就是对图层中的位置进行微调。位置调整一般多见于离散型数据,连续数据很少出现完全重叠问题,当出现这类问题时,即使微调,通常也无法解决。 下表列出了ggplot中可用的位置调整参数。
几种常见的位置调整示例:
更多内容,关注R友舍微信号