生物信息学

2.3 基于R语言的数据可视化实践





桂松涛 Blog
songtaogui@163.com

R的历史和特点


S语言 => R语言

  • 1976年, S语言诞生于贝尔实验室 (与C语言, Unix系统同宗);

  • 与Unix命运类似, S语言的商业版S-PLUS不方便进行教学;

  • 1997年, Robert Gentleman和Ross Ihaka等开发了R语言用于教学;

  • R官网: http://www.r-project.org/

R的特点

  • 强交互, 支持复杂算法描述, 图形功能强;

  • 集成现代统计方法的实现;

  • 统计和科研工作者经常用R开发新算法 => 滚雪球了属于是;

  • 函数式编程, 支持对象类和类方法;

  • 动态类型语言, 解释执行, 运行速度较慢;


R语言学习参考资料





R语言基本语法速递


# <-, =

# +, -, *, /, ^

# sqrt, exp, log, log10, log2

# round, floor, ceiling

# 自定义函数
my_add <- function(x,y){x+y}

# I/O:
# I: read.table, read.csv, read.delim
# O: print, cat, write

# 向量
v1 <- 1:10
v1 + 100  # 四则运算自动广播
v1 * 2

v2 <- 21:30
v2 - v1   # 等长向量可进行四则运算

# 数据类型: 逻辑型, 字符串, 数字 ...

# 数据结构: 向量, 矩阵, 列表, 数据框 ...

# 向量的下标和子集
v1[2]
v1[c(1,3)]
v1[3:5]
v1[c(-1,-10)]
v1[v1>5] # 逻辑下标

# 数据框 dataframe
d <- data.frame(
    name=c("李明", "张聪", "王建"), 
    age=c(30, 35, 28), 
    height=c(180, 162, 175),
    stringsAsFactors=FALSE
)
##   name age height
## 1 李明  30    180
## 2 张聪  35    162
## 3 王建  28    175

# 流程控制
## 判断
if(CONDITION1){
    EXPR1
}else if(CONDITION2){
    EXPR2
}else{
    EXPR3
}

ifelse(CONDITION, EXPR-TRUE, EXPR-FALSE) # ? : 

## 循环
for(i in 1:5){
    # do sth...
}

while(CONDITION){
    # do sth...
}

repeat{
    # do sth...
    if(CONDITION){break}
}

# 基本统计函数
min, max, median, sd, quantile

# 基本统计检验
t.test
wilcox.test
cor.test
chisq.test

# 聚类分析
kmeans
hclust, dist


R语言绘图


科学需要可视化


R语言绘图


大批量数据需要基于编程语言绘图


R语言绘图


R的基本绘图语法: 略, 课下自学 基于ggplot2的R语言绘图√

Grammar of Graphics

R语言绘图: ggplot2语法


Grammar of Graphics

ggplot2中的图形部件

  1. data: data.frame

  2. aes: 数据到图形的映射属性

    • 坐标轴 x, y

    • 颜色 color

    • 元素大小 size

    • 形状 shape

    • 透明度 alpha

  3. geoms: 几何形状

  1. stats: 统计变换

  2. scales: 标度设置

  3. coord: 坐标系统

  4. facet: 分面/切片

  5. layer: 图层

  6. theme: 主题风格

  7. save: 保存/输出


R语言绘图: Geoms

折线图: geomline, geomabline, geomhline, geomvline
柱形图: geombar, geomcol, stat_count
热图: geombin2d, geomtile, geomhex, geom_raster
箱线图: geom_boxplot
轮廓图: geomcontour, geomcontour_filled
密度图: geomdensity, geomdensity2d, geomdensity2dfilled
散点图: geompoint, geomdotplot, geom_jitter
区间图: geomcrossbar, geomerrorbar, geomlinerange, geompointrange
地图: geom_map
路径图: geompath, geomstep
多边形图: geomrect, geompolygon
条带和范围: geomribbon, geomarea, geom_smooth
线段和曲线: geomsegment, geomcurve
文字: geomtext, geomlabel
小提琴图: geom_violin

复杂图是简单元素的组合




Gui, S., Wei, W., et al. A pan-Zea genome map for enhancing maize improvement. Genome Biol 23, 178 (2022).

作图的一般原则



好的数据, 好的展现形式, 好的审美
用尽可能少的元素表示尽可能多的数据

分类变量的作图优先级

  • 不同分组

  • 不同颜色

  • 三维动态

  • 不同符号

使用区分度强的颜色而不是渐变色
数值型变量的作图优先级

  • 同一坐标轴上的不同位置

  • 不同轴上的位置

  • 不同长度

  • 不同角度或者斜率

  • 不同面积

  • 三维空间中的不同位置

  • 颜色的不同明暗度

  • 不同颜色饱和度

  • 曲线的不同曲率

  • 三维体积


ggplot2作图实践



帕尔默企鹅数据集: 嘴巴越长的企鹅,嘴巴也会越厚么?

> library(ggplot2)
> library(palmerpenguins)

> head(penguins)
n | species island    | bill_length_mm | bill_depth_mm | flipper_length_mm | body_mass_g |
t | <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 |

> str(penguins)
$ species          : Factor w/ 3 levels "Adelie","Chinstrap",..: 1 1 1 1 1 1 1 1 1 1 ...
$ island           : Factor w/ 3 levels "Biscoe","Dream",..: 3 3 3 3 3 3 3 3 3 3 ...
$ bill_length_mm   : num [1:344] 39.1 39.5 40.3 NA 36.7 39.3 38.9 39.2 34.1 42 ...
$ bill_depth_mm    : num [1:344] 18.7 17.4 18 NA 19.3 20.6 17.8 19.6 18.1 20.2 ...
$ flipper_length_mm: int [1:344] 181 186 195 NA 193 190 181 195 193 190 ...
$ body_mass_g      : int [1:344] 3750 3800 3250 NA 3450 3650 3625 4675 3475 4250 ...
$ sex              : Factor w/ 2 levels "female","male": 2 1 1 NA 1 2 1 2 NA NA ...
$ year             : int [1:344] 2007 2007 2007 2007 2007 2007 2007 2007 2007 2007 ...


ggplot2作图实践

帕尔默企鹅数据集: 嘴巴越长的企鹅,嘴巴也会越厚么?

学生A: "破案了! 喙厚度和喙长度成反比, 说明嘴短的企鹅, 嘴更厚, 与原假设相反! 毕业! 能毕业了~!"

学生B: "发表! 必须马上发表! 我昨天帮你带饭了, 给我个共一不过份吧?"


老师: "你俩再延一年吧🙂"

ggplot2作图实践

帕尔默企鹅数据集: 嘴巴越长的企鹅,嘴巴也会越厚么?

ggplot2作图实践

帕尔默企鹅数据集: 嘴巴越长的企鹅,嘴巴也会越厚么?


# 感觉有点不对劲, 但又说不上来:
ggplot(penguins,aes(x = bill_depth_mm, y = bill_length_mm)) +
    geom_point() + 
    geom_smooth(method="lm") + 
    theme_bw(base_size=18)

# 这下舒服了:
ggplot(penguins,aes(x = bill_depth_mm, y = bill_length_mm, color = species)) + 
    geom_point() + 
    geom_smooth(method="lm") + 
    theme_bw(base_size=18)

# 加亿点点细节
ggplot(penguins, # 选择x轴,y轴数据映射, 以及颜色映射
            aes(x = bill_depth_mm,
                y = bill_length_mm,
                color = species)) + 
    geom_point(size=4,alpha=0.7) + # 点的大小和透明度
    geom_smooth(method="lm") + # 线性回归拟合
    scale_color_brewer(palette="Dark2") + # 配色方案
    labs(x = "Bill depth (mm)",   # x轴标题
         y = "Bill length (mm)",  # y轴标题
         title = "Flipper and bill length correlation" # 总标题
         ) + 
    theme_bw(base_size=18) + # 纯白主题, 总字体大小
    theme(legend.position=c(0.1, 0.15)) # 图列位置


拓展学习资料推荐


Friends Don't Let Friends Make Bad Graphs
配色方案网站推荐