Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >ggplot2(r包)绘制基因棒棒糖图

ggplot2(r包)绘制基因棒棒糖图

作者头像
生信技能树
发布于 2025-02-05 05:42:03
发布于 2025-02-05 05:42:03
18201
代码可运行
举报
文章被收录于专栏:生信技能树生信技能树
运行总次数:1
代码可运行

前面我们已经学习了四个包来绘制展示基因突变信息的棒棒图,其实,ggplot2也可以绘制,见资源:https://stackoverflow.com/questions/77473777/adding-branches-to-ggplot-mutation-lollipop-plot

前面已经介绍的四个软件:

数据准备

这里制作了四个位点突变新的示例数据:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
rm(list=ls())
library(ggplot2)
library(ggrepel)

mut.df <- data.frame("AA" = c(201, 203, 500, 601), 
                     "Mut" = c("V201L", "R203H", "Q500*", "P601fs"), 
                     "Type" = c("Missense", "Missense", "Nonsense", "Frameshift"), 
                     "Freq" = c(2,3,4,1))

mut.df
# AA    Mut       Type Freq
# 1 201  V201L   Missense    2
# 2 203  R203H   Missense    3
# 3 500  Q500*   Nonsense    4
# 4 601 P601fs Frameshift    1

domain.df <- data.frame("Feature" = c("Start", "Dom1", "Dom2", "End"), 
                        "Type" = c("str", "dom", "dom", "str"),
                        "Start" = c(1, 180, 480, 650), 
                        "End" = c(1, 230, 630, 650))
                        
domain.df

# Feature Type Start End
# 1   Start  str     1   1
# 2    Dom1  dom   180 230
# 3    Dom2  dom   480 630
# 4     End  str   650 650

str.fill <- "#E1E1E1"
str.col <- "#16161D"

dom.fill <- c("Dom2" = "#FF0000", "Dom1" = "#AA4BAB")
dom.col <- c("#16161D")

ggplot2 绘制

1、使用geom_rect函数绘制边框

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
## 绘图
# 绘制边框
gp <- ggplot() +
  geom_rect(data = subset(domain.df, Type == "str"),
            mapping = aes(xmin = min(Start), xmax = max(End), ymin = 0.3, ymax = 0.7),
            fill = str.fill,
            colour = str.col)
gp

2、将上边绘制的边框压缩成一个长条形

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 添加y轴范围,刻度,将上边绘制的边框压缩成一个长条形
gp <- gp + scale_y_continuous(limits = c(0, 10), breaks = 0:10)
gp

3、添加棒棒图

使用geom_segment添加棒棒图的棒子,geom_point添加棒棒图上面的圈圈,geom_text_repel添加对应的文字

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 添加棒棒图
gp <- gp + geom_segment(data = mut.df, 
                        mapping = aes(x = AA, xend = AA, y = 0.7, yend = Freq)) +
  geom_point(data = mut.df,
             mapping = aes(x = AA, y = Freq, fill = Type),
             shape = 21,
             size = 2) +
  geom_text_repel(data = mut.df,
                  mapping = aes(x = AA, y = Freq, label = Mut),
                  bg.colour = "white",
                  seed = 12345,
                  nudge_y = 0.25)

gp

4、添加结构区域

再使用geom_rect添加突变区域:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 添加结构区域
gp <- gp + geom_rect(data = subset(domain.df, Type == "dom"),
                     mapping = aes(xmin = Start, xmax = End, ymin = 0.2, ymax = 0.8, fill = Feature, group = Feature),
                     fill = dom.fill[subset(domain.df, Type == "dom")$Feature],
                     colour = dom.col)
gp

5、修改主题

优化一下配色,主题:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 修改主题
gp <- gp +
  theme_bw() +
  theme(panel.grid.minor = element_blank(),
        panel.grid.major.x = element_blank(),
        panel.grid.major.y = element_line(linetype = "dotted")) +
  labs(x = "AA", y = "Freq", fill = "Mutation")

gp

6、再优化:将两个重叠的棒子分开不重叠

整理一下数据变成适合的数据格式:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
###############################
library(tidyverse)
library(tidygraph)
library(ggraph)

data <- mut.df %>%
  select(Mut, AA, Type, Freq) %>%
  mutate(Base = paste0(Mut, '_0'), .after = 'Mut') %>%
  as_tbl_graph() %>%
  mutate(AA = rep(mut.df$AA, 2),
         Freq = c(mut.df$Freq, rep(0.5, nrow(mut.df))),
         Type = c(mut.df$Type, rep(NA, nrow(mut.df)))) %>%
  mutate(dist = sapply(AA, \(x) min(abs(x - mut.df$AA[!mut.df$AA %in% x])))) %>%
  mutate(AA = ifelse(!is.na(Type) & dist < 20, 
                     runif(n(), -50, 50), 0) + AA) 

data

绘图:不重叠的棒棒使用geom_edge_elbow函数

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
data %>%
  ggraph(layout = 'manual', x = AA, y = Freq) + # 绘制一个空白图
  # 绘制边框
  geom_rect(data = subset(domain.df, Type == "str"),
            mapping = aes(xmin = min(Start), xmax = max(End), 
                          ymin = 0.3, ymax = 0.7),
            fill = str.fill,
            colour = str.col) + 
  # 绘制突变结构域
  geom_rect(data = subset(domain.df, Type == "dom"),
            mapping = aes(xmin = Start, xmax = End, ymin = 0.2, 
                          ymax = 0.8, fill = Feature, group = Feature),
            fill = dom.fill[subset(domain.df, Type == "dom")$Feature],
            colour = dom.col) +
  # 添加不重叠的棒棒
  geom_edge_elbow(aes(direction = 1), strength = 0.5) +
  # 添加棒棒上面的圈圈
  geom_node_point(shape = 21, aes(fill = Type, size = Type)) +
  # 添加棒棒上的突变信息
  geom_node_text(aes(label = ifelse(is.na(Type), '', name)), 
                 angle = 90, hjust = -0.3) +
  # 优化圈圈的大小
  scale_size_manual(values = rep(3, 3), breaks = unique(mut.df$Type),
                    guide = 'none') +
  scale_fill_discrete(breaks = unique(mut.df$Type)) +
  theme_bw() +
  theme(panel.grid.minor = element_blank(),
        panel.grid.major.x = element_blank(),
        panel.grid.major.y = element_line(linetype = "dotted")) +
  labs(x = "AA", y = "Freq", fill = "Mutation") +
  ylim(c(0, 5))

结果如下:

7、再优化:两个棒棒之间添加一下空格

首先,作者写了一个函数增加两个重叠的棒棒间的空格:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# function to shift the x-axis coordinates when points are too close
shift.lollipop.x <- function(mut.pos = NULL, total.length = NULL, shift.factor = 0.05){
  
  pos.dif <- 0
  for (i in 1:length(mut.pos)){
    pos.dif <- c(pos.dif, mut.pos[i+1] - mut.pos[i])
  }
  
  idx <- which(pos.dif < shift.factor*total.length)
  
  ## deal with odd and even sets of points
  if (median(idx) %% 1==0){
    mut.pos[idx[idx < median(idx)]] <- mut.pos[idx[idx < median(idx)]] - shift.factor*total.length
    mut.pos[idx[idx > median(idx)]] <- mut.pos[idx[idx > median(idx)]] + shift.factor*total.length
  } else {
    mut.pos[idx[idx == median(idx)-0.5]] <- mut.pos[idx[idx == median(idx)-0.5]] - 0.5*shift.factor*total.length
    mut.pos[idx[idx == median(idx)+0.5]] <- mut.pos[idx[idx == median(idx)+0.5]] + 0.5*shift.factor*total.length
    
    mut.pos[idx[idx < median(idx)-0.5]] <- mut.pos[idx[idx < median(idx)-0.5]] - shift.factor*total.length
    mut.pos[idx[idx > median(idx)+0.5]] <- mut.pos[idx[idx > median(idx)+0.5]] + shift.factor*total.length
  }
  
  mut.pos
  
}

# function to split the segment into 3 parts
shift.lollipop.y <- function(x, start.y = 0.7){
  mod.start <- x - start.y
  
  set1 <- start.y + mod.start/3
  set2 <- set1 + mod.start/3
  
  as.data.frame(cbind(set1,set2))
}

使用上面定义的函数修改数据并绘图:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 修改数据
mut.df$Shift.AA <- shift.lollipop.x(mut.df$AA, 650)
mut.df <- cbind(mut.df, shift.lollipop.y(mut.df$Freq, 0.7))

str.fill <- "#E1E1E1"
str.col <- "#16161D"
dom.fill <- c("Dom2" = "#FF0000", "Dom1" = "#AA4BAB")
dom.col <- c("#16161D")

# 绘图
gp <- ggplot() +
  geom_rect(data = subset(domain.df, Type == "str"),
            mapping = aes(xmin = min(Start), xmax = max(End), ymin = 0.3, ymax = 0.7),
            fill = str.fill,
            colour = str.col) + 
  scale_y_continuous(limits = c(0, 10), breaks = 0:10) + 
  geom_segment(data = mut.df, 
               mapping = aes(x = AA, xend = AA, y = 0.7, yend = set1)) +
  geom_segment(data = mut.df, 
               mapping = aes(x = AA, xend = Shift.AA, y = set1, yend = set2)) +
  geom_segment(data = mut.df, 
               mapping = aes(x = Shift.AA, xend = Shift.AA, y = set2, yend = Freq)) +
  geom_point(data = mut.df,
             mapping = aes(x = Shift.AA, y = Freq, fill = Type),
             shape = 21,
             size = 2) +
  geom_text_repel(data = mut.df,
                  mapping = aes(x = Shift.AA, y = Freq, label = Mut),
                  bg.colour = "white",
                  seed = 12345,
                  nudge_y = 0.25,
                  angle = 90) + 
  geom_rect(data = subset(domain.df, Type == "dom"),
                     mapping = aes(xmin = Start, xmax = End, ymin = 0.2, ymax = 0.8, fill = Feature, group = Feature),
                     fill = dom.fill[subset(domain.df, Type == "dom")$Feature],
                     colour = dom.col)

gp <- gp +
  theme_bw() +
  theme(panel.grid.minor = element_blank(),
        panel.grid.major.x = element_blank(),
        panel.grid.major.y = element_line(linetype = "dotted")) +
  labs(x = "AA", y = "Freq", fill = "Mutation")

gp

最终效果如下:

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2025-01-31,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 生信技能树 微信公众号,前往查看

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

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
跟SCI学umap图| ggplot2 绘制umap图,坐标位置 ,颜色 ,大小还不是你说了算
umap/tsne图作为单细胞转录组的王牌图形之一,当seurat 或者 singleR 直接绘制的umap/tsne 图需要调整的时候,可能比较难调整,当然AI或者PS都可以办到 。但是本次主要分享使用ggplot2进行可视化,能比较方便的进行后期的微调 ,也学习回顾了ggplot2的基本参数。
生信补给站
2021/12/24
23.5K1
跟SCI学umap图|  ggplot2 绘制umap图,坐标位置 ,颜色 ,大小还不是你说了算
ggplot2优雅绘制多组旭日图
有需要学习数据可视化的朋友,欢迎到小编的「淘宝店铺」 「R语言数据分析指南」下单购买,内容主要包括各种「高分论文的图表分析复现以及一些个性化图表的绘制」均包含数据+代码。购买会员文档后微信发小编订单号即邀请进新的会员交流群。
R语言数据分析指南
2024/03/20
5900
ggplot2优雅绘制多组旭日图
ggplot2优雅的绘制流程图
「代码链接」https://gist.github.com/AlbertRapp/438102c458fc8fbdffcb6feb76ff93f7 可以从网站直接获取,如果你下载网速很慢,可以从文末直接获取
R语言数据分析指南
2022/09/21
6180
ggplot2优雅的绘制流程图
[会员专享] ggplot2组合绘制相关性箱线图
R语言数据分析指南
2023/08/18
4030
[会员专享] ggplot2组合绘制相关性箱线图
高阶可视化绘图系统:ggplot2入门
ggplot2是《The Grammar of Graphics》/《图形的语法》中提出了一套图形语法,将图形元素抽象成可以自由组合的要素,类似Photoshop中的图层累加,ggplot2将指定的元素/映射关系逐层叠加,最终形成所图形。更加深入学习ggplot2,请参考《ggplot2: 数据分析与图形艺术》。
1480
2019/07/22
1.8K0
高阶可视化绘图系统:ggplot2入门
ggplot2带你轻松绘制旭日图
R语言数据分析指南
2023/08/18
1K4
ggplot2带你轻松绘制旭日图
有趣的数据可视化:R语言ggplot2包画云雨图展示不同地质时代恐龙的体长
https://www.kaggle.com/datasets/kjanjua/jurassic-park-the-exhaustive-dinosaur-dataset?resource=download
用户7010445
2024/04/22
2260
有趣的数据可视化:R语言ggplot2包画云雨图展示不同地质时代恐龙的体长
ggplot2优雅的绘制轨道图
❝本节来绘制一个简单的绘图案例;暂且称之为轨道图;下面小编就通过一个详细的案例介绍如何绘制此图;关于此图的实践应用以后在做介绍 加载R包 library(tidyverse) library(systemfonts) library(colorspace) 导入数据 rent <- readr::read_csv('rent.txt') 定义调色板 colors <- wesanderson::wes_palettes$Zissou1 数据清洗 rent_sf_2012 <- rent %>%
R语言数据分析指南
2022/12/20
5210
ggplot2优雅的绘制轨道图
ggforce优雅的绘制线圈棒棒糖图
购买后微信发小编订单截图即邀请进新的会员交流群,小编的文档为按年售卖,只包含当年度的除系列课程外的文档,有需要往年文档的朋友也可下单购买,需要了解更多信息的朋友欢迎交流咨询。
R语言数据分析指南
2023/07/11
3490
ggforce优雅的绘制线圈棒棒糖图
G3viz(r包)绘制基因棒棒糖图
首先,还是老习惯,推荐大家去学习官网:https://g3viz.github.io/g3viz/。
生信技能树
2025/02/05
1990
G3viz(r包)绘制基因棒棒糖图
ggplot2优雅的绘制车轱辘图
❝之前在一篇论文里面看到一张特殊的组合饼图感觉很不错,下面来构建数据进行复现,来看具体案例❞ 加载R包 library(tidyverse) library(scales) library(ggtext) library(patchwork) library(cowplot) library(RColorBrewer) 定义颜色 mycolors <- colorRampPalette(brewer.pal(12,"Paired"))(21) 构建数据集 df <- tribble(~group,~v
R语言数据分析指南
2022/09/21
2910
ggplot2优雅的绘制车轱辘图
跟着Nature Genetics学作图:使用ggarrange函数对ggplot2的多个图进行组合
https://www.nature.com/articles/s41588-022-01051-w
用户7010445
2023/01/06
3K0
跟着Nature Genetics学作图:使用ggarrange函数对ggplot2的多个图进行组合
用ggplot2画了一个我也叫不上名的炫酷图表
今日心血来潮,看到一幅制作精良的图表,就想使用ggplot2代码实现,虽然不知道该怎么称呼这个图表,但是能顺利做出来也是很有成就感的! 加载数据包 library("ggplot2") library("grid") library("showtext") library("Cairo") font.add("myfont","msyh.ttc") 构造图形数据源 mydata<-data.frame( id=1:13, class=rep_len(1:4, length=13), Label=c("Eve
数据小磨坊
2018/04/11
1K0
用ggplot2画了一个我也叫不上名的炫酷图表
ggplot2优雅的绘制圆点柱状图
❝本节来介绍如何灵活使用「geom_segment」与「geom_point」这两个几何对象来构建圆柱形条行图,下面通过1个案例来进行展示; 加载R包 library(tidyverse) 加载数据 data <- read_tsv("data.xls") 数据可视化 ggplot(data,aes(y = reorder(country, diff), x = diff, color=balance))+ geom_segment(aes(yend = country), xend=
R语言数据分析指南
2022/09/21
5470
ggplot2优雅的绘制圆点柱状图
ggplot2自构函数批量绘制蜂窝图
R语言数据分析指南
2023/09/20
1980
ggplot2自构函数批量绘制蜂窝图
ggplot2绘制玫瑰图
1绘制 ggplot(mydata) + + geom_bar(aes(x=a, y=b),width = 1,stat="identity", + colour = "black",fill="#F8766D") + + geom_text(aes(x=a,y = b-8,label = b),color="white") + + coord_polar(theta = "x",start=0) + + ylim(c(0,120))+ + theme_light(
爱学习的小明明
2020/09/20
1.4K0
R语言ggplot2画棒棒糖图展示KEGG富集分析结果
https://www.nature.com/articles/s41588-024-01683-0
用户7010445
2024/04/15
3760
R语言ggplot2画棒棒糖图展示KEGG富集分析结果
杂记:ggpairs更改配色;ggplot2极坐标添加直线;seqkit计算fasta序列的长度和gc含量
自己没有想法如何实现,搜索引擎搜索关键词 ggplot2 polar and then add straight lines找到参考链接
用户7010445
2021/07/12
1.9K0
杂记:ggpairs更改配色;ggplot2极坐标添加直线;seqkit计算fasta序列的长度和gc含量
ggplot2优雅绘制多彩折线图
R语言数据分析指南
2023/08/18
3030
ggplot2优雅绘制多彩折线图
ggplot2优雅绘制环状华夫图
❝本节来介绍如何只使用「geom_segment」函数来绘制环状华夫图,这个名称也许更符合示例图表,「数据代码已经上传VIP群,请自行下载」 ❞ 加载R包 library(tidyverse) library(ggtext) 导入数据 df <- read_tsv("data.xls") %>% mutate(count =as.factor(EDA_count)) labels <- tibble(x = 0,y = 1:5, text = c("A", "B","C","D","E")) 数
R语言数据分析指南
2022/09/23
3260
ggplot2优雅绘制环状华夫图
相关推荐
跟SCI学umap图| ggplot2 绘制umap图,坐标位置 ,颜色 ,大小还不是你说了算
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验