双侧条形图绘制教程

news2024/11/17 0:04:51

写在前面

双侧条形图在我们的文章中也是比较常见的,那么这样的图形是如何绘制的呢? 以及它使用的数据类型是什么呢? 这些都是我们在绘制图形前需要掌握的,至少我们知道绘图的数据集如何准备,这样才踏出第一步

今天的教程,我们会从数据的准备,以及数据如何整理,以及结合自己的绘图过程中遇到问题是如何解决来进行讲解。PS:仅代表个人的观点,以及自己遇到此问题时自己的方法来进行说明。也许,这个并不会死唯一且最好的方法,大家在绘图中请结合自己的能力和方法。

本期教程

双侧条形图

获得本期教程代码口令:20240205

原文链接:R语言绘图教程 | 双侧条形图绘制教程

什么时间及什么数据使用双侧条形图?一般使用此图形,基本是富集图

一般使用此图形,基本是富集图。如GO、KEGG、GSEA、GSVE等等,我们用来表示各个通路在研究中的显著性、得分情况等。

绘图

教程一

这里我们使用已经整理好的数据进行绘图,我们使用Execl进行整理数据。数据结果来源,GO、KEGG、GSEA、GSVE等富集结果。

1. 导入所需的R包

##'@导入所需的R包
library(limma)
library(ggplot2)
library(ggpubr)
library(tidyr)
library(tidyverse)
library(ComplexHeatmap)

2. 导入数据

在这里我们发现,我们有很多个富集通路,但是我们绘图的时候需要这么多吗?应该只需要各别几个。在这里我们可以手动调整,或是通过P值进行筛选。

dt1 <- read.csv("DE_KEGG.input.csv",header = T, row.names = 1)
###'@导入txt文件
#dt1 <- read.table("Input_KEGG.txt",header = T, row.names = 1, sep = '\t',check.names = F)
> dt1[1:5,1:5]
                                     logFC     AveExpr         t     P.Value   adj.P.Val
KEGG_TGF_BETA_SIGNALING_PATHWAY -0.1723618 0.020400811 -5.029813 0.000001250 0.000190767
KEGG_COLORECTAL_CANCER          -0.1443645 0.007857589 -3.773441 0.000222656 0.010260593
KEGG_MELANOMA                   -0.1129672 0.041504860 -3.736434 0.000255165 0.010260593
KEGG_ADHERENS_JUNCTION          -0.1541395 0.027103539 -3.721243 0.000269769 0.010260593
KEGG_PATHWAYS_IN_CANCER         -0.1100711 0.017776668 -3.615438 0.000395646 0.010260593

3. 筛选数据

筛选出的作图的数据,这里我们的直接使用DescriptionLogPgroup进行绘图

df <- data.frame(Description = rownames(dt1), LogP  = log10(dt1$adj.P.Val), Group  = dt1$group, LogFC = dt1$logFC)

4. 调整Description顺序

###'@调整`Description`顺序
df$Description <- factor(df$Description, levels = rev(df$Description))

若是我们这里有自己整理的Description顺序,可以直接在levels()后面加上自己的排序即可。

绘图

  1. 基础图形
ggplot(df, aes(x = LogFC, y = Description, fill = Group))+
  geom_col()+
  theme_bw()

2.更改颜色

ggplot(df, aes(x = LogFC, y = Description, fill = Group))+
  scale_fill_manual(values = c('palegreen3','dodgerblue4'), guide = FALSE)+
  geom_col()+
  theme_bw()

  1. 高阶绘图

此教程来源:https://mp.weixin.qq.com/s/aVy5ubaKc6Q8_wf-R9TVGQ

p1 <- ggplot(df, aes(x = LogFC, y = Description, fill = Group))+
  scale_fill_manual(values = c('palegreen3','dodgerblue4'), guide = FALSE)+
  geom_col()+
  theme_bw()+
  ##'@自定义主题
  theme(
    legend.position = 'none',
    axis.text.y = element_blank(),
    axis.ticks.y = element_blank(),
    panel.grid.major = element_blank(),
    panel.grid.minor = element_blank(),
    panel.border = element_blank(),
    axis.line.x = element_line(color = 'grey60',size = 1.1),
    axis.text = element_text(size = 12)
  )

添加对应的通路标签


up <- df[which(df$Group == 'Up'),]
down <- df[which(df$Group == 'Down'),]
p1 +
  ##'@添加Up的通路富集
  geom_text(data = up,
            aes(x = -0.01, ## 调整通路标签x轴位置
                y = Description, label = Description),
            size = 3.5,
            hjust = 1)+ #标签右对齐
  ##'@添加Down的通路标签
  geom_text(data = down,
            aes(x = 0.01, y = Description, label = Description),
            size = 3.5,
            hjust = 0)+  #标签左对齐
  #scale_x_continuous(breaks=seq(-4, 6, 2)) + #x轴刻度修改,若需要请结合自己的数据调整
  labs(x = 'logFC', y = ' ', title = 'Enriched Pathway') + #修改x/y轴标签、标题添加
  theme(plot.title = element_text(hjust = 0.5, size = 14))

教程二

若是我们的直接导入通路数据集矩阵,以及我们的未有logFC和P值,我们该如何操作呢

第一步需要操作步骤:进行差异分析。比如,我们输出数据是GSVA的数据集。

  1. 输入数据集
data_df <- read.csv("Input_KEGG.csv",header = T,row.names = 1)
##'@查看数据
data_df[1:5,1:10]
> data_df[1:5,1:10]
                                                          sample001   sample002   sample003
KEGG_O_GLYCAN_BIOSYNTHESIS                              -0.04304991 -0.24987132 -0.12401679
KEGG_AMINO_SUGAR_AND_NUCLEOTIDE_SUGAR_METABOLISM        -0.24783431 -0.11383994 -0.47895615
KEGG_GLYCOSAMINOGLYCAN_DEGRADATION                       0.26018439  0.01315923 -0.25700397
KEGG_GLYCOSAMINOGLYCAN_BIOSYNTHESIS_CHONDROITIN_SULFATE  0.42760250 -0.06222532  0.00031469
KEGG_GLYCOSAMINOGLYCAN_BIOSYNTHESIS_KERATAN_SULFATE      0.34888990 -0.38251570 -0.26030188
                                                          sample004   sample005    sample006
KEGG_O_GLYCAN_BIOSYNTHESIS                              -0.11976645  0.40799471 -0.121623478
KEGG_AMINO_SUGAR_AND_NUCLEOTIDE_SUGAR_METABOLISM        -0.52727188  0.31490335 -0.000949728
KEGG_GLYCOSAMINOGLYCAN_DEGRADATION                      -0.03605253  0.29166666  0.001121143
KEGG_GLYCOSAMINOGLYCAN_BIOSYNTHESIS_CHONDROITIN_SULFATE  0.09261353 -0.06208377 -0.159061239
KEGG_GLYCOSAMINOGLYCAN_BIOSYNTHESIS_KERATAN_SULFATE     -0.43428522  0.15120498 -0.455994453
                                                         sample007    sample008   sample009
  1. 差异分析
    group_list设置中,请根据自己数据进行设置,比如我这里有160个样本,CKTreat各80个。
###'@构建design
group_list <- data.frame(sample = colnames(data_df), group = c(rep("CK", 80), rep("Treat", 80)))
group_list$group <- factor(group_list$group,levels=c("CK",'Treat'))
design <- model.matrix(~ 0 + group_list$group)
colnames(design) <- levels(group_list$group)
rownames(design) <- colnames(data_df)
design
  1. 构建差异比较矩阵
###'@构建差异比较矩阵
contrast.matrix <- makeContrasts(CK-Treat, levels = design)
  1. 差异分析
fit <- lmFit(data_df, design)
fit2 <- contrasts.fit(fit, contrast.matrix)
fit2 <- eBayes(fit2)
  1. 获得差异结果
dt <- topTable(fit2, coef = 1, n = Inf, adjust.method = "BH", sort.by = "P")
dt[1:10,1:5]
> dt[1:10,1:5]
                                           logFC     AveExpr         t      P.Value   adj.P.Val
KEGG_TGF_BETA_SIGNALING_PATHWAY      -0.17236176 0.020400811 -5.029813 1.246843e-06 0.000190767
KEGG_COLORECTAL_CANCER               -0.14436446 0.007857589 -3.773441 2.226562e-04 0.010260593
KEGG_MELANOMA                        -0.11296720 0.041504860 -3.736434 2.551651e-04 0.010260593
KEGG_ADHERENS_JUNCTION               -0.15413947 0.027103539 -3.721243 2.697688e-04 0.010260593
KEGG_PATHWAYS_IN_CANCER              -0.11007105 0.017776668 -3.615438 3.956464e-04 0.010260593
KEGG_WNT_SIGNALING_PATHWAY           -0.11940334 0.014475730 -3.610726 4.023762e-04 0.010260593
KEGG_HYPERTROPHIC_CARDIOMYOPATHY_HCM -0.10903295 0.035562175 -3.462058 6.792812e-04 0.014847145
KEGG_GAP_JUNCTION                    -0.10486217 0.006571587 -3.358319 9.693892e-04 0.014898594
KEGG_LONG_TERM_POTENTIATION          -0.09738506 0.003833619 -3.309357 1.143329e-03 0.014898594
KEGG_SPHINGOLIPID_METABOLISM         -0.12157635 0.031751704 -3.306694 1.153577e-03 0.014898594
#把通路的limma分析结果保存到文件
write.table(dt, "all.limma_KEGG.output.txt", quote = F,sep = '\t',row.names = T,col.names = T)
#write.csv(x,"all.limma_KEGG.output.csv")

到这里我们也就可以使用以上的代码进行分析了,你可以使用P值或是LogFC进行绘制,我们论文中一般使用的是P值进行绘制图图形。

在这里,我们使用t值绘制图形。操作如下所示。

  1. 筛选所需数据,使用t值进行过滤,t值的大小根据自己的需求进行调整
df_t <- df_t[df_t$score > 2 | df_t$score < -3.5,]
dim(df_t)
df_t
> df_t
                       Description     score group
1  KEGG_TGF_BETA_SIGNALING_PATHWAY -5.029813  Down
2           KEGG_COLORECTAL_CANCER -3.773441  Down
3                    KEGG_MELANOMA -3.736434  Down
4           KEGG_ADHERENS_JUNCTION -3.721243  Down
5          KEGG_PATHWAYS_IN_CANCER -3.615438  Down
6       KEGG_WNT_SIGNALING_PATHWAY -3.610726  Down
18     KEGG_OLFACTORY_TRANSDUCTION  3.157596    Up
26         KEGG_PARKINSONS_DISEASE  2.990963    Up
31        KEGG_HUNTINGTONS_DISEASE  2.863284    Up
61         KEGG_ALZHEIMERS_DISEASE  2.182530    Up
64 KEGG_CARDIAC_MUSCLE_CONTRACTION  2.133893    Up
  1. 使用t值进行分组
cutoff <- 2
df_t$group <- case_when(df_t$score > cutoff ~ "Up", df_t$score < cutoff ~ "Down")
df_t[1:9,1:3]
> df_t[1:9,1:3]
                       Description     score group
1  KEGG_TGF_BETA_SIGNALING_PATHWAY -5.029813  Down
2           KEGG_COLORECTAL_CANCER -3.773441  Down
3                    KEGG_MELANOMA -3.736434  Down
4           KEGG_ADHERENS_JUNCTION -3.721243  Down
5          KEGG_PATHWAYS_IN_CANCER -3.615438  Down
6       KEGG_WNT_SIGNALING_PATHWAY -3.610726  Down
18     KEGG_OLFACTORY_TRANSDUCTION  3.157596    Up
26         KEGG_PARKINSONS_DISEASE  2.990963    Up
31        KEGG_HUNTINGTONS_DISEASE  2.863284    Up
  1. 进行排序
df_sort <- df_t[order(df_t$score),]
df_sort$Description <- factor(df_sort$Description, levels = df_sort$Description)
df_sort[1:9,1:3]
  1. 绘图
ggplot(df_sort, aes(Description, score, fill = group)) + geom_bar(stat = 'identity') + 
  coord_flip() + 
  #scale_fill_manual(values = c('palegreen3','dodgerblue4'), guide = FALSE) + 
  #画2条虚线
  geom_hline(yintercept = c(-cutoff,cutoff), 
             color="white",
             linetype = 2, #画虚线::1表示实线,2表示虚线,3表示间距更小的虚线
             size = 0.3)+  #线的粗细
  geom_text(data = subset(df_sort, score < 0),
            aes(x=Description, y= 0, label= paste0(" ", Description), color = group),#bar跟坐标轴间留出间隙
            size = 3, #字的大小
            hjust = "bottom" ) +  #字的对齐方式
  geom_text(data = subset(df_sort, score > 0),
            aes(x=Description, y= -0.1, label=Description, color = group),
            size = 3, hjust = "inward",angle=360) +  
  scale_colour_manual(values = c("black","black"), guide = FALSE)+
  xlab("") +ylab("t value of GSVA score, tumor \n versus non-malignant")+
  theme_bw() + #去除背景色
  theme(panel.grid =element_blank()) + #去除网格线
  theme(panel.border = element_rect(size = 0.6)) + #边框粗细
  theme(axis.line.y = element_blank(), axis.ticks.y = element_blank(), 
        axis.text.y = element_blank()) #去除y轴

代码和数据链接:

本教程涉及的数据、代码和文件等在社群中可获得!!

若我们的分享对你有用,希望您可以点赞+收藏+转发,这是对小杜最大的支持。

往期文章:

1. 复现SCI文章系列专栏

2. 《生信知识库订阅须知》,同步更新,易于搜索与管理。

3. 最全WGCNA教程(替换数据即可出全部结果与图形)

  • WGCNA分析 | 全流程分析代码 | 代码一

  • WGCNA分析 | 全流程分析代码 | 代码二

  • WGCNA分析 | 全流程代码分享 | 代码三

  • WGCNA分析 | 全流程分析代码 | 代码四

  • WGCNA分析 | 全流程分析代码 | 代码五(最新版本)


4. 精美图形绘制教程

  • 精美图形绘制教程

5. 转录组分析教程

转录组上游分析教程[零基础]

一个转录组上游分析流程 | Hisat2-Stringtie

小杜的生信筆記 ,主要发表或收录生物信息学的教程,以及基于R的分析和可视化(包括数据分析,图形绘制等);分享感兴趣的文献和学习资料!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1435808.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Unity接入GVoice腾讯实时语音

Unity接入GVoice腾讯实时语音 一、介绍二、注册GVoice创建项目语音服务1.创建项目2.申请语音权限3.项目管理查看SDK初始化的一些参数和基本信息4.GVoice检测 三、SDK下载SDK是分为两种类型&#xff1a;独立版集成板 SDK放入Unity工程中 四、语音代码写法五、GVoice踩坑语音权限…

知到如何找答案?这7款足够解决问题 #笔记#其他

在这个信息爆炸的时代&#xff0c;合理利用学习工具可以帮助我们过滤和获取有用的知识。 1.网易公开课 这是一个可以帮你找到国内外演讲课程的学习APP&#xff0c;提供了多个专业的视频课程&#xff0c;而且还有丰富的TED、精品国外英语纪录片等。 其中涵盖的大学专业课程包…

ClickHouse基于数据分析常用函数

文章标题 一、WITH语法-定义变量1.1 定义变量1.2 调用函数1.3 子查询 二、GROUP BY子句&#xff08;结合WITH ROLLUP、CUBE、TOTALS&#xff09;三、FORM语法3.1表函数3.1.1 file3.1.2 numbers3.1.3 mysql3.1.4 hdfs 四、ARRAY JOIN语法&#xff08;区别于arrayJoin(arr)函数&a…

Java开发IntelliJ IDEA2023

IntelliJ IDEA 2023是一款强大的集成开发环境&#xff08;IDE&#xff09;&#xff0c;专为Java开发人员设计。它提供了许多特色功能&#xff0c;帮助开发人员更高效地编写、测试和调试Java应用程序。以下是一些IntelliJ IDEA 2023的特色功能&#xff1a; 智能代码编辑器&…

在 MacOS 上虚拟化 x86Linux 的最佳方法(通过 Rosetta)

categories: [VM] tags: MacOS VM 写在前面 买了 ARM 的 mac, 就注定了要折腾一下虚拟机了… 之前写过一篇文章是通过 utm 虚拟化archlinux, 其实本质上还是调用了 qemu-system-x86_64, 所以速度并不快, 后来想着能不能借用 Rosetta 的优势即原生转译, 来虚拟化 Intel 的 Linu…

idea开发工具的简单使用与常见问题

1、配置git 选择左上角目录file->setting 打开&#xff0c;Version Control 目录下Git&#xff0c;选择git安装目录下的git.exe文件&#xff1b; 点击test&#xff0c;出现git版本&#xff0c;则表示git识别成功&#xff0c;点击右下角确认即可生效。 2、配置node.js 选…

C++ 哈希+unordered_map+unordered_set+位图+布隆过滤器(深度剖析)

文章目录 1. 前言2. unordered 系列关联式容器2.1 unordered_map2.1.1 unordered_map 的概念2.1.2 unordered_map 的使用 2.2 unordered_set2.2.1 unordered_set 的概念2.2.2 unordered_set 的使用 3. 底层结构3.1 哈希的概念3.2 哈希冲突3.3 哈希函数3.4 哈希冲突的解决3.4.1 …

GaussDB HCS 轻量化部署软件下载指引

一、Support 账号准备 1. 账号说明 华为的软件服务在华为support网站发布&#xff0c;注册该账号后&#xff0c;可以申请软件、下载离线文档&#xff0c;查看技术案例等功能 2. 账号注册 步骤 1&#xff1a;点击如下官方链接 华为运营商技术支持 - 华为 步骤 2&#xff1…

Oracle Analytics BIEE 操作方法(四)标题

1 背景 版本&#xff1a;BIEE 12C 测试地&#xff1a;分析 2 显示运行时间 2.1 说明 分析视图中的标题&#xff0c;希望可以显示运行时间 2.2 操作步骤 分析进入编辑状态 在“结果”标签中&#xff0c;找到要编辑的标题 “开始时间”中&#xff0c;选择想要的格式 1&a…

JIT逆优化引发的Java服务瞬时抖动 问题排查解决方案

目录 一、背景 二、前期排查&#xff08;失败&#xff09; 三、使用神器JFR 四、学习JIT&思考解决方案 五、最终的解决方案 五、总结 一、背景 我们有一个QPS较高、机器数较多的Java服务&#xff1b;该服务的TP9999一般为几十ms&#xff0c;但偶尔会突然飙升至数秒&a…

图片太大如何缩小上传?分享一个解决办法

随着手机、相机和其他设备拍摄照片的分辨率和质量不断提高&#xff0c;图片大小也越来越大&#xff0c;在设备存储空间有限的情况下&#xff0c;通过压缩图片可以节省存储空间&#xff0c;使得能够存储更多的图片文件&#xff0c;怎么把图片压缩小一点呢&#xff1f; 想要将图片…

Linux嵌入式开发+驱动开发-中断

swi汇编指令可以产生软中断&#xff0c;以下是硬件中断的产生到执行完毕的全过程&#xff1a; 在自己设计的芯片“CPU响应中断”程序的第四个步骤可以转向“中断向量控制器”&#xff0c;中断向量控制器中存储中断元服务地址即处理中断处理程序的地址&#xff0c;而不用使用0X1…

阅读笔记——《RapidFuzz: Accelerating fuzzing via Generative Adversarial Networks》

【参考文献】Ye A, Wang L, Zhao L, et al. Rapidfuzz: Accelerating fuzzing via generative adversarial networks[J]. Neurocomputing, 2021, 460: 195-204.【注】本文仅为作者个人学习笔记&#xff0c;如有冒犯&#xff0c;请联系作者删除。 目录 摘要 一、介绍 二、相关…

java面试题:MySQL中的各种JOIN的区别

表关联是频率非常高的一种数据库操作&#xff0c;在MySQL中&#xff0c;这种JOIN操作有很多类型&#xff0c;包括内联接、左外连接、右外连接等等&#xff0c;而每种连接的含义都不一样&#xff0c;如果死记硬背&#xff0c;不仅很难记住&#xff0c;而且也容易搞混淆&#xff…

简单的TcpServer(英译中)

目录 一、TCP socket API 详解1.1 socket()1.2 bind()1.3 listen()1.4 accept()1.5 connect 二、TcpServer&#xff08;英译中&#xff09;2.1 TcpServer.hpp2.2 TcpClient.cc2.3 Task.hpp2.4 Thread.hpp2.5 ThreadPool.hpp2.6 makefile2.7 Main.cc2.8 log.hpp2.9 Init.hpp2.10…

23、数据结构/查找相关练习20240205

一、请编程实现哈希表的创建存储数组{12,24,234,234,23,234,23},输入key查找的值&#xff0c;实现查找功能。 代码&#xff1a; #include<stdlib.h> #include<string.h> #include<stdio.h> #include<math.h> typedef struct Node {int data;struct n…

1.0 Zookeeper 分布式配置服务教程

ZooKeeper 是 Apache 软件基金会的一个软件项目&#xff0c;它为大型分布式计算提供开源的分布式配置服务、同步服务和命名注册。 ZooKeeper 的架构通过冗余服务实现高可用性。 Zookeeper 的设计目标是将那些复杂且容易出错的分布式一致性服务封装起来&#xff0c;构成一个高…

Leetcode24:两两交换链表中的节点

一、题目 给你一个链表&#xff0c;两两交换其中相邻的节点&#xff0c;并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题&#xff08;即&#xff0c;只能进行节点交换&#xff09;。 示例&#xff1a; 输入&#xff1a;head [1,2,3,4] 输出&#xff…

JVM 性能调优- Java 中的五种内存溢出(5)

在介绍之前先简单介绍下 直接内存(Direct Memory)和堆内存(Heap Memory): 关系: 直接内存并不是Java虚拟机的一部分,它是通过Java的NIO库中的ByteBuffer来分配和管理的。直接内存通常由操作系统的本地内存(Native Memory)提供支持。堆内存是Java虚拟机的一部分,用于存…

杨中科 ASP.NETCORE 高级14 SignalR

1、什么是websocket、SignalR 服务器向客户端发送数据 1、需求&#xff1a;Web聊天;站内沟通。 2、传统HTTP&#xff1a;只能客户端主动发送请求 3、传统方案&#xff1a;长轮询&#xff08;Long Polling&#xff09;。缺点是&#xff1f;&#xff08;1.客户端发送请求后&…