在《初学ggplot2(一)》中讲解了有关qplot()函数的语法和应该,然而要更灵活地操纵几何图形与图形属性,实现“基本图形要素的自由组合”,就需要ggplot2包中更高级的函数了。
使用ggplot2包进行统计图形的绘制,绘图过程中主要包括以下四种组件:
1)数据和图形属性映射
2)几何对象
3)统计变换
4)位置调整
一、数据(data)和图形属性映射(mapping)
ggplot(data = df, mapping = aes(x = , y = , ...))
使用ggplot2包进行绘图,对数据的要求必须是数据框,如果数据集发生了变化,可以使用“%+%”来代替原来的数据集;
aes()参数可以定义图形的属性,这里的属性可以是x轴或y轴所对应数据集的变量,可也是形状、颜色、尺寸、填充,分组等。需要注意的是,aes()参数所设定的属性值必须是数据集中的变量,不可以是自定义的常量,如果必须要添加属性映射为一个常量,可以做图层函数中添加。还可以通过加号(+)来添加或修改或删除图形属性映射。
例子:
library(ggplot2)
library(gridExtra)
#添加(在ggplot()函数外添加图形映射aes):
p1 <- ggplot(data = mpg)
p1 <- p1 + aes(x = hwy, y = displ,
colour = factor(cyl)) + geom_point()
#修改(将x轴由原来的hwy改为cty):
p2 <- p1 + aes(x = cty, y = displ,
colour = factor(cyl)) + geom_point()
#删除(删除颜色属性的映射):
p3 <- p1 + aes(x = cty, y = displ, colour = NULL)
+ geom_point()
#将三幅图组合到一张图中
grid.arrange(p1, p2, p3, ncol = 3, nrow = 1)
有关图形属性映射,这里还想强调一下分组的属性,即通过group参数实现绘图的分组,默认情况下group = 1,表示不对数据进行分组绘图,如果需要指定某个变量为分组变量,则需将该变量指定给group参数。这里需要注意的是,如果一个变量不能正确实现分组,而多个变量可以准确的将个体进行分组的话,可以使用interaction()函数将多个变量组合起来。
例子:
通过group = Subject实现每个男孩一条身高增长曲线
p1 <- ggplot(data = Oxboys, mapping = aes(x = age,
y = height, group = Subject))
+ geom_line()
如果不指定分组变量,将会返回无意义的图
p2 <- ggplot(data = Oxboys, mapping =
aes(x = age, y = height, group = 1))
+ geom_line()
为每一个男孩的身高增长曲线添加一条线性的平滑曲线显然不能反映所有男孩的趋势
p3 <- ggplot(data = Oxboys, mapping =
aes(x = age, y = height, group = Subject))
+ geom_line()
+ geom_smooth(mapping = aes(group = Subject),
method = 'lm', se = FALSE,
size = 2, colour = 'blue')
这时绘制所有男孩的平滑曲线时,就不能添加分组属性
p4 <- ggplot(data = Oxboys, mapping =
aes(x = age, y = height, group = Subject))
+ geom_line()
+ geom_smooth(mapping = aes(group = 1),
method = 'lm', se = FALSE,
size = 2, colour = 'blue')
二、几何对象(geom_)
通过加号(+)添加图层函数,实现图层的叠加,以添加条形图图层为例:
+geom_bar(mapping = NULL, data = NULL,
stat = "bin", position = "stack",...)
mapping:可以为每个图层添加各自的图形属性映射,用aes()函数包含各种属性映射;
data:可以为每个图层指定不同的数据集,默认情况下使用ggplot()函数指定的数据集;
stat:可以为每个图层添加不同的统计变换,对于条形图来说,默认的统计变换封箱bin;
position:实现图层的位置调整,默认情况下是堆叠图,还可以指定填充图(fill)和并列图(dodge)
...:可以指定的其他参数,如透明度、尺寸等。
三、统计变换(stat_)
可以通过加号(+)添加统计变换函数,实现图层上的统计变换,这里以qq图为例:
+ stat_qq(mapping = NULL, data = NULL,
geom = "point",position = "identity",
distribution = qnorm, dparams = list(),
na.rm = FALSE, ...)
mapping:为每个统计变换函数添加各自的图形映射;
data:为每个统计变换函数指定不同的数据集;
geom:为每个统计变换函数添加不同几何对象,这里默认为点图;
position:可以实现每个统计变换函数的位置调整;
distribution:这里指定stat_qq()函数中的分布函数,用字符串表示,默认为正态分位数函数('qnorm');
dparams:为指定的某种分布的分位数函数设置参数;
na.rm:为每个统计变换函数选择缺失值的处理方式,默认情况下,剔除缺失值并返回警告信息。
例子:
library(ggplot2)
library(gridExtra)
set.seed(1234)
x <- rt(1000,3)
#绘制正态分布的QQ图
p1 <- ggplot(data = NULL, mapping = aes(sample = x))
+ stat_qq(distribution = qnorm)
+ stat_abline(a = 1, b = 0, colour = 'red')
#绘制t分布的QQ图
p2 <- ggplot(data = NULL, mapping = aes(sample = x))
+ stat_qq(distribution = qt, dparams = list(df = 3))
+ stat_abline(a = 1, b = 0, colour = 'red')
#合并以上两张图
grid.arrange(p1, p2, ncol = 2, nrow = 1)
通过图层函数和统计变换函数的介绍,发现每一个几何对象都有一个默认的统计变换,每一个统计变换函数都有一个默认的几何对象。有关ggplot2中的37个图层函数及各自的默认统计变换和20个统计变换函数可查看《ggplot2:数据分析与图形艺术》第四章中4.6和4.7内容。
四、位置调整(position)
位置调整就是对图层元素进行微调,当前ggplot2包含如下5种位置调整参数:
position = 'dodge',避免重叠,并排放置;
position = 'fill',堆叠图形元素,并将高度标准化为1;
position = 'stack',将图形元素堆叠起来;
position = 'jitter',给点添加扰动,避免重合;
position = 'identity',不对图形元素进行任何调整。
位置调整一般多用于处理离散数据,因为连续数据一般很少出现完全重叠的问题。
例子:
library(ggplot)
library(gridExtra)
#堆叠条形图
bar_stack <- ggplot(data = mtcars,
mapping = aes(x = factor(am),
fill = factor(cyl)))
+ geom_bar(stat = 'bin', position = 'stack')
#填充条形图
bar_fill <- ggplot(data = mtcars,
mapping = aes(x = factor(am),
fill = factor(cyl)))
+ geom_bar(stat = 'bin', position = 'fill')
#并列条形图
bar_bodge <- ggplot(data = mtcars,
mapping = aes(x = factor(am),
fill = factor(cyl)))
+ geom_bar(stat = 'bin', position = 'dodge')
#合并三张图为一张图
grid.arrange(bar_stack, bar_fill, bar_bodge,
ncol = 3, nrow = 1)
以上内容为ggplot2绘制图形的四个主要的组件,万变不离其中,ggplot2包可以根据用户的自定义情况实现多种图形的叠加。
参考资料:
ggplot2:数据分析与图形艺术