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
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等坐标刻度值转换函数。