生信学习——基于R的可视化习题30个(附详细答案解读)

2023-11-04

题目目录


写在前面——这是R语言学习的最后一个习题集,本文主要介绍如何使用R语言进行数据可视化,帮助我们直观的看清数据的含义。绘图函数千变万化,不可能把所有的函数全部记下来。要熟练使用帮助文档,不会的时候多翻翻代码,需要长时间积累才能熟练掌握R绘图。

题目原文:http://www.bio-info-trainee.com/4387.html
参考答案:https://www.jianshu.com/p/fab27c63af94
参考答案:https://www.jianshu.com/p/8fce9d2ad562

一、基础绘图

# 准备数据
rm(list = ls())
options(stringsAsFactors = F)

library(airway)
data("airway")
airway 

RNAseq_expr <- assay(airway)
dim(RNAseq_expr)
colnames(RNAseq_expr) 
RNAseq_expr[1:4,1:4] 

RNAseq_gl <- colData(airway)[,3]
table(RNAseq_gl)

1. 对RNAseq_expr的每一列绘制boxplot图

boxplot(RNAseq_expr)

在这里插入图片描述

2. 对RNAseq_expr的每一列绘制density图

# 去除无用值(列之和小于等于1的数据)
e1 <- RNAseq_expr[apply(RNAseq_expr, 1, function(x) sum(x>0)>1), ] 

dim(RNAseq_expr)
# [1] 64102     8
dim(e1)
# [1] 28877     8
                        
plot(density(RNAseq_expr))
plot(density(e1))                        

在这里插入图片描述

在这里插入图片描述


3. 对RNAseq_expr的每一列绘制条形图

# 没经过处理的图,瞄一眼就行了,没啥意义
barplot(RNAseq_expr)

在这里插入图片描述


4. 对RNAseq_expr的每一列取log2后重新绘制boxplot图,density图和条形图

e2 <- log2(e1+1)

# 取log2之后的数据绘图看着舒服多了
# 针对源数据数值较大且差值也比较大时,可以考虑log一下
boxplot(e2)
plot(density(e2))
barplot(e2)

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述


5. 对Q4的3个图里面添加 trt 和 untrt 组颜色区分开来

# 箱线图
boxplot(e2, main = 'Boxplot of RNAseq-expr',
        xlab = 'samples',ylab = 'expression',col = RNAseq_gl)

# 密度图
# 生成一个可以修改的当前图形参数列表
opar <- par(no.readonly=T)
par(mfrow = c(3,3))
for (i in c(1:8)) {
  plot(density(e2[,i]), col=as.integer(RNAseq_gl)[i], main = paste("Density", i))
}
# 将参数重置为修改之前的值
par(opar)

# 如果不小心直接修改了par(),重启RStudio即可恢复默认值

# 直方图
barplot(e2, main = 'Barplot of RNAseq-expr',
        xlab = 'samples',ylab = 'expression', border = NA, col = RNAseq_gl)

# 此时图非常诡异,取个小子集看看什么情况
e3 <- e2[1:10,]
barplot(e3, main = 'Barplot of RNAseq-expr',
        xlab = 'samples',ylab = 'expression', border = NA, col = RNAseq_gl)

可以看到,我们想要的结果是每列的颜色根据分组依次变换 但是,图的颜色是在每列中依次变换的
原因是barplot中,数据如果是矩阵,且beside为FALSE(默认),那么图中的每列是由这列数据逐个堆叠而成的,所以颜色也是逐个赋予的

解释有点乱,附上原文
barplot(height, …)
height: either a vector or matrix of values describing the bars which make up the plot. If height is a vector, the plot consists of a sequence of rectangular bars with heights given by the values in the vector. If height is a matrix and beside is FALSE then each bar of the plot corresponds to a column of height, with the values in the column giving the heights of stacked sub-bars making up the bar. If height is a matrix and beside is TRUE, then the values in each column are juxtaposed rather than stacked.

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述


6. 对RNAseq_expr的前两列画散点图并且计算线性回归方程

e4 <- as.data.frame(e2)
# 'data' must be a data.frame, not a matrix or an array
fit <- lm(e4[,1] ~ e4[,2], data = e4)
fit

# Call:
# lm(formula = e4[, 1] ~ e4[, 2], data = e4)
# 
# Coefficients:
# (Intercept)      e4[, 2]  
#      0.2105       0.9868 

# 原数据差值较大,使用log2处理后的数据
plot(RNAseq_expr[,1:2])
plot(e2[,1:2])

abline(fit, col = "red")

在这里插入图片描述

在这里插入图片描述


7. 对RNAseq_expr的所有列两两之间计算相关系数,并且热图可视化

M <- cor(e2)
pheatmap::pheatmap(M)

在这里插入图片描述


8. 取RNAseq_expr第一行表达量绘制折线图

plot(e2[1,], type="b", xlab = "gene", ylab="expression", col="red")

# type="b"是最常见的折线图
# type
p     只有点
l     只有线
o     实心点和线(即线覆盖在点上)
b、c  线连接点(c 时不绘制点)
s、S  阶梯线
h     直方图式的垂直线
n     不生成任何点和线(通常用来为后面的命令创建坐标轴)

在这里插入图片描述


9. 取RNAseq_expr表达量最高的10个基因的行绘制多行折线图

top10 <- e2[names(tail(sort(rowSums(e2)), 10)), ]
top10

# 设置横纵坐标的区间
library(reshape2)
yrange <- range(melt(top10)[,3])
yrange 
# [1] 16.15977 18.97075
yrange <- c(16,19)
xrange <- c(1,8)

# 绘图
# plot()函数是在被调用时创建一幅新图
# lines()函数则是在已存在的图形上添加信息,并不能自己生成图形。
# 因此,lines()函数通常是在plot()函数生成一幅图形后再被调用。
plot(xrange, yrange, type="n", xlab = "gene", ylab="expression")
for(i in c(1:10)){
  lines(top10[i,], type="b", xlab = "gene", ylab="expression", pch = i)
}

在这里插入图片描述


10. 一行行的运行

https://github.com/jmzeng1314/5years/blob/master/learn-R/tasks/2-chunjuan-600.R 代码

代码很完整,流畅跑没问题。


二、GGPLOT绘图

# ggplot2中常用的几何函数
geom_bar() 条形图 color、fill、alpha 
geom_boxplot() 箱线图 color、fill、alpha、notch、width 
geom_density() 密度图 color、fill、alpha、linetype 
geom_histogram() 直方图 color、fill、alpha、linetype、binwidth 
geom_hline() 水平线 color、alpha、linetype、size 
geom_jitter() 抖动点 color、size、alpha、shape 
geom_line() 线图 colorvalpha、linetype、size 
geom_point() 散点图 color、alpha、shape、size 
geom_rug() 地毯图 color、side 
geom_smooth() 拟合曲线 method、formula、color、fill、linetype、size 
geom_text() 文字注解 很多,参见函数的“帮助”
geom_violin() 小提琴图 color、fill、alpha、linetype 
geom_vline() 垂线 color、alpha、linetype、size 


# 几何函数的常见选项
color 对点、线和填充区域的边界进行着色
fill 对填充区域着色,如条形和密度区域
alpha 颜色的透明度,从0(完全透明)到1(不透明)。
linetype 图案的线条(1=实线,2=虚线,3=点,4=点破折号,5=长破折号,6=双破折号)
size 点的尺寸和线的宽度
shape 点的形状(和pch一样,0=开放的方形,1=开放的圆形,2=开放的三角形,等等),参见图3-4 
position 绘制诸如条形图和点等对象的位置。对条形图来说,"dodge"将分组条形图并排,"stacked"堆叠分组条形图,"fill"垂直地堆叠分组条形图并规范其高度相等。对于点来说,"jitter"减少点重叠
binwidth 直方图的宽度
notch 表示方块图是否应为缺口(TRUE/FALSE)
sides 地毯图的安置("b"=底部,"l"=左部,"t"=顶部,"r"=右部,"bl"=左下部,等等)
width 箱线图的宽度

1. 使用ggplot代码重写上面基础绘图的Q1-5习题

# 数据准备
rm(list = ls())
options(stringsAsFactors = F)

library(airway)
data("airway")
airway 

RNAseq_expr <- assay(airway)
RNAseq_gl <- colData(airway)[,3]

e1 <- RNAseq_expr[apply(RNAseq_expr, 1, function(x) sum(x>0)>1), ] 
e2 <- log2(e1+1)

# 使用ggplot绘图时,数据应该为data.frame格式                        
library(reshape2)
me2 <- melt(e2)
colnames(me2) <- c("gene", "sample", "expression")
tmp <- data.frame(group_list=RNAseq_gl)
rownames(tmp) <- colnames(RNAseq_expr)
tmp$sample <- rownames(tmp)
e3 <- merge(me2, tmp, by="sample")

group <- as.data.frame(colData(airway)[,c(3,5)])
group

                        
# 第5题包含前面4题                        
### 5 ###
library(ggplot2)

# 箱线图                        
ggplot(e3, aes(sample, expression, fill = group_list)) + geom_boxplot()

# 密度图
# 根据sample进行分组                        
ggplot(e3, aes(expression, color = sample)) + geom_density()
# 根据trt、untrt进行分组                        
ggplot(e3, aes(expression, color = group_list)) + geom_density()

# 条形图                      
# geom_bar() uses stat_count() by default: it counts the number of cases at each x position. 
# geom_col() uses stat_identity(): it leaves the data as is.
ggplot(e3, aes(sample, expression, fill = group_list)) + geom_bar(stat="identity")

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

2. 使用ggplot代码重写上面基础绘图的Q6-9习题

### 6 ###
ggplot(as.data.frame(e2[, 1:2]), aes(x = SRR1039508, y = SRR1039509)) + geom_point() + geom_smooth(method = "lm")



### 7 ###
# 像热图,但不完全是热图(doge)
M <- cor(e2)
meltM <- melt(M)
# If you want to draw arbitrary rectangles, use geom_tile() or geom_rect()
ggplot(meltM, aes(x = Var1, y = Var2, fill = value)) + geom_tile()



### 8 ###
# 折线图
e4 <- data.frame(expression = e2[1, ])
e4$sample <- rownames(e4)

ggplot(e4, aes(x = sample, y = expression, group = 1)) + geom_line() + geom_point()



### 9 ###
top10 <- e2[names(tail(sort(rowSums(e2)), 10)), ]
top10 <- melt(top10)
colnames(top10) <- c("gene", "sample", "expression")

ggplot(top10, aes(x = sample, y = expression, color = gene, group = gene)) + geom_line() + geom_point()

关于8、9题参数group的解释:
For line graphs, the data points must be grouped so that it knows which points to connect. In this case, it is simple – all points should be connected, so group=1. When more variables are used and multiple lines are drawn, the grouping for lines is usually done by variable.

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述



Q10: 一行行的运行:http://biotrainee.com/jmzeng/markdown/ggplot-in-R.html 代码

三、生物信息学绘图

需要参考 https://github.com/jmzeng1314/GEO/blob/master/airway_RNAseq/DEG_rnsseq.R

1. 一行行的运行:

https://github.com/jmzeng1314/5years/blob/master/learn-R/tasks/top50ggplot.Rmd

代码除了几个数据链接失效了,其他的都很通畅。

2. 对RNAseq_expr挑选MAD值最大的100个基因的表达矩阵绘制热图

# 取mad值最大的100个基因名
top100_mad <- names(tail(sort(apply(e1, 1, mad)), 100))
# top100_mad

# 数据标准化是指:数值减去均值,再除以标准差
z_score <- t(scale(t(e2)))

# 取top100矩阵
top100 <- z_score[rownames(z_score) %in% top100_mad,]

pheatmap::pheatmap(top100)  

在这里插入图片描述


3. 对RNAseq_expr进行主成分分析并且绘图

# PCA图应使用z-score矩阵绘制
library(ggplot2)
library(ggfortify)

dat <- z_score
df <- as.data.frame(t(dat))

# 加一列方便分组绘图
group_list <- RNAseq_gl
df$group <- group_list

autoplot(prcomp(df[,1:(ncol(df)-1)]), data = df, colour = 'group') + theme_bw()


# install.packages("FactoMineR")
# install.packages("factoextra")
library("FactoMineR")
library("factoextra") 

# 重置df
df <- as.data.frame(t(dat))

# ?PCA
# graph: boolean, if TRUE a graph is displayed
dat.pca <- PCA(df, graph = FALSE)

# ?fviz_pca_ind
fviz_pca_ind(dat.pca, geom.ind = "point", col.ind = group_list, addEllipses = TRUE, 
             legend.title = "Groups")

在这里插入图片描述

在这里插入图片描述


4. 对RNAseq_expr进行差异分析并且绘制火山图

# 差异分析
# BiocManager::install("DESeq2")
suppressMessages(library(DESeq2))

colData <- data.frame(row.names = colnames(RNAseq_expr), group_list = group_list)

# ?DESeqDataSetFromMatrix()
# Rows of colData correspond to columns of countData
dds <- DESeqDataSetFromMatrix(countData = RNAseq_expr, colData = colData, design = ~ group_list)

# ?DESeq
dds <- DESeq(dds)
res <- results(dds, contrast=c("group_list","trt","untrt"))
resOrdered <- res[order(res$padj),]
head(resOrdered)

# output #
log2 fold change (MLE): group_list trt vs untrt 
Wald test p-value: group_list trt vs untrt 
DataFrame with 6 rows and 6 columns
                 baseMean log2FoldChange     lfcSE      stat       pvalue         padj
                <numeric>      <numeric> <numeric> <numeric>    <numeric>    <numeric>
ENSG00000152583   997.440        4.60253 0.2117708   21.7335 9.89036e-105 1.83911e-100
ENSG00000148175 11193.719        1.45147 0.0848249   17.1113  1.22198e-65  1.13614e-61
ENSG00000179094   776.597        3.18386 0.2015154   15.7996  3.13247e-56  1.94161e-52
ENSG00000134686  2737.982        1.38714 0.0915842   15.1461  8.04404e-52  3.73947e-48
ENSG00000125148  3656.253        2.20344 0.1474087   14.9478  1.60924e-50  5.98476e-47
ENSG00000120129  3409.029        2.94898 0.2016136   14.6269  1.89198e-48  5.86358e-45


# 绘制火山图
DEG <- as.data.frame(resOrdered)
nrDEG <- na.omit(DEG)
DEseq_DEG <- nrDEG
nrDEG <- DEseq_DEG[,c(2,6)]
colnames(nrDEG) <- c('log2FoldChange','pvalue') 


logFC_cutoff <- with(nrDEG,mean(abs(log2FoldChange)) + 2*sd(abs( log2FoldChange)))

# &依次比较两个向量中的对应元素,而&&只比较两个向量的首个元素
nrDEG$change <-  as.factor(ifelse(nrDEG$pvalue < 0.05 & abs(nrDEG$log2FoldChange) > logFC_cutoff, ifelse(nrDEG$log2FoldChange > logFC_cutoff ,'UP','DOWN'),'NOT'))

this_title <- paste0('Cutoff for logFC is ',round(logFC_cutoff,3),
                    '\nThe number of up gene is ',nrow(nrDEG[nrDEG$change =='UP',]) ,
                    '\nThe number of down gene is ',nrow(nrDEG[nrDEG$change =='DOWN',]))

volcano <- ggplot(data=nrDEG, aes(x=log2FoldChange, y=-log10(pvalue), color=change)) +
  geom_point(alpha=0.4, size=1.75) + xlab("log2 fold change") + ylab("-log10 p-value") +
  ggtitle(this_title) + theme(plot.title = element_text(size=15,hjust = 0.5)) +
  scale_colour_manual(values = c('blue','black','red'))

volcano

在这里插入图片描述


5. 对RNAseq_expr进行差异分析并且绘制(平均值VS变化倍数)图

plotMA(res,ylim=c(-5,5))

# 报错了
# 'coef' should specify same coefficient as in results 'res'
resLFC <- lfcShrink(dds,coef = 2,res=res)

plotMA(resLFC, ylim=c(-5,5))

在这里插入图片描述


对这部分的知识还不理解,建议去看参考答案的解析。

  1. 绘制其中一个差异基因在两个分组的表达量boxplot并且添加统计学显著性指标
  2. 通过org.Hs.eg.db包拿到RNAseq_expr所有基因的染色体信息,绘制染色体的基因数量条形图
  3. 在上面染色体的基因数量条形图并列叠加差异基因数量条形图
  4. 在oncolnc网页工具拿到GUL5基因在BRCA数据集的表达量及病人生存资料自行本地绘制生存分析图
  5. 在xena网页工具拿到GUL5基因在BRCA数据集的表达量及病人的PAM50分类并且绘制分类的boxplot
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

生信学习——基于R的可视化习题30个(附详细答案解读) 的相关文章

  • D-S证据理论

    一 前言 20世纪60年代美国哈佛大学数学家A P Dempster利用上 下限概率来解决多值映射问题方面的研究工作 自1967年起连续发表了一系列论文 标志着证据理论的诞生 Dempster的学生G Shafer对证据理论做了进一步发展
  • js中for循环与定时器

    js中for循环和定时器的问题 有四个解决方法 这里面涉及到了同步与异步的问题 也可以理解为 解决方法1 闭包 解决方法2 拆分结构 解决方法3 let let和var区别 解决方法4 第三个参数 for var i 0 i lt 6 i

随机推荐

  • 超酷的13个CSS有趣学习网站

    13个CSS有趣学习网站 今天来给大家推荐13个辅助你学习巩固知识的网站 让你边玩边学边记 因为这些网站大多都是国外的大佬们做的 所以网页大多都是英文 为了更好地使用 给你们推荐两个翻译的方式 使用Chrome浏览器自带的翻译功能 可以中英
  • Linux异步IO实现方案总结

    一 glibc aio 1 名称 由于是glibc提供的aio函数库 所以称为glibc aio glibc是GNU发布的libc库 即c运行库 另外网上还有其他叫法posix aio 都是指glibc提供的这套aio实现方案 2 主要接口
  • java中other的用法_java语言 - 如何使用"variable might not have been initialized(变量可能未初始化)"避免System.exit_others_...

    奇怪的是编译器不知道System exit 1 永远不会返回 因此 你所要做的就是给它提供一些不会让你从catch块到try catch之后的东西 例如 try foo Long parseLong args 0 bar Long pars
  • java获取前四个季度结束日期_JAVA使用LocalDate获取当前日期所在季度的开始日期和结束日期...

    需要使用jdk1 8及以上 获取当前日期所在季度的开始日期和结束日期 季度一年四季 第一季度 1月 3月 第二季度 4月 6月 第三季度 7月 9月 第四季度 10月 12月 param isFirst true表示查询本季度开始日期 fa
  • IOU计算Python代码实现

    文章目录 一 目标检测中的IOU代码实现 二 代码 总结 一 目标检测中的IOU代码实现 目标检测中会用IOU大小的值来衡量检测结果与准确结果之间的差距 IOU的计算公式 IOU A B A B 式中A B为检测结果和准确结果 ground
  • opencv4(五) VideoCapture获取摄像头图像

    环境 ubuntu18 04 opencv4 4 0 摄像头 usb摄像头 挺老的摄像头 还是usb2 0的 csi摄像头也支持这种方法 插入摄像头后 ls dev可以看到 dev video0 video后面的数字就是后面需要的设备id
  • IDEA 之解决快捷键突然失效问题

    刚开机打开IDEA所有快捷键是可用的 但是发现打开很多软件后 IDEA中有些快捷键会失效 原因 IDEA的快捷键和其中一个软件的快捷键冲突 解决方案一 找到和IDEA快捷键冲突的软件 在软件中取消和IDEA冲突的快捷键 但是很多情况下根本找
  • springboot:员工管理系统-修改与删除

    修改员工数据 编辑和删除都需要根据员工的id来进行 步骤 我们需要一个按钮跳转到编辑页面 从而进行修改功能 a class btn btn sm btn primary 编辑 a 对应的controller 去员工的修改页面 GetMapp
  • 继承的笔记

    继承 对象代表什么 就得封装对应的数据 并提供数据对应的行为 对于两种不同的类 但是具有很多共同的属性的时候我们就想着用继承 我们可以将共同的属性放置在一个类中 然后 只需要新建两个类 继承共有的类 然后单独写自己的属性特点 继承类 Jav
  • C++ 符号常量

    一 const限定符 使用const关键字来创建符号常量 常量被创建后其值就固定了 编译器将不允许修改该常量的值 const int a 20 注意 应在声明时对const进行初始化 如果在声明常量时没有提供值 则该常量的值将是不确定的 且
  • 第二部分__建模应用篇__第十一章__时间序列分析

    这一部分是时间序列 计量经济学的大头 下面两个库很重要 statsmodel http www statsmodels org stable index html arch https github com bashtage arch AR
  • JQuery版本使用建议

    目前jQuery有三个大版本 1 x x 兼容ie6 7 8 使用最为广泛 官网只做BUG维护 功能不再新增 因此一般项目来说 使用1 X版本就可以了 最终版本 1 12 4 2016年5月20日 2 x x 不兼容ie6 7 8 很少有人
  • Python3.8 Numpy包 pip指令安装失败、提示超时的解决办法

    每次下东西必折腾半天 这次又遇到了新问题 Python3 8下载Numpy包以及各种包都出错 1 问题描述 在cmd命令提示符窗口调用 pip install package 下载十多分钟后进度条卡住 然后提示超时 尝试添加参数 defau
  • cglib动态代理实现原理详细分析

    在之前Java代理模式中大致的分析了下代理模式的类型及对每种代理类型简单的举例了下 在上篇JDK动态代理实现原理详细分析中 对其JDK代理的流程做了一个详细的分析 而本文 将介绍另一种动态代理模式 cglib动态代理 阅读完本文 你将对cg
  • IDEA 总是提示登录github,登陆后不能push的解决办法

    运行环境 IDEA版本 2020 2 3 Windows 10 git 版本 2 29 2 问题描述 每次push到github时都提示登录 如下图 然而 用命令行push是成功的 此方法适用的前提是能从命令行登录 IDEA的File Se
  • 1. XAML简单的划分区域

    1 运行效果 2 XAML程序
  • QT信号与槽的特点和用法

    1 概念 信号 Signal 就是在特定情况下被发射的事件 例如 PushButton 最常见的信号就是鼠标单 击时发射的 clicked 信号 槽 Slot 就是对信号响应的函数 槽就是一个函数 与一般的 C 函数是一样的 可以定义在类的
  • nested exception is org.apache.ibatis.binding.BindingException

    nested exception is org apache ibatis binding BindingException Parameter roleIdList not found Available parameters are 0
  • Date转换成LocalDateTime类型

    1 先new 一个当前时间 2 获取instant和zoneId 3 将instant和zoneId塞进LocalDateTime ofInstant这个方法里面 4大功告成 我也是今天碰到记录一下 省的以后在找
  • 生信学习——基于R的可视化习题30个(附详细答案解读)

    题目目录 一 基础绘图 1 对RNAseq expr的每一列绘制boxplot图 2 对RNAseq expr的每一列绘制density图 3 对RNAseq expr的每一列绘制条形图 4 对RNAseq expr的每一列取log2后重新