每天 5 分钟,轻轻松松上手 R 语言(一)

每天 5 分钟,轻轻松松上手 R 语言(一)

让我们一起开始学习 R for Data Science 这本书吧!本文是我们学习第一章的笔记。

加载 tidyverse

tidyverse 包含了 ggplot2, readr, dplyr, tibble, purrr 等工具包,可以一站式完成数据读写、数据处理和数据可视化的任务,如果加载过程有函数或者数据集冲突,可以指定包名来加载,格式 package::function()

首先安装和加载 tidyverse,tidyverse 加载的时候会自动加载一些常用的数据处理相关的包,同时会检查这些包和其它包之间的函数名称是否有冲突:

1
2
3
4
5
6
7
8
9
10
# 安装 tidyverse 包:
# install.packages('tidyverse')
library(tidyverse)
#> ── Attaching packages ─────────────────────────── tidyverse 1.3.0 ──
#> ✓ tibble 2.1.3 ✓ purrr 0.3.3
#> ✓ tidyr 1.0.2 ✓ stringr 1.4.0
#> ✓ readr 1.3.1 ✓ forcats 0.4.0
#> ── Conflicts ────────────────────────────── tidyverse_conflicts() ──
#> x stats::filter() masks dplyr::filter()
#> x stats::lag() masks dplyr::lag()

初识数据

mpg 是 ggplot2 包内置的数据集,我们可以使用 glimps(mpg) 查看该数据集的一些基本信息,例如观测值数、变量数及各个变量的类型:

注:int 整型,dbl 双精度,chr 字符型,?mpg 可以查看数据的帮助文档。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
glimps(mpg)
# str(mpg) # 查看数据格式
# View(mpg) # 查看数据集
# edit(mpg) # 交互式查看编辑数据
#> Observations: 234
#> Variables: 11
#> $ manufacturer <chr> "audi", "audi", "audi", "audi", "audi", "audi", "audi…
#> $ model <chr> "a4", "a4", "a4", "a4", "a4", "a4", "a4", "a4 quattro…
#> $ displ <dbl> 1.8, 1.8, 2.0, 2.0, 2.8, 2.8, 3.1, 1.8, 1.8, 2.0, 2.0…
#> $ year <int> 1999, 1999, 2008, 2008, 1999, 1999, 2008, 1999, 1999,…
#> $ cyl <int> 4, 4, 4, 4, 6, 6, 6, 4, 4, 4, 4, 6, 6, 6, 6, 6, 6, 8,…
#> $ trans <chr> "auto(l5)", "manual(m5)", "manual(m6)", "auto(av)", "…
#> $ drv <chr> "f", "f", "f", "f", "f", "f", "f", "4", "4", "4", "4"…
#> $ cty <int> 18, 21, 20, 21, 16, 18, 18, 18, 16, 20, 19, 15, 17, 1…
#> $ hwy <int> 29, 29, 31, 30, 26, 26, 27, 26, 25, 28, 27, 25, 25, 2…
#> $ fl <chr> "p", "p", "p", "p", "p", "p", "p", "p", "p", "p", "p"…
#> $ class <chr> "compact", "compact", "compact", "compact", "compact"…

其中各变量的含义如下表所示:

变量 含义 变量 含义
hwy 每加仑高速里程 cty 每加仑城市里程
class 汽车品牌 fl 燃料类型
year 生产年份 manufacture 制造商
cyl 气缸数 model 车型
trans 传输类型 displ 排量
drv 驱动形式

ggplot2 语句的结构通常是这样的:

  • <DATA> 数据;

  • <GEOM_FUNCTION> 几何对象,如 point, line, bar;

  • <MAPPINGS> 数据和图形的映射关系。

1
2
ggplot(data = <DATA>) + 
<GEOM_FUNCTION>(mapping = aes(<MAPPINGS>))

例如我们观察汽车排量和高速上每加仑油行使的里程关系:

1
2
ggplot(data = mpg) + 
geom_point(mapping = aes(x = displ, y = hwy))

ggplot2 内置了很多几何对象(图层函数):

练习答案:

  1. 只有一个底图,因为没有传入几何对象
  2. glimps(mpg)可以看到行列数
  3. drv 是驱动形式,f 前驱,r 后驱,4 四驱
  4. ggplot(data = mpg) + geom_point(aes(x = hwy,y = cyl))

  1. 出现类似一个棋盘格,因为两个变量都是类别变量

图形属性映射

我们知道散点图可以表示两个变量之间的关系,不过我可以通过散点的大小、颜色、形状等表现其它变量,例如这里我们可以把汽车的类型 class 变量映射给散点的颜色或者形状。注意,一般不要把离散变量映射给大小,因为大小是个连续的概念,更适合连续型变量。
可以看到当设定 shape = class 时,只映射出了 6 种形状,因为 ggplot2 默认只能同时使用 6 种形状,多出的会被抛弃:

1
2
3
4
5
6
p1 <- ggplot(data = mpg) + 
geom_point(mapping = aes(x = displ, y = hwy,
shape = class))
p2 <- ggplot(data = mpg) +
geom_point(mapping = aes(x = displ, y = hwy,
color = class))

当在 mapping 外部设置 color 时,只是改变了所有点的颜色,并没有做映射。

1
2
3
ggplot(data = mpg) + 
geom_point(mapping = aes(x = displ, y = hwy),
color = "blue")
  • 颜色名称是一个字符串;
  • 点的大小用毫米表示;
  • 点的形状是一个数值,空心形状边界颜色由 color 决定,实心形状填充颜色由 color 决定,填充形状的边界是 color,填充是 fill

练习答案:

  1. color 在 aes 内部会被当作一个单一变量,应该在 aes 外部
  2. glimps 或者 str(mpg)可以看出变量类型
  3. 分类变量适合用 color 和 shape,连续变量适合用 size
  4. 同样可以画出图,但是会造成信息冗余,不利于理解,可以尝试
1
2
3
ggplot(mpg, aes(x = displ, y = hwy, 
colour = hwy, size = displ)) +
geom_point()

  1. 改变形状的边界厚度,可以尝试:
1
2
ggplot(mtcars, aes(wt, mpg)) +
geom_point(shape = 21, colour = "black", fill = "white", size = 5, stroke = 5)

  1. 将 displ < 5 和 displ >= 5 的点绘制成不同颜色,相当于一个 bool 类型的变量,可以尝试:
1
2
ggplot(mpg, aes(x = displ, y = hwy, colour = displ < 5)) +
geom_point()

常见问题

  • + 号不能出现在多行代码的行首;
  • ? 跟函数名、包名等可以查询相关文档。

分面

关于分面,一个变量分面 facet_wrap(~ class) 和两个变量分面 facet_grid(drv ~ class).

练习题

  1. 会把分面变量当作类别变量,每个变量值绘制一个图,可以尝试:
1
2
ggplot(mpg, aes(x = displ, y = hwy)) +
geom_point() +facet_grid(. ~ cty)

  1. 空白就是对应的分面没有样本;
  2. . 忽略对应维度的分面,在 ~ 前忽略 y 轴,在 ~ 后忽略 x 轴;
  3. 当变量较多的时候,图形属性颜色区分度不高,不能很好区分各个样本点,而分面可以,但是分面后不同面上的点之间不好比较,所以变量少容易区分时可以用图形属性映射,多的时候颜色大小等不容易区分可以考虑分面;
  4. nrow 和 ncol 控制分面子图的排版,facet_grid() 对应 x 方向和 y 方向的分面图个数是确定的,所有不用设置;
  5. 这样行方向上就有更多空间,好看。

几何对象

几何对象 是图中用来表示数据的几何图形对象, 对应 ggplot2 的语法中的 geom_*, geom_point 就是点,geom_line 就是线,每个几何对象都可以通过 mapping 传入对应的数据映射,举几个例子,point 对象可以传入点 color, shape, fill, x, y 参数,来设置点的颜色,大小,形状,填充等等,每个几何对象可设置的参数具体可见上表。

练习题

  1. 折线图 geom_line, 箱线 geom_boxplot, 直方图 geom_histogram, 分区图 geom_area
  2. 自己运行即可;
  3. 是否显示图例;
  4. se 代表是否在图形中显示标准差;
  5. 没区别,因为数据映射是相同的,如果各个几何对象想要的映射相同,可以在 ggplot() 中统一设置,如果不同,可以在各自的图层中单独设置 mapping;
  6. 自行绘制,有问题 TidyFriday 中提问即可,就不一一绘制了。

统计变换

统计变换和几何对象是对应的。

练习题

  1. stat_summary 对应的是 geom_pointrange, geom_pointrange 默认的是 stat_identity, 我们可以自己设置:
1
2
3
4
5
6
ggplot(data = diamonds) +
geom_pointrange(
mapping = aes(x = cut, y = depth),
stat = "summary"
)
#> No summary function supplied, defaulting to `mean_se()
  1. geom_col 默认的是 stat_identity, 输入的是 x, y(height), geom_bar 默认的是 stat_bin, 输入 x 即可;
  2. 完整的对应关系可见前文;
  3. stat_smoooth 计算的结果有预测值 y, 置信区间的最大最小值,还有标准差;
  4. group = 1 将所有的数据看作一组,如果不设置,所有的 bar 将是等高的,..prop.. 代表计算那种统计变换,如 ..count.. 代表计数。

位置调整

我们以条形图为例来看 ggplot 支持的几种位置调整方式:

  • position = ‘identity’
1
2
3
ggplot(data = diamonds,
mapping = aes(x = cut, color = clarity)) +
geom_bar(fill = NA, position = "identity")

  • position = ‘fill’
1
2
3
ggplot(data = diamonds) +  
geom_bar(mapping = aes(x = cut, fill = clarity),
position = "fill")

  • position = ‘dodge’
1
2
3
ggplot(data = diamonds) +  
geom_bar(mapping = aes(x = cut, fill = clarity),
position = "dodge")

练习题

  1. 有些点被覆盖了,可以用 geom_point(position = 'jitter') 来缓解;
  2. width 和 height 分别用来控制抖动的水平和竖直位移;
  3. geom_jitter 通过位置抖动来缓解覆盖的情况, geom_count 对重叠点计数来改变点的大小来解决覆盖问题;
  4. 默认的是 position = 'identity',有些箱线图会重叠在一起。
1
2
ggplot(data = mpg, aes(x = drv, y = hwy, colour = class)) +
geom_boxplot(position = "identity")

坐标系

  • coord_flip 可以变换横纵坐标;
  • coord_quickmap 可以自适应地图的纵横比;
  • coord_polar 转换为极坐标系统。

练习题

1
2
3
ggplot(mpg, aes(x = factor(1), fill = drv)) +
geom_bar(width = 1) +
coord_polar(theta = "y")
  1. labs() 可以给图表添加 x, y 轴的 label 和标题等;
  2. geom_quickmap 可以调整地图的纵横比;
  3. coord_fixedgeom_abline 联合使用,可以产生一条 45 度的直线,可以很直观的看到城市和高速路况下的行驶里程情况。

好了,就先学习到这里,有问题欢迎一起交流!

# R

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×