R语言数据可视化 ggplot2基础2 创建单图层的散点图 创建facet
单图层散点图
这一讲我们从最简单的散点图开始介绍ggplot2应用的基础,首先我们下载并应用tidyverse包:
install.packages("tidyverse")
library(tidyverse)
用tidyverse自带的数据mpg举例,
> ggplot2::mpg
# A tibble: 234 x 11
manufacturer model displ year cyl trans drv cty
<chr> <chr> <dbl> <int> <int> <chr> <chr> <int>
1 audi a4 1.8 1999 4 auto~ f 18
2 audi a4 1.8 1999 4 manu~ f 21
3 audi a4 2 2008 4 manu~ f 20
4 audi a4 2 2008 4 auto~ f 21
5 audi a4 2.8 1999 6 auto~ f 16
6 audi a4 2.8 1999 6 manu~ f 18
7 audi a4 3.1 2008 6 auto~ f 18
8 audi a4 q~ 1.8 1999 4 manu~ 4 18
9 audi a4 q~ 1.8 1999 4 auto~ 4 16
10 audi a4 q~ 2 2008 4 manu~ 4 20
# ... with 224 more rows, and 3 more variables:
# hwy <int>, fl <chr>, class <chr>
在这个数据中,我们比较关注displ与hwy这两个变量,displ表示引擎尺寸(升),hwy表示高速路上的燃油效率(英里/加仑)。为了展示这两个变量之间的关系,我们先画一个简单的散点图:
ggplot(data = mpg)+
geom_point(mapping = aes(x = displ, y = hwy))
因为我们只想要一个散点图,所以用minimal code,而不是用上一讲介绍的Layered Grammar,如果用Layered Grammar来写那就是
ggplot()+
layer(data = mpg,mapping = aes(x = displ, y = hwy),
geom = "point",stat = "identity",position="identity")+
scale_y_continuous()+
scale_x_continuous()+
coord_cartesian()
这段代码的输出与minimal code输出的图像一样,但这段代码是严格按照Layered Grammar来写的,ggplot()开头表示接下来要应用图形语法创建图形对象,第一步是创建图层,每一个图层包含数据、映射(aesthetic mapping)、几何对象、统计变换、位置调整;第二步是指定scale以及坐标系统;对比Layered Grammar与minimal code,大家可以开始建立一些直觉,哪些是可以省略的,哪些是minimal requirement,后续的代码样例都用minimal code。
整体来看这个散点图是有一个下降的趋势的,但右边中部的哪些点很可能导致线性拟合残差出现非线性pattern,因此我们希望引入另一个变量能解释这种现象,于是我们可以把不同车型对应的散点用不同颜色表示:
ggplot(data = mpg)+
geom_point(mapping = aes(x = displ, y = hwy, color = class))
这样我们就可以分车型比较引擎尺寸与燃油效率的关系了。
大家可以自行尝试在aesthetics mapping中把color=class改为alpha=class,shape=class或者size=class,这三个语句可以分别用透明度、点型、点的大小表示不同的车型。
单图层散点图的facet
如果我们不想把这些车型综合到一张图下比较,而是用subplot展示每一个车型引擎尺寸与燃油效率的关系,那么我们就需要创建facet了。
Minimal Code:
ggplot(data = mpg)+
geom_point(mapping = aes(x = displ, y = hwy))+
facet_wrap(~class,nrow = 2)
Layered Grammar:
ggplot()+
layer(data = mpg,mapping = aes(x = displ, y = hwy),
geom = "point",stat = "identity",position="identity")+
facet_wrap(~class,nrow = 2)+
scale_y_continuous()+
scale_x_continuous()+
coord_cartesian()
facet_wrap(~class,nrow = 2)表示用车型的数据作为subplot创建facet,subplot均匀排列为两行。
也可以使用两个变量创建facet,比如把facet_wrap(~class,nrow = 2)改成facet_grid(drv~cyl),得到的结果就是
如果想去掉行,只保留列,可以用facet_grid(.~cyl)替换,