ggplot2的作图一般步骤为:
准备数据,一般为数据框, 且一般为长表, 即每个观测时间占一行, 每个观测变量占一列。
将数据输入到ggplot()函数中, 并指定参与作图的每个变量分别映射到哪些图形特性, 比如映射为x坐标、y坐标、颜色、形状等。这些映射称为aesthetic mappings或aesthetics。
选择一个合适的图形类型, 函数名以geom_开头, 如geom_point()表示散点图。图形类型简称为geom。将ggplot()部分与geom_xxx()部分用加号连接。到此已经可以作图,下面的步骤是进一步的细化设定。
设定适当的坐标系统, 如coord_cartesian(), scale_x_log10()等。仍用加号连接。
设定标题和图例位置等,如labs()。仍用加号连接。
这个流程的一个大致的模板为:
p <- ggplot(data=<输入数据框>,mapping=aes(<维度>=<变量名>,<维度>=<变量名>,<...>))p + geom_<图形类型>(<...>) +scale_<映射>_<类型>(<...>) +coord_<类型>(<...>) +labs(<...>)
其中<...>表示额外的选项。变量p包含做出的图形的所有数据与设定, 变量名可以任意取。
一、散点图
数据选用gapminder包中和socviz包中的数据集。
install.packages('gapminder')library(gapminder)head(gapminder,20)
# A tibble: 20 x 6countrycontinent year lifeExp pop gdpPercap<fct><fct> <int> <dbl> <int> <dbl>1Afghanistan Asia 1952 28.8 8425333 779.2Afghanistan Asia 1957 30.3 9240934 821.3Afghanistan Asia 1962 32.0 10267083 853.4Afghanistan Asia 1967 34.0 11537966 836.5Afghanistan Asia 1972 36.1 13079460 740.6Afghanistan Asia 1977 38.4 14880372 786.7Afghanistan Asia 1982 39.9 12881816 978.8Afghanistan Asia 1987 40.8 13867957 852.9Afghanistan Asia 1992 41.7 16317921 649.10Afghanistan Asia 1997 41.8 22227415 635.11Afghanistan Asia 2002 42.1 25268405 727.12Afghanistan Asia 2007 43.8 31889923 975.13Albania Europe 1952 55.2 1282697 1601.14Albania Europe 1957 59.3 1476505 1942.15Albania Europe 1962 64.8 1728137 2313.16Albania Europe 1967 66.2 1984060 2760.17Albania Europe 1972 67.7 2263554 3313.18Albania Europe 1977 68.9 2509048 3533.19Albania Europe 1982 70.4 2780097 3631.20Albania Europe 1987 72 3075321 3739.
socviz的数据集需要从github上下载
devtools::install_github("kjhealy/socviz")
如果连接不上,也可自行下载后使用下列命令安装
devtools::install_local("本地路径")
查看前20行数据
head(gss_sm, 20)
以gapminder数据集作为输入数据, 做出简单的散点图, 并逐步进行改善。这个数据集有多个国家在多个年份的期望寿命与人均GDP值, 作期望寿命对人均GDP的散点图, 每个国家的每个年份作为一个点。散点图最重要的映射是x轴与y轴两个维度。
首先调用ggplot()函数, 指定数据集, 将人均GDP映射到x轴, 将期望寿命映射到y轴, 结果保存为一个R变量:
p<-ggplot(data=gapminder,mapping=aes(x=gdpPercap,y=lifeExp))
x、y轴是最常见的映射, 也可以将变量映射为颜色、符号、线型等, 这时不需要指定具体的颜色、符号、线型, 而是将变量映射为这些图形元素类型。
ggplot()的调用中, 可以省略data =, mapping =, x =, y =, 写成:
p<- ggplot(gapminder, aes(gdpPercap, lifeExp))
在如上指定了数据和映射后, 只要用geom_xxx()指定一个图形类型, 并与ggplot()的结果用加号连接就可以作图了,如:
p+ geom_point()
实际上,上面的程序等同于调用print(p + geom_point())。在R函数中或者在循环中需要显式地调用print(), 否则不会显示结果。当载入了tidyverse系统时可以写成(p + geom_point()) %>% print()。
指定数据集、指定映射、选择适当的图形类型就可以做出基本的图形, 随后可以逐步对坐标系、坐标系刻度、标签与图例、配色等进行改善。实际上,ggplot2包已经提供了十分合理的预设值, 用户只要进行一些必要的改动即可。
作图步骤之间用加号连接,这是ggplot包特有的语法。例如, 用相同的映射做出拟合曲线图:
p+ geom_smooth()
##`geom_smooth()` using method = 'gam' and formula 'y ~ s(x, bs = "cs")'
用相同的映射做出散点图并叠加拟合曲线图:
p+ geom_point() + geom_smooth()
##`geom_smooth()` using method = 'gam' and formula 'y ~ s(x, bs = "cs")'
geom_smooth()的默认设置调用了gam()函数来拟合曲线, 可以用geom_smooth()的参数选择不同的拟合方法, 如直线拟合:
p+ geom_point() + geom_smooth(method="lm")
##`geom_smooth()`using formula'y ~ x'
注意geom_xxx()函数计算所需的变量值是从ggplot()函数保存在变量p中的信息提取的。
在以上的所有图形中, x轴变量(人均GDP)分布非正态,严重右偏, 使得大多数散点重叠地分布在直角坐标系的左下角。将x轴用对数刻度可以改善, 函数为scale_x_log10():
p+ geom_point() +geom_smooth(method="gam") + scale_x_log10()
##`geom_smooth()`using formula'y ~ s(x, bs = "cs")'
scale_xxx()的labels选项指定如何标出坐标刻度数字, 参数值是一个函数对象, 如果scales包中找不到适当的功能, 可以自定义一个函数将数值转换为字符串。scales包提供了comma, date, dollar, math,number, ordinal, pvalue, scientific,time等坐标刻度值转换函数。