R语言数据分析(三)

R语言数据分析(三)


文章目录


#前言

前面我们已经学习了基本的数据导入的知识,这一节,我们将来介绍数据分析中很重要的一个模块,数据可视化的内容。R中数据可视化有很多可以实现的包,而ggplot2是其中最常用的包之一,我们接下来就对其进行介绍。(需提前加载tidyverse包)

一、可视化步骤

我们将使用palmerpenguins包中企鹅数据集来进行可视化的研究。

r 复制代码
# 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()开始绘图,这将定义一个绘图对象,然后添加图层。其中的第一个参数是图形中要使用的数据集,由于我们还没有告诉它要怎么可视化,所以它是空的:

r 复制代码
ggplot(data = penguins)

接下来,要告诉ggplot()如何表示数据中的信息。该函数的mapping参数定义了如何将数据集中的变量映射到绘图的视觉属性(美学aesthetics)中。mapping的参数在aes()函数中进行定义:

r 复制代码
ggplot(
  data = penguins,
  mapping = aes(x = flipper_length_mm, y = body_mass_g)
)

此时空画布上有了更多的结构了,xy轴的信息已经展现在画布上了。

接下来,我们要定义一个几何图形,用于表述数据。ggplot2中可用的几何对象,其函数以geom_开头。比如折线图使用(geom_line)来表示等。使用方法如下:

r 复制代码
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()内部进行设定。

r 复制代码
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()顶部的图层进行添加,这里我们指定使用线性模型来绘制拟合曲线:

r 复制代码
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参数即可。

r 复制代码
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包中,是一种对色盲友好的颜色组合。

r 复制代码
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()的前两个参数的名称可以省略:

r 复制代码
ggplot(penguins, aes(x = flipper_length_mm, y = body_mass_g))

这通常可以和管道函数联用:

r 复制代码
penguins |> 
  ggplot(aes(x = flipper_length_mm, y = body_mass_g))

二、可视化分布

可视化变量如何分布取决于变量的类型是分类变量还是数值变量。

2.1 分类变量

如果变量只能在特定范围内选择一个,则是分类变量。考察分类变量的分布可以使用条形图,图的高度显示每个x观测值的数量。

r 复制代码
ggplot(penguins, aes(x = species)) +
  geom_bar()

可以看到条形图并未按照一定顺序进行排序,可以通过一定的设置实现排序(后续将会继续介绍关于此函数的高阶技巧):

r 复制代码
ggplot(penguins, aes(x = fct_infreq(species))) +
  geom_bar()

2.2 数值变量

如果变量采用的是各种数值,并且可以对这些数值进行加减求平均等操作,改变量就是数值变量。数值变量可以是连续的也可以是离散的。

连续数值变量的一种常用的可视化方式是直方图。

r 复制代码
ggplot(penguins, aes(x = body_mass_g)) +
  geom_histogram(binwidth = 200)

直方图将x轴分为等间距的条柱,然后使用条形图的高度显示落在每个条柱之间的观测值的数量。可以使用binwidth参数来设置直方图中间隔的宽度,该参数以x变量的单位进行测量。使用直方图的时候,应该始终探索各种binwidth,来找到合适的模式。

另一种可视化方式是密度图。它是直方图的平滑版本。

r 复制代码
ggplot(penguins, aes(x = body_mass_g)) +
  geom_density()

三、可视化关系

为了可视化某些数据的关系,我们至少要在美学中加入两个变量。

3.1 数值变量和分类变量

这些关系可以使用箱型图来展示。该图主体的箱型展示了数据的中位数、1/4位数和3/4位数。两端的竖线为延伸至最远处的非异常点,从箱边往外大于1.5倍的四分位数的值被认为是异常值,将被标出。

r 复制代码
ggplot(penguins, aes(x = species, y = body_mass_g)) +
  geom_boxplot()

或者也可以制作密度图:

r 复制代码
ggplot(penguins, aes(x = body_mass_g, color = species, fill = species)) +
  geom_density(linewidth = 0.8, alpha = 0.3) # 可自行设置

3.2 两个分类变量

两个分类变量之间的关系往往会选择使用堆积图来展示。

r 复制代码
ggplot(penguins, aes(x = island, fill = species)) +
  geom_bar()

另外,可以通过设置geom_bar(position = "fill")来创建相对丰度的图。

3.3 两个数值变量

散点图是该类变量最常选择的图形。前面有过介绍,可以使用geom_point和geom_smooth结合。

3.4 三个或更多变量

更多变量可以在美学参数中设置不同的美学来进行区分,比如:

r 复制代码
ggplot(penguins, aes(x = flipper_length_mm, y = body_mass_g)) +
  geom_point(aes(color = species, shape = island))

但是这样的图形会显得比较杂乱,因此我们介绍另一种方式,就是将绘图拆分成为多个分面,每个分面显示一个数据子集的子图。这会使用到facet_wrap(),其第一个参数是一个formula,使用~后跟一个变量名称,传递到其中的变量应该是分类的变量。

r 复制代码
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将会从当前绘图设备中获取尺寸。

r 复制代码
ggplot(penguins, aes(x = flipper_length_mm, y = body_mass_g)) +
  geom_point()
ggsave(filename = "penguin-plot.png") # 它将会把当前终端命令运行的上一个绘图命令绘制的图形进行存储

总结

在这一节,我们初步学习了如何使用R语言的ggplot2进行数据可视化,也学习了很多类型的图形的画法。我们知道了如何在ggplot绘图时设置相应的美学参数以达到不同的作用效果,另外对于不同类型的数据也分别有不同类型的图形可以很好的展示其中数据的关系。这些对应关系所给出的图形示例都不是唯一的答案,要学会自己去学习新的图形的绘图方法,这是很重要的。

相关推荐
GrowingIO技术社区44 分钟前
CDP项目如何评估?从业务问题到能力测试
大数据·数据分析
衡石科技1 小时前
衡石高性能分析架构:HQL、查询下推与多层加速的协同设计
架构·数据分析
Zhao-Jichao1 小时前
AI Prompting for Everyone 课程笔记 - P21 总结 Conclusion
人工智能·笔记
欢欢李2 小时前
【LTE L3 笔记 05】LTE同步信号
笔记·无线通信·物理层·lte·空口协议
GrowingIO技术社区2 小时前
多端用户身份怎么统一?OneID规则与验收清单
大数据·数据挖掘·数据分析
La Pulga3 小时前
【FreeRTOS源码学习笔记】空闲任务与阻塞延时
笔记·mcu·学习·嵌入式·freertos·实时操作系统
蒸蒸yyyyzwd3 小时前
秋招学习笔记 day106
笔记·学习
小李不想当小白4 小时前
WDG看门狗(STM32标准库学习笔记)
笔记·stm32·单片机·嵌入式硬件·学习·嵌入式
欢欢李5 小时前
【LTE L3 笔记 04】LTE帧结构
笔记·无线通信·物理层·lte·空口协议
Zhao-Jichao7 小时前
AI Prompting for Everyone 课程笔记 - P20 实验与期末项目 Lab and Final Project
前端·人工智能·笔记