前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >生信技能树七天学习小组 Day4笔记——R语言基础

生信技能树七天学习小组 Day4笔记——R语言基础

原创
作者头像
可乐同学与生信死磕到底
发布2024-03-25 22:11:32
1551
发布2024-03-25 22:11:32
举报

因为之前自己已经学习过R语言基础的一些内容,包括:数据类型与数据结构、函数与R包、R语言作图基础等,今天的学习内容主要是《R数据科学》这本书的第一章——使用ggplot2进行数据可视化。

结合《R数据科学》食用噢!?

1.1准备工作

ggplot2是tidyverse的一个核心R包,首先需要加载tidyverse

代码语言:r
复制
library(tidyverse)

此处用到内置数据mpg(mpg是一个数据框)

复习数据框的概念:变量(列)和观测(行)的矩形集合,数据框每一列都有一个唯一的列名,长度相等,同一列的数据类型需要一致,不同列的数据类型可以不一致。

1.2以mpg为例创建ggplot图形

代码语言:r
复制
ggplot(data = mpg)+
  geom_point(mapping = aes(x=displ,y=hwy))

?ggplot画图的入门级模板

以引擎大小displ为x轴,燃油效率hwy为y轴画点图,研究引擎大小和燃油效率之间的关系

由图可见,引擎大小与燃油效率之间呈负相关关系,也就是说,引擎大的汽车燃油效率低,更耗油。

ggplot(data=mpg) ggplot()函数绘图,ggplot()创建坐标系,地图一个参数data=指明对哪个数据集进行绘图

geom_point() 接下来是向ggplot()中添加图层,函数geom_point向图中添加一个点层

mapping参数定义如何将数据集中的变量映射为图形属性,mapping参数总是与aes()函数成对出现

注意:geom_point是函数,而mapping是它的参数

1.2.1 ggplot2绘图模板

代码语言:r
复制
ggplot(data = <DATA>)+
  <GEOM_FUNCTION>(mapping = aes(<MAPPINGS>))

在使用时将DATA、GEOM_FUNCTION、MAPPINGS分别替换为相应的数据集、几何对象函数(画什么类型的图)、映射集合(坐标轴内容)

1.2.2 练习部分

(1)运行ggplot(data=mpg),你会看到什么?

一张空白图
一张空白图

(2)数据集mpg中有多少行?多少列?

“能用代码解决的问题就不要手动去数”

mpg直接查看

dim(mpg)都可以解决

(3)变量drv的意义是什么?

代码语言:r
复制
?mpg

(4)使用hwy和cyl绘制一张散点图。

代码语言:r
复制
ggplot(data = mpg)+
  geom_point(mapping = aes(x=hwy,y=cyl))

(5)如果使用class和drv绘制散点图,会发生什么情况?为什么这张图没什么用处?

代码语言:r
复制
ggplot(data = mpg)+
  geom_point(mapping = aes(x=class,y=drv))

class和drv都是车的类型,用这两个参数作图并不能获得什么有用的信息

1.3 图形属性映射

1.3.1 基本定义

将数据集中的变量(列)映射为图形的属性(图中对象的可视化属性:数据点的大小、形状和颜色)

将图中点的颜色映射为变量class,来显示每辆汽车的类型:

代码语言:r
复制
ggplot(data = mpg)+
  geom_point(mapping = aes(x=displ,y=hwy,color=class))

也可以用同样的方式将class映射为点的大小

不建议将无序变量class映射为有序图形属性size

也可以将class映射为控制点透明度的alpha图形属性/点的形状

代码语言:r
复制
ggplot(data = mpg)+
  geom_point(mapping = aes(x=displ,y=hwy,alpha=class))
ggplot(data = mpg)+
  geom_point(mapping = aes(x=displ,y=hwy,shape=class))

ggplot2只能同时使用6种形状

1.3.2 手动设置图形属性

1.3.2.1让图中所有的点都变为蓝色

代码语言:r
复制
ggplot(data = mpg)+
  geom_point(mapping = aes(x=displ,y=hwy),color="blue")

这里的color和上面的color=class有什么区别?

(1)此时颜色不会传达关于变量的信息,仅仅改变图的外观

(2)手动设置图形属性时,是将其作为几何对象函数的一个参数,位置在aes()函数的外面

(3)图形属性要是有意义的值,例如颜色名称是一个字符串color="blue"

1.3.2.2手动设置图形的其他属性

点的大小

点的形状:数值 color和fill的区别

1.3.3 练习题

?R studio是色盲也!其实是因为代码错误咯,color="blue"跑到aes里面啦!

mpg中的哪些变量是分类变量?哪些变量是连续变量?当调用mpg时,如何才能看到这些信息?

代码语言:r
复制
glimpse(mpg)

显示为chr的是分类变量,为int的是连续变量。

将一个连续变量映射为color、size和shape。对分类变量和连续变量来说,这些图形属性的表现有什么不同?

color:连续变量使用的是同一种颜色,从浅到深

以连续变量cyl为例

代码语言:r
复制
ggplot(data = mpg) +
  geom_point(mapping = aes(x = displ, y = hwy, color = cyl))

size:一个区间的size对应不同的变量

代码语言:r
复制
ggplot(data = mpg) +
  geom_point(mapping = aes(x = displ, y = hwy, size = cyl))

shape:连续变量映射到shape中会报错

如果将同一个变量映射为多个图形属性,会发生什么情况?

将同一个变量(cyl)映射为2个图形属性(color,size)

代码语言:r
复制
ggplot(data = mpg) +
  geom_point(mapping = aes(x = displ, y = hwy, color = cyl,size=cyl))

如果将图形属性映射为非变量名对象,比如aes(color = displ < 5______),会发生什么情况?

代码语言:r
复制
ggplot(data = mpg) +
  geom_point(mapping = aes(x = displ, y = hwy, color = displ < 5))

1.4 常见问题

  • 用ggplot创建ggplot2图形时+放在一行代码的末尾
  • 解决问题的方法

1.5 分面

将图分割成多个分面

1.5.1 通过单个变量对图进行分面

facet_wrap()后面跟的是离散型变量

代码语言:r
复制
ggplot(data = mpg) +
  geom\_point(mapping = aes(x = displ, y = hwy))+
  facet\_wrap(~class,nrow=2)

1.5.2 通过两个变量对图进行分面

facet_grid

代码语言:r
复制
ggplot(data = mpg) +
  geom\_point(mapping = aes(x = displ, y = hwy))+
  facet\_grid(drv~cyl)

1.5.3 练习题

(1)如果使用连续变量进行分面,会发生什么情况?

见上图

(2)在使用facet_grid(drv ~ cyl)生成的图中,空白单元的意义是什么?它们和以下代码生成的图有什么关系?

空白单元代表没有drv值和cyl值对应的组合

(3)以下代码会绘制出什么图?“.”的作用是什么?

“.”的作用表示不在行或列的维度分面

“.”在前表示不按行分面,在后表示不按列分面

代码语言:r
复制
ggplot(data = mpg) +
  geom_point(mapping = aes(x = displ, y = hwy)) +
  facet_grid(drv ~ .)
代码语言:r
复制
ggplot(data = mpg) +
  geom_point(mapping = aes(x = displ, y = hwy)) +
  facet_grid(. ~ cyl)

(4)查看本节的另一个分面图:与使用图形属性相比,使用分面的优势和劣势分别是什么?如果有一个更大的数据集,你将如何权衡这两种方法的优劣?

优势:根据想要观测的变量将数据分为每一分面,显示出每一分面中的趋势及不同分面之间的差别

劣势:由于数据被分割为一个个的分面,数据整体的趋势就看不出来了

如果有一个更大的数据集,就需要根据目标判断,如果看整体趋势的话就不用分面,如果看单个变量的变化趋势就可以使用分面

(5)阅读?facet_wrap的帮助页面。nrow和ncol的功能分别是什么?还有哪些选项可以控制分面的布局?为什么函数facet_grid()没有变量nrow和ncol?

facet_grid()只会是单列或者单行,不需要nrow和ncol这两个参数。

(6)在使用函数facet_grid()时,一般应该将具有更多唯一值的变量放在列上。为什么这么做呢?

1.6 几何对象

1.6.1 几何对象的定义

几何对象:图中用来表示数据的几何图形对象

条形图:使用了条形几何对象

折线图:使用了直线几何对象

箱线图:使用了矩形和直线几何对象

可以使用不同的几何对象来表示同样的数据

1.6.2 几何对象函数

geom_point()

geom_smooth()

ggplot2中的每个几何对象函数都有一个mapping参数

同一张图中可以放置多个几何对象

代码语言:r
复制
ggplot(data = mpg)+
  geom_point(mapping = aes(x=displ,y=hwy))+
  geom_smooth(mapping = aes(x=displ,y=hwy))
代码语言:r
复制
ggplot(data = mpg,mapping = aes(x=displ,y=hwy))+
  geom_point()+
  geom_smooth()

这里x、y传递给了ggplot()函数作为全局映射

可以在不同的图层中显示不同的图形属性:

代码语言:r
复制
ggplot(data = mpg,mapping = aes(x=displ,y=hwy))+
  geom_point(mapping = aes(color=class))+
  geom_smooth()

1.6.3 练习题

(1)在绘制折线图、箱线图、直方图和分区图时,应该分别使用哪种几何对象?

geom_line、geom_boxplot、geom_histogram、facet_grid

(2)在脑海中运行以下代码,并预测会有何种输出。接着在R中运行代码,并检查你的预测是否正确。

代码语言:r
复制
ggplot(
  data = mpg,
  mapping = aes(x = displ, y = hwy, color = drv)
) +
  geom_point() +
  geom_smooth(se = FALSE)

(3)show.legend = FALSE的作用是什么?删除它会发生什么情况?为什么要在本章前面的示例中使用这句代码?

不显示图例

(4)geom_smooth()函数中的se参数的作用是什么?

六张图的作图代码与不同的拼图方法

代码语言:r
复制
p1 <- ggplot(data = mpg, mapping = aes(displ, hwy)) +
  geom_point(size = 2.5) +
  geom_smooth(se = F, size = 1.5)

p2 <- ggplot(data = mpg, mapping = aes(displ, hwy)) +
  geom_point(size = 2.5) +
  geom_smooth(se = F, size = 1.5, mapping = aes(group = drv))

p3 <- ggplot(data = mpg, mapping = aes(displ, hwy, color = drv)) +
  geom_point(size = 2.5) +
  geom_smooth(se = F, size = 1.5, mapping = aes(group = drv, color = drv))

p4 <- ggplot(data = mpg, mapping = aes(displ, hwy)) +
  geom_point(size = 2.5, mapping = aes(color = drv)) +
  geom_smooth(se = F, size = 1.5)

p5 <- ggplot(data = mpg, mapping = aes(displ, hwy)) +
  geom_point(size = 2.5, mapping = aes(color = drv)) +
  geom_smooth(se = F, size = 1.5, mapping = aes(group = drv, linetype = drv))

p6 <- ggplot(data = mpg, mapping = aes(displ, hwy)) +
  geom_point(size = 2.5, mapping = aes(color = drv))

# 方法一
library(gridExtra)
grid.arrange(p1, p2, p3, p4, p5, p6, nrow = 3, ncol = 2)
# 方法二
library(cowplot)
plot_grid(p1, p2, p3, p4, p5, p6, nrow = 3, ncol = 2, labels = c("A","B","C","D","E","F"))
#方法三
library(patchwork)
p1 + p2 + p3 + p4 + p5 + p6 + plot_layout(nrow = 3) + plot_annotation(tag_levels = 'A')

1.7 统计变换

1.7.1 统计变换的定义

统计变换(statistical transformation, stat):绘图时用来计算新数据的算法

stat_count()可以替换geom_bar()

每个几何对象函数都有一个默认统计变换

每个统计变换函数都有一个默认几何对象

1.7.2 练习题

(1)stat_summary()函数的默认几何对象是什么?不使用统计变换函数的话,如何使用几何对象函数重新生成下列图形?

stat_summary()函数的默认几何对象:pointrange

geom_pointrange用于绘制数据点的范围

(2)geom_col()函数的功能是什么?它和geom_bar()函数有何不同?

(3)多数几何对象和统计变换都是成对出现的,总是配合使用。仔细阅读文档,列出所有成对的几何对象和统计变换。它们有什么共同之处?

(4)stat_smooth()函数会计算出什么变量?哪些参数可以控制它的行为?

(5)在比例条形图中,我们需要设定group = 1,这是为什么呢?换句话说,以下两张图会有什么问题?

任何图形都是数据集、几何对象、映射集合、统计变换、位置调整、坐标系和分面模式的一个组合!

代码语言:r
复制
    ggplot(data = <DATA>) + 
      <GEOM_FUNCTION>( mapping = aes(<MAPPINGS>), stat = <STAT>, position = <POSITION>) +
      <COORDINATE_FUNCTION> + 
      <FACET_FUNCTION> 

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1.1准备工作
  • 1.2以mpg为例创建ggplot图形
    • 1.2.1 ggplot2绘图模板
      • 1.2.2 练习部分
      • 1.3 图形属性映射
        • 1.3.1 基本定义
          • 1.3.2 手动设置图形属性
            • 1.3.2.1让图中所有的点都变为蓝色
            • 1.3.2.2手动设置图形的其他属性
          • 1.3.3 练习题
          • 1.4 常见问题
          • 1.5 分面
            • 1.5.1 通过单个变量对图进行分面
              • 1.5.2 通过两个变量对图进行分面
                • 1.5.3 练习题
                • 1.6 几何对象
                  • 1.6.1 几何对象的定义
                    • 1.6.2 几何对象函数
                      • 1.6.3 练习题
                      • 1.7 统计变换
                        • 1.7.1 统计变换的定义
                          • 1.7.2 练习题
                          领券
                          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
                          http://www.vxiaotou.com