10.1.2 ggplot2包绘制静态图表示例

10.1.2 ggplot2包绘制静态图表示例

ggplot2包绘制静态图表可以采用图层叠加的方式,下面讲解图层叠加的绘图步骤。首先使用ggplot2包绘制点状图,代码如下:

运行上述代码,结果如图10-3所示。

图10-3 增加图例后的图形示例

细心的读者会发现,绘制图10-3的代码与绘制图10-2的代码有所不同,但输出的结果相同。在10.1.1节中,为了对图层进行说明,将函数进行了拆分。而本节将从函数的层面上对ggplot2包进行说明,所以采用了这种更加简洁的代码。在这段代码中,ggplot()创建了一个坐标系,我们可以在它上面添加图层。ggplot()的第一个参数是数据集,需要采用数据框的形式。函数geom_point()可以向图中添加一个点层,从而创建点状图。

ggplot2包中包含多种几何对象函数,每种函数都可以向图中添加不同类型的图层。本节将介绍如下几种几何对象函数。

1.数据映射

将数据转换为图形的过程,实质上是将变量映射为图形属性的过程。ggplot2包中的mapping参数定义了如何将数据集中的变量映射为图形属性。mapping参数总是与aes()函数成对出现,aes()函数的x参数和y参数分别指定映射到x轴的变量与映射到y轴的变量。ggplot2包通过data参数寻找映射变量,图10-3对应的data参数就是mtcars。数据集字段变量与数据美学映射的关系如图10-4所示。

图10-4 数据映射

向图中添加的其他变量,也是通过映射的方式转换为图形属性的。图形属性是图中对象的可视化属性,包括数据点的大小、形状和颜色。通过改变图形属性的值,可以用不同的方式来显示数据点。例如,在上面的代码中,就是将“mtcars$vs”映射为点的颜色。另外,还可以通过手动的方式改变点的颜色,但是这时的颜色是图形属性,而不再是映射,所以需要将color=red放到aes()函数外面,具体代码如下:

ggplot2包更改点颜色的示例如图10-5所示。

图10-5 ggplot2包更改点颜色的示例

我们还可以用相同的方式设置点的大小,如果手动设置的话,点的大小的单位是mm,对应代码如下:

ggplot2包手动设置点大小的示例如图10-6所示。

图10-6 ggplot2包手动设置点大小的示例

下面的示例代码可以手动设置点大小为5号,输出结果如图10-7所示。

shape参数可以改变点的形状。在ggplot2包中,点的形状是用数字和符号标识的,ggplot2包共提供了36种形状,如图10-8所示。需要注意的是,在绘图时最多同时使用6种形状,多于6种形状将无法显示。

2.几何对象

几何对象是图中用来表示数据的几何图形对象。在实际应用中,经常根据图中使用的几何对象类型来描述相应的图。例如:条形图使用条形几何对象;折线图使用直线几何对象;箱线图使用矩形和直线几何对象。下面使用不同的几何对象来表示同样的数据,具体代码如下:

图10-7 ggplot2包更改点大小的示例

图10-8 ggplot2包提供的36种形状

几何对象绘图示例如图10-9所示。

如果要生成反映x轴和y轴变量关系的平滑曲线,可以调用geom_smooth()函数,代码如下所示:

上述代码输出结果如图10-10所示。

图10-9使用了点几何对象。图10-10使用了平滑几何对象,并以一条平滑曲线来拟合数据。上述代码表明,ggplot2包自动使用局部加权回归(Loess)算法完成了xy之间关系的平滑拟合。

图10-9 几何对象绘图示例

图10-10 平滑几何对象绘图示例

ggplot2包中的每个几何对象函数都可以设置图形属性,但不是每种图形属性都适用于每种几何对象。例如,我们虽然无法设置线的形状,但是可以设置线的类型,代码如下:

更改线类型绘图示例如图10-11所示。

图10-11 更改线类型绘图示例

线的类型同样可以使用数据集的数据进行映射,但是需要注意的是,线的类型必须是离散变量(如车的类型),不可以是连续变量(如油耗)。

我们还可以通过在ggplot()函数中添加多个几何对象函数,在同一张图中使用两种甚至多种几何对象:

使用两种几何对象的绘图示例如图10-12所示。

图10-12 使用两种几何对象的绘图示例

观察上述代码可知,代码有些地方是重复的,假如需要修改x轴的变量,那么需要在两个地方进行修改。避免重复的方法是将一组映射传递给ggplot()函数,ggplot2包会将这些映射作为全局映射应用到图中的每个几何对象中。例如,以下代码将绘制出与上述代码同样的图:

如果将映射放在几何对象函数中,那么ggplot2包会将其看作这个图层的局部映射,它将使用这些映射扩展或覆盖全局映射,但仅对该图层有效。这样一来,就可以在不同的图层中显示不同的图形属性:

不同图层中的几何对象示例如图10-13所示。

图10-13 不同图层中的几何对象示例

3.统计变换

绘图时用来计算新数据的算法称为统计变换(Statistical Transformation)。geom_bar()函数的统计变换过程如图10-14所示。

通过查看stat参数的默认值可知几何对象函数使用了哪种统计变换。例如,若“?geom_bar”显示出stat的默认值是“count”,则说明“geom_bar()”使用stat_count()函数进行统计变换。

图10-14 geom_bar()函数的统计变换过程

通常来说,几何对象函数和统计变换函数可以互换使用。使用stat_count()函数替换geom_bar()函数的代码如下:

统计变换图形示例如图10-15所示。

图10-15 统计变换图形示例

几何对象函数和统计变换函数可以互换使用的原因在于,每个几何对象函数都有一个默认统计变换,每个统计变换函数都有一个默认几何对象。一般情况下,这意味着在使用几何对象函数时不用担心底层的统计变换。geom_bar()函数的统计变换除了可以通过对行进行计数生成条形图高度外,还可以通过以下3种方式实现对数据框对象存储变量的计数。

·生成表示比例的条形图。

·在代码中强调统计变换。例如,可以使用stat_summary()函数将注意力集中在计算出的摘要统计量上。

·ggplot2包提供了20多个统计变换,每个统计变换都是一个函数,因此可以按照通用方式获得帮助,如“?stat_bin”。如果想要查看全部的统计变换,可以使用ggplot2速查表。

4.分面

添加额外变量有两种方法:一种方法是使用图形属性;另一种方法是将图分割成多个分面,即可以显示数据子集的子图,这种方法特别适合添加分类变量。

要想通过单个变量对图进行分面,可以使用facet_wrap()函数。该函数的第一个参数是一个“公式”,创建“公式”的方式是在“~”后面加一个变量名(这里所说的“公式”是R语言中的一种数据结构,不是数学意义上的公式)。传递给facet_wrap()函数的变量应该是离散数据结构。例如:

facet_wrap()函数绘制图形示例如图10-16所示。

图10-16 facet_wrap()函数绘制图形示例

要想通过两个变量对图进行分面,需要在绘图命令中加入facet_grid()函数。这个函数的第一个参数也是一个“公式”,但该“公式”包含由“~”隔开的两个变量名。例如:

facet_grid()函数绘制图形示例如图10-17所示。

图10-17 facet_grid()函数绘制图形示例