抽风的ggplot2版本让我排查bug到半夜!!!
示例数据
示例数据为单细胞的两个组别 IPF vs normal 差异分组,对每个亚群做差异分析,得到的多组差异结果:
可以从这里下载:链接:
代码语言:javascript代码运行次数:0运行复制load("diff_res.RData")
head(diff_sc)
绘图
由于搬家,自己的服务器还没有整理好,这里用了技能树的共享服务器,换了一个分析环境太难受了,要啥啥都没有准备好:
代码语言:javascript代码运行次数:0运行复制# 使用 公共路径中的R包
.libPaths(c('~/R/x86_64-pc-linux-gnu-library/4.4',
'/refdir/Rlib',
'/usr/local/lib/R/library'))
# 加载包
library(ggplot2)
packageVersion("ggplot2")
library(Seurat)
library(qs)
library(tidyverse)
library(ggrepel)
然后是绘图,先对数据做一下处理:
代码语言:javascript代码运行次数:0运行复制table(diff_sc$Group)
diff_sc <- diff_sc[abs(diff_sc$avg_log2FC)>0.58, ]
diff_sc$log10fdr <- -log10(diff_sc$p_val_adj)
# 处理一下极大值
diff_sc$log10fdr[diff_sc$log10fdr=="Inf"] <- max(diff_sc$log10fdr[diff_sc$log10fdr!=Inf])
# 获取每种细胞亚群中Top10基因:
top10 <- diff_sc %>%
group_by(Group) %>%
dplyr::filter(avg_log2FC > 1) %>%
top_n(10, abs(avg_log2FC)) %>%
ungroup()
# 创建自定义色板:
mycol <- c('#b12d30', '#43b5e6', '#93ba1f', '#58ac41', '#f0bbcb','#f1aa41'
,"#6cc3b9","#fc3c46","#b76f9e","#3568a3","#f66464")
开始绘图:
代码语言:javascript代码运行次数:0运行复制# 基础火山图
p <- ggplot() +
geom_point(data = diff_sc, aes(x = avg_log2FC, y = log10fdr),size = 0.8, color = 'grey') +
coord_flip() + # 坐标轴翻转
facet_grid(. ~ Group,scales = "free") + # 一行多列;
geom_point(data = top10, aes(x = avg_log2FC, y = log10fdr,color = Group)) + # 添加top点颜色
geom_vline(xintercept = c(-0.58, 0.58), size = 0.5, color = "grey50", lty = 'dashed')+ #添加阈值线
scale_color_manual(values = mycol) #+ #更改配色
theme_bw()+
theme( legend.position = 'none', #去掉图例
panel.grid = element_blank(), #去掉背景网格
axis.text = element_text(size = 10), #坐标轴标签大小
axis.text.x = element_text(angle = 45, vjust = 0.8), #x轴标签旋转
strip.text.x = element_text(size = 10, face = 'bold') #加粗分面标题
)
# 添加基因symbol
p +
geom_text_repel(
data = top10,
aes(x = avg_log2FC, y = log10fdr, label = gene, color = Group),
fontface = 'italic',
seed = 233,
size = 3,
min.segment.length = 0, # 始终为标签添加指引线段
force = 12, # 重叠标签间的排斥力
force_pull = 2, # 标签和数据点间的吸引力
box.padding = 0.1, # 标签周边填充量
max.overlaps = Inf, # 始终显示所有标签
segment.linetype = 3, # 线段类型
segment.alpha = 0.5, # 线段不透明度
direction = "y", # 按 y 轴调整标签位置方向
hjust = 0, # 0 右对齐,1 左对齐,0.5 居中
point.padding = 0.5, # 增加点和标签之间的间距
nudge_x = 0.05, # 在 x 轴方向上微调标签位置
nudge_y = 0.05 # 在 y 轴方向上微调标签位置
)
结果如下:
你就会发现,好好的也没有重叠在一起,怎么就有的亚群可以显示基因symbol,有的就不显示呢!
就在我查代码查的快疯了的时候,突然想起来之前有一次绘图,跟张俊交流过一些问题,上一次交流的时候是ggplot2的两个参数我查到明明有,但是用的时候一直提示我不对!然后他问我的ggplot2版本是哪个?他专门订阅了github上每一个ggplot2的更新消息,让我安装github上最新的版本!
我灵光一闪,会不会是这次也是ggplot2的版本有问题呢?!
先看一下现在的ggplot2版本:3.5.1
代码语言:javascript代码运行次数:0运行复制library(ggplot2)
packageVersion("ggplot2")
# ‘3.5.1’
然后火速的去github下载最新版本,安装:
代码语言:javascript代码运行次数:0运行复制.libPaths()
# 安装
devtools::install_local("ggplot2-main.zip")
packageVersion("ggplot2")
# [1] ‘3.5.2.9000’
github上走在最前沿:到了3.5.2.9000版了!
然后回去重新绘图,同样的代码,但是需要重启Rstudio,加载新的ggplot2:
代码语言:javascript代码运行次数:0运行复制.libPaths("/home/data/t020448/miniconda3/envs/R4.4/lib/R/library")
.libPaths()
library(ggplot2)
packageVersion("ggplot2")
# [1] ‘3.5.2.9000’
library(Seurat)
library(qs)
library(tidyverse)
library(ggrepel)
重新走上面的代码,结果如下:
洗洗睡了!明天又是一条好汉,还有那么多答疑等着我!
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。原始发表:2025-04-23,如有侵权请联系 cloudcommunity@tencent 删除ggplot2服务器数据bugdiff