R语言数据分析(三)
文章目录
- R语言数据分析(三)
- 一、可视化步骤
- 1.1 创建ggplot
- 1.2 添加美学和图层
- 1.3 简化代码
- 二、可视化分布
- 2.1 分类变量
- 2.2 数值变量
- 三、可视化关系
- 3.1 数值变量和分类变量
- 3.2 两个分类变量
- 3.3 两个数值变量
- 3.4 三个或更多变量
- 四、保存可视化结果
- 总结
#前言
前面我们已经学习了基本的数据导入的知识,这一节,我们将来介绍数据分析中很重要的一个模块,数据可视化的内容。R中数据可视化有很多可以实现的包,而ggplot2
是其中最常用的包之一,我们接下来就对其进行介绍。(需提前加载tidyverse包)
一、可视化步骤
我们将使用palmerpenguins
包中企鹅数据集来进行可视化的研究。
# install.packages("palmerpenguins")
library(palmerpenguins)
penguins
#> # A tibble: 344 × 8
#> species island bill_length_mm bill_depth_mm flipper_length_mm body_mass_g
#> <fct> <fct> <dbl> <dbl> <int> <int>
#> 1 Adelie Torgersen 39.1 18.7 181 3750
#> 2 Adelie Torgersen 39.5 17.4 186 3800
#> 3 Adelie Torgersen 40.3 18 195 3250
#> 4 Adelie Torgersen NA NA NA NA
#> 5 Adelie Torgersen 36.7 19.3 193 3450
#> 6 Adelie Torgersen 39.3 20.6 190 3650
#> 7 Adelie Torgersen 38.9 17.8 181 3625
#> 8 Adelie Torgersen 39.2 19.6 195 4675
#> 9 Adelie Torgersen 34.1 18.1 193 3475
#> 10 Adelie Torgersen 42 20.2 190 4250
#> # ℹ 334 more rows
#> # ℹ 2 more variables: sex <fct>, year <int>
该数据集包括8列,其中变量包括企鹅的物种等一系列列名元素。可以通过?penguins
查看具体信息。下面将一步步讲解可视化的过程。
1.1 创建ggplot
第一步就是使用函数ggplot()
开始绘图,这将定义一个绘图对象,然后添加图层。其中的第一个参数是图形中要使用的数据集,由于我们还没有告诉它要怎么可视化,所以它是空的:
ggplot(data = penguins)
接下来,要告诉ggplot()
如何表示数据中的信息。该函数的mapping参数定义了如何将数据集中的变量映射到绘图的视觉属性(美学aesthetics)中。mapping的参数在aes()
函数中进行定义:
ggplot(data = penguins,mapping = aes(x = flipper_length_mm, y = body_mass_g)
)
此时空画布上有了更多的结构了,xy轴的信息已经展现在画布上了。
接下来,我们要定义一个几何图形,用于表述数据。ggplot2中可用的几何对象,其函数以geom_
开头。比如折线图使用(geom_line
)来表示等。使用方法如下:
ggplot(data = penguins,mapping = aes(x = flipper_length_mm, y = body_mass_g)
) + geom_point()
#> Warning: Removed 2 rows containing missing values (`geom_point()`).
使用这个图可用得到一些数据的信息。但是我们看到有警告信息:“Removed 2 rows containing missing values”。这是因为数据集中有两只企鹅缺少相关信息。(后续将隐藏警告信息)
1.2 添加美学和图层
我们想要进一步观察每个物种间的数据关系要怎么做呢?我们可用通过不同颜色的点来表示物种来做到这一点。为了实现这一点,可以在aes()
内部进行设定。
ggplot(data = penguins,mapping = aes(x = flipper_length_mm, y = body_mass_g, color = species)
) +geom_point()
当分类变量映射到美学参数时,ggplot2会自动为变量的每个唯一级别分配美学的唯一值(这里分配的是颜色),这一过程称为缩放(scaling)。之后ggplot2还会添加一个图例,解释哪些值对应哪些级别。
现在让我们在添加一层,显示xy轴数据之间关系的平滑曲线。我们使用geom_smooth()
函数作为geom_point()
顶部的图层进行添加,这里我们指定使用线性模型来绘制拟合曲线:
ggplot(data = penguins,mapping = aes(x = flipper_length_mm, y = body_mass_g, color = species)
) + geom_point() +geom_smooth(method = "lm")
我们可以看到此时的拟合曲线是根据物种不同分别进行拟合的,这是由于ggplot中的aes参数定义了全局的美学映射,他会传递到后续的图层中。其实,后续的图层也可以选择自己的局部映射,只需在geom函数中设置mapping参数即可。
ggplot(data = penguins,mapping = aes(x = flipper_length_mm, y = body_mass_g)
) + geom_point(aes(color = species, shape = species)) +geom_smooth(method = "lm")
注意,还可以为美学参数设置形状的美学,使用shape
参数进行设定即可。
最后,我们可以在新图层中使用lab()
函数更改绘图的标签,也可以使用scale_color_colorblind()
函数更改调色板,这个函数存在于ggthemes包中,是一种对色盲友好的颜色组合。
ggplot(data = penguins,mapping = aes(x = flipper_length_mm, y = body_mass_g)
) +geom_point(aes(color = species, shape = species)) +geom_smooth(method = "lm") +labs(title = "Body mass and flipper length",subtitle = "Dimensions for Adelie, Chinstrap, and Gentoo Penguins",x = "Flipper length (mm)", y = "Body mass (g)",color = "Species", shape = "Species") +ggthemes::scale_color_colorblind()
1.3 简化代码
ggplot()
的前两个参数的名称可以省略:
ggplot(penguins, aes(x = flipper_length_mm, y = body_mass_g))
这通常可以和管道函数联用:
penguins |> ggplot(aes(x = flipper_length_mm, y = body_mass_g))
二、可视化分布
可视化变量如何分布取决于变量的类型是分类变量还是数值变量。
2.1 分类变量
如果变量只能在特定范围内选择一个,则是分类变量。考察分类变量的分布可以使用条形图,图的高度显示每个x
观测值的数量。
ggplot(penguins, aes(x = species)) +geom_bar()
可以看到条形图并未按照一定顺序进行排序,可以通过一定的设置实现排序(后续将会继续介绍关于此函数的高阶技巧):
ggplot(penguins, aes(x = fct_infreq(species))) +geom_bar()
2.2 数值变量
如果变量采用的是各种数值,并且可以对这些数值进行加减求平均等操作,改变量就是数值变量。数值变量可以是连续的也可以是离散的。
连续数值变量的一种常用的可视化方式是直方图。
ggplot(penguins, aes(x = body_mass_g)) +geom_histogram(binwidth = 200)
直方图将x轴分为等间距的条柱,然后使用条形图的高度显示落在每个条柱之间的观测值的数量。可以使用binwidth参数来设置直方图中间隔的宽度,该参数以x变量的单位进行测量。使用直方图的时候,应该始终探索各种binwidth,来找到合适的模式。
另一种可视化方式是密度图。它是直方图的平滑版本。
ggplot(penguins, aes(x = body_mass_g)) +geom_density()
三、可视化关系
为了可视化某些数据的关系,我们至少要在美学中加入两个变量。
3.1 数值变量和分类变量
这些关系可以使用箱型图来展示。该图主体的箱型展示了数据的中位数、1/4位数和3/4位数。两端的竖线为延伸至最远处的非异常点,从箱边往外大于1.5倍的四分位数的值被认为是异常值,将被标出。
ggplot(penguins, aes(x = species, y = body_mass_g)) +geom_boxplot()
或者也可以制作密度图:
ggplot(penguins, aes(x = body_mass_g, color = species, fill = species)) +geom_density(linewidth = 0.8, alpha = 0.3) # 可自行设置
3.2 两个分类变量
两个分类变量之间的关系往往会选择使用堆积图来展示。
ggplot(penguins, aes(x = island, fill = species)) +geom_bar()
另外,可以通过设置geom_bar(position = "fill")
来创建相对丰度的图。
3.3 两个数值变量
散点图是该类变量最常选择的图形。前面有过介绍,可以使用geom_point
和geom_smooth
结合。
3.4 三个或更多变量
更多变量可以在美学参数中设置不同的美学来进行区分,比如:
ggplot(penguins, aes(x = flipper_length_mm, y = body_mass_g)) +geom_point(aes(color = species, shape = island))
但是这样的图形会显得比较杂乱,因此我们介绍另一种方式,就是将绘图拆分成为多个分面,每个分面显示一个数据子集的子图。这会使用到facet_wrap()
,其第一个参数是一个formula,使用~
后跟一个变量名称,传递到其中的变量应该是分类的变量。
ggplot(penguins, aes(x = flipper_length_mm, y = body_mass_g)) +geom_point(aes(color = species, shape = species)) +facet_wrap(~island)
四、保存可视化结果
制作出的图形,可能会希望保存起来使用。这就可以通过ggsave()
进行。它可以把最近创建的图形保存在磁盘中。如果不指定width和height,ggsave将会从当前绘图设备中获取尺寸。
ggplot(penguins, aes(x = flipper_length_mm, y = body_mass_g)) +geom_point()
ggsave(filename = "penguin-plot.png") # 它将会把当前终端命令运行的上一个绘图命令绘制的图形进行存储
总结
在这一节,我们初步学习了如何使用R语言的ggplot2
进行数据可视化,也学习了很多类型的图形的画法。我们知道了如何在ggplot绘图时设置相应的美学参数以达到不同的作用效果,另外对于不同类型的数据也分别有不同类型的图形可以很好的展示其中数据的关系。这些对应关系所给出的图形示例都不是唯一的答案,要学会自己去学习新的图形的绘图方法,这是很重要的。