图层设置是ggplot2做图的关键。通过查看ggplot图形对象的数据结构我们了解到一个图层至少包含几何类型、统计类型和位置调整三方面的东西,当然数据和映射得首先建立。如果把ggplot2当成是太极,这些内容的设置就相当于太极的招式,有固定方法;对招式理解透彻后以随意对它们进行组合,并融合数据层面的一些设置(如分面、美学属性映射等)创造出用于解决问题的完美图形。
1 图层的几何和统计类型
1.1 几何/统计类型设置函数
在ggplot2中,每种几何类型都有对应的(默认)统计类型,反之亦然。两者不分家,所以得放在一起来说。几何类型的设置函数全部为geom_xxx形式,而统计类型设置函数全部为stat_xxx的形式:
library(ggplot2) ls("package:ggplot2", pattern="^geom_.+")
## [1] "geom_abline" "geom_area" "geom_bar" ## [4] "geom_bin2d" "geom_blank" "geom_boxplot" ## [7] "geom_contour" "geom_crossbar" "geom_density" ## [10] "geom_density2d" "geom_dotplot" "geom_errorbar" ## [13] "geom_errorbarh" "geom_freqpoly" "geom_hex" ## [16] "geom_histogram" "geom_hline" "geom_jitter" ## [19] "geom_line" "geom_linerange" "geom_map" ## [22] "geom_path" "geom_point" "geom_pointrange" ## [25] "geom_polygon" "geom_quantile" "geom_raster" ## [28] "geom_rect" "geom_ribbon" "geom_rug" ## [31] "geom_segment" "geom_smooth" "geom_step" ## [34] "geom_text" "geom_tile" "geom_violin" ## [37] "geom_vline"
ls("package:ggplot2", pattern="^stat_.+")
## [1] "stat_abline" "stat_bin" "stat_bin2d" ## [4] "stat_bindot" "stat_binhex" "stat_boxplot" ## [7] "stat_contour" "stat_density" "stat_density2d" ## [10] "stat_ecdf" "stat_function" "stat_hline" ## [13] "stat_identity" "stat_qq" "stat_quantile" ## [16] "stat_smooth" "stat_spoke" "stat_sum" ## [19] "stat_summary" "stat_summary2d" "stat_summary_hex" ## [22] "stat_unique" "stat_vline" "stat_ydensity"
很多,有小部分是相同的。如果一个个介绍就得写成说明书了,跟软件包作者写的函数说明没什么两样;再说也没必要,不是每个人都会用到全部的类型。下面看一下几何函数geom_point和统计函数stat_identity的参数:
# 函数说明,非运行代码 geom_point(mapping = NULL, data = NULL, stat = "identity", position = "identity", na.rm = FALSE, ...) stat_identity(mapping = NULL, data = NULL, geom = "point", position = "identity", width = NULL, height = NULL, ...)
有4个参数是一样的:映射(mapping)、数据(data)、位置(position)和点点点(Dot-dot-dot: …)。H.W.特别强调了mapping和data参数的先后顺序在几何/统计类型设定函数和ggplot函数中的差别:ggplot函数先设定数据,再设定映射;而几何/统计类型函数则相反,因为确定作图或统计之前一般都已经有数据,只需指定映射即可。如果不写参数名,它们的用法是这样的:
# 示例,非运行代码 ggplot(数据, 映射) geom_xxx(映射, 数据) stat_xxx(映射, 数据)
"点点点"参数是R语言非常特殊的一个数据类型,用在函数的参数用表示任意参数,在这里表示传递给图层的任意参数如color, shape, alpha等。
前面我们一直用geom_point来做散点图,其实完全可以用stat_identity来做,得到的图形是完全相同的:
# 取ggplot2的diamonds数据集的一部分数据: set.seed(100) d.sub <- diamonds[sample(nrow(diamonds), 500),] p <- ggplot(d.sub, aes(x=carat, y=price)) theme_set(theme_bw()) p + stat_identity() p + geom_point()
查看图层组成可以看到两者都有geom_point、stat_identity和position_identity:
(p + stat_identity())$layers
## [[1]] ## geom_point: ## stat_ident