ggplot2学习笔记之构建图层


传统的画图函数(如plot、qplot)就好比在一张画布上画图,画好之后不能修改,而且只能使用一个数据集;而图层的思想是在多张透明的画布上绘图,再把这些画布按顺序叠加在一起形成一个完整的图形。每一张画布都可以使用不同数据集,可以单独对每一个图层进行修改,需要到哪些图层就画哪些图层。

创建绘图对象

在用 ggpot()绘制时,需先创建绘图对象,也就是第一个图层,它包含两个参数(数据与图形属性映射)。 这两个参数是绘制图形的默认参数,如果后面图层中没有重新设定新参数,那么它会自动调用绘图对象中的参数;如果重新设定了参数则不会使用默认的参数,参数在2.1 中有详细说明。

ggplot(data, aes(x, y, <other aesthetics>))

图层的作用是在图像上生成可以被人感知的对象。一个图层有4 个部分组成:

  • 数据和图形属性映射;
  • 一种统计变换;
  • 一种几何对象;
  • 一种位置调整方式。

图层的具体函数如下:

geom_XXX(mapping, data, …, stat, position)
stat_XXX(mapping, data, …, geom, position)
  • mapping(可选):一组图形属性映射,通过aes()函数来设定;
  • data(可选):数据框。如果不设定该参数,则会调用绘图对象中的默认数据集。
  • 注意:在绘图对象ggplot()与图层中,mapping 与data 的位置是相反的;
  • :geom 或者 stat 的参数。可以是用图形属性作为参数,这样该属性就被设定为固定的一个值,而不是被映射给数据集中的一个变量;

  • geom 或stat(可选):我们可以修改geom 默认的stat 值,或者stat 默认的geom值。它们是一组字符串,包含了将要使用的几何对象或者统计变换的名称。

  • position(可选):选择一种调整对象重合的方式。


数据与图层映射

  • data 是数据集,数据类型必须是数据框,可选;
  • aes()函数用来将数据变量映射到图形中,从而使变量成为可以被感知的图形属性;
  • x、y 是映射到x、y 轴上的变量。

对于已经创建好的绘图对象,可以进行以下操作,以达到添加、修改、删除图形映射属性的效果。例如:

p <- ggplot(mtcars, aes(x=mpg,y=wt))
操作 结果
p + aes(colour = cyl) 添加colour 属性映射
p + aes(y = disp) 修改y 轴映射属性
p + aes(y = NULL) 删除 y 轴的映射属性

图层可以添加到 ggplot()与 qplot()创建的图形对象上。实际上 qplot()绘图原理是先创建绘图对象再添加图层,而相比于 ggplot(),只能针对于一个数据集。
图层之间用“+”连接,第一个图层是绘图对象,单独运行绘图对象是不会显示出图形的,必须加上图层才会显示。绘图对象可以储存到一个变量中,用 summary 函数可以查看绘图对象中参数的信息。

p <- ggplot(dsmall, aes(carat, price))
p + geom_point()

在p + geom_point()中,geom 是几何对象,point 是点,表示要绘制散点图,括号里的参数都是缺省的,所以它调用了 p 中的默认参数。

p + geom_point() + geom_smooth()

ggplot(dsmall, aes(x = carat, y = price, colour = cut)) + geom_line()

这里写图片描述
除了可以将变量映射到图形属性中之外,也可以将图形属性设定为单一的值(如colour =‘red’)。

p <- ggplot(mtcars, aes(mpg, wt))
p + geom_point(aes(colour = 'red'))

这里写图片描述

使用分组绘图,可以将数据按照某个变量分组并以相同的方式渲染。但是从绘制的图形中只能区分出不同个体,而不能识别出哪个个体。例如:在下列代码中,按变量cut分组绘制出出五条曲线,你虽然可以区别出五条不同曲线的属性特征,但你无法识别出那一条线属于变量cut 中哪一个值的。

ggplot(dsmall, aes(carat, price, group = cut)) + geom_line()

这里写图片描述
把变量cut 映射到colour 属性上,同样也能达到分组绘图的目的,并且生成一个图例,各条线都用不同颜色反映。

ggplot(dsmall, aes(carat, price, colour = cut)) + geom_line()

这里写图片描述
运用interaction()函数可以组合两个变量,同时对两个变量分组绘图。

ggplot(dsmall, aes(carat, price, group = interaction(cut, color))) + geom_line()

这里写图片描述

几何对象

名称 描述
abline 线,由斜率与截距决定
area 面积图(area plot)
bar 条形图,以 x 轴为底的矩形
bin2d 二维热图
blank 空白,什么也不画
boxplot 箱线图
contour 等高线图
crossbar 带有水平中心线的盒子图
density 光滑密度曲线图
density2d 二维密度等高线图
dotplot “点直方图”,用点来表示观测值的个数
errorbar 误差棒
errorbarh 水平的误差棒
freqpoly 频率多边形图
hex 用六边形表示的二维热图
histogram 直方图
hline 水平线
jitter 给点添加扰动,减轻图形重叠问题
line 按照 x 坐标的大小顺序依次连接各个观测值
linerange 一条代表一个区间的竖直线
map 基准地图里的多边形
path 按数据的原始顺序连接各个观测值
point 点,绘制散点图
pointrange 用一条中间带点的竖直线代表一个区间
polygon 多边形,相当于一个有填充的路径
quantile 添加分位数回归线
raster 高效的矩形瓦片图
rect 二维的矩形图
ribbon 色带图,连续的 x 值所对应的 y 的范围
rug 边际地毯图
segment 添加线段或箭头
smooth 添加光滑的条件均值线
step 以阶梯形式连接各个观测值
text 文本注释
tile 瓦片图
violin 小提琴图
vline 竖直图


默认的统计变换(stat)和图形属性

名称 默认的统计变换 图形属性
abline abline colour, linetype, size
area identity colour, fill, linetype, size, x, y
bar bin colour, fill, linetype, size, weight, x
bin2d bin2d colour, fill, linetype, size, weight, xmax, xmin, ymax, ymin
blank identity  
boxplot boxplot colour, fill, lower, middle,size, upper, weight, x, ymax,ymin
contour contour colour, linetype, size, weight, x, y
crossbar identity colour, fill, linetype, size, x, y, ymax, ymin
density density colour, linetype, size, weight, x, y
density2d density2d colour, linetype, size, weight, x, y
dotplot bindot colour, fill, x, y
errorbar identity colour, linetype, size, width, x, ymax, ymin
errorbarh identity colour, linetype, size, width, x, ymax, ymin
freqpoly bin colour, linetype, size
hex binhex colour, fill, size, x, y
histogram bin colour, fill, linetype, size, weight, x
hline hline colour, linetype, size
jitter identity colour, fill, shape, size, x, y
line identity colour, linetype, size, x, y
linerange identity colour, linetype, size, x, ymax, ymin
map identity colour, fill, linetype, size, x, y, map_id
path identity colour, linetype, size, x, y
point identity colour, fill, shape, size, x, y
pointrange identity colour, fill, linetype, shape, size, x, y, ymax, ymin
polygon identity colour, fill, linetype, size, x, y
quantile quantile colour, linetype, size, weight, x, y
raster identity colour, fill, linetype, size, x, y
rect identity colour, fill, linetype, size, xmax, xmin, ymax, ymin
ribbon identity colour, fill, linetype, size, x, ymax, ymin
rug identity colour, linetype, size
segment identity colour, linetype, size, x, xend, y, yend
smooth smooth alpha, colour, fill, linetype, size, weight, x, y
step identity colour, linetype, size, x, y
text identity angle, colour, hjust, label, size, vjust, x, y
tile identity colour, fill, linetype, size, x, y
violin ydensity weight, colour, fill, size, linetype, x, y
vline vline colour, linetype, size


统计变换

统计变换,对数据进行统计变换,通常以某种方式对数据信息进行汇总。

名称 描述
bin 计算封箱(bin)数据
bin2d 计算矩形封箱内的观测值个数
bindot 计算“点直方图”的封箱数据
binhex 计算六边形热图的封箱数据
boxplot 计算组成箱线图的各种元素值
contour 三维数据的等高线
density 一维密度估计
density2d 二维密度估计
function 添加新函数
identity 不对数据进行统计变换
qq 计算 qq 图的相关值
quantile 计算连续的分位数
smooth 添加光滑曲线
spoke 将角度和半径转换成 xend 和yend
sum 计算每个单一值的频数,有助于解决散点图的图形重叠问题
summary 对每个 x 所对应的 y 值做统计描述
summary2d 对 2 维矩形封箱设定函数
summaryhex 对 2 维六边形封箱设定函数
unique 删除重复值
ydensity 小提琴图,计算 1 维y 轴方向的核密度函数估计值


统计变换会生成新的变量,这些新的变量可以被直接调用。例如,可以用 stat_bin 绘制直方图,实际上 stat_bin 统计变换会生成以下变量,并会被直接调用:

  • count,每一组观测值数目;
  • density,每组观测值的密度(占整体百分数/组宽);
  • x,组的中心位置。

在以下代码中,第一个是默认调用了参数 count(可以省略不写),第二个调用了参数density。调用生成的新变量时必须用“..”包围起来,以便区分数据集的变量与新生成的变量。查看统计变换的帮助文档(如?stat_bin),可以知道统计变换新生成的变量以及其他信息。

ggplot(diamonds, aes(carat)) + stat_bin(binwidth = 0.1)

这里写图片描述

ggplot(diamonds, aes(carat)) + stat_bin(aes(y = ..density..), binwidth = 0.1)

 

这里写图片描述


位置调整

所谓位置调整,即对图层元素位置进行微调。以下是ggplot2 中所有可用的位置调整参数。

名称 描述
dodge 避免重叠,并排位置
fill 堆叠图形元素并将高度标准化为 1
identity 不做任何调整
jitter 给点添加扰动避免重合
stack 将图形元素堆叠起来


在条形图中可以很好地解释不同类型的位置调整。以下是三种不同类型的代码:

ggplot(diamonds, aes(clarity, fill = cut)) + geom_bar(position = 'stack')
ggplot(diamonds, aes(clarity, fill = cut)) + geom_bar(position = 'fill')
ggplot(diamonds, aes(clarity, fill = cut)) + geom_bar(position = 'dodge')

这里写图片描述
从左到右依次是堆叠(stacking)、填充(filling)、并列(dodging)

对于不同类型的图,需要合理选择适合的位置调整。例如:
同一调整(identity adjustment)不适用于条形图,因为最顶层图层会挡住下面的图层(下图左);而适用于线型图,因为线条不会存在相互遮挡的问题(下图右)。

代码分别如下:

ggplot(diamonds, aes(clarity, fill = cut)) + geom_bar(position = 'identity')
ggplot(diamonds, aes(clarity)) + geom_freqpoly(aes(group = cut, colour = cut))

这里写图片描述
这里写图片描述


 评论