gseaplot3修改一下clusterProfiler默认绘图函数

直接使用clusterProfiler::gseaplot2绘图会出现下边的结果,导致四周显示不全,线的粗细也没办法调整,因为返回的是一个aplot包中的gglist对象,没太多研究。

p1 <- clusterProfiler::gseaplot2(gsea_result, gsea_result$ID, pvalue_table = T, base_size = 18, ES_geom='line')

在这里插入图片描述

自定义gseaplot3函数增加了size参数调整线的粗细,也调整了margin四周边距,可以在下边gseaplot3函数的基础上继续调整,如果需要的话。

p2 <- gseaplot3(gsea_result, gsea_result$ID, pvalue_table = T, base_size = 18, ES_geom='line', size=1.8)

在这里插入图片描述

gseaplot3 <- function (x, geneSetID, title = "", color = "green", base_size = 15, size=1.8,rel_heights = c(1.5, 0.5, 1), subplots = 1:3, pvalue_table = FALSE, ES_geom = "line") 
{library(grid)library(DOSE)gseaScores <- getFromNamespace("gseaScores", "DOSE")ES_geom <- match.arg(ES_geom, c("line", "dot"))geneList <- position <- NULLif (length(geneSetID) == 1) {gsdata <- gsInfo(x, geneSetID)}else {gsdata <- do.call(rbind, lapply(geneSetID, gsInfo, object = x))}p <- ggplot(gsdata, aes_(x = ~x)) + xlab(NULL) + theme_classic(base_size) + theme(panel.grid.major = element_line(colour = "grey92"), panel.grid.minor = element_line(colour = "grey92"), panel.grid.major.y = element_blank(), panel.grid.minor.y = element_blank()) + scale_x_continuous(expand = c(0, 0))if (ES_geom == "line") {es_layer <- geom_line(aes_(y = ~runningScore, color = ~Description), size = size)}else {es_layer <- geom_point(aes_(y = ~runningScore, color = ~Description), size = size, data = subset(gsdata, position == 1))}p.res <- p + es_layer + theme(legend.position = c(0.8, 0.8), legend.title = element_blank(), legend.background = element_rect(fill = "transparent"))p.res <- p.res + ylab("Running Enrichment Score") + theme(axis.text.x = element_blank(), axis.ticks.x = element_blank(), axis.line.x = element_blank(), plot.margin = margin(t = 0.2, r = 0.2, b = 0, l = 0.2, unit = "cm"))i <- 0for (term in unique(gsdata$Description)) {idx <- which(gsdata$ymin != 0 & gsdata$Description == term)gsdata[idx, "ymin"] <- igsdata[idx, "ymax"] <- i + 1i <- i + 1}p2 <- ggplot(gsdata, aes_(x = ~x)) + geom_linerange(aes_(ymin = ~ymin, ymax = ~ymax, color = ~Description)) + xlab(NULL) + ylab(NULL) + theme_classic(base_size) + theme(legend.position = "none", plot.margin = margin(t = -0.1, b = 0, unit = "cm"), axis.ticks = element_blank(), axis.text = element_blank(), axis.line.x = element_blank()) + scale_x_continuous(expand = c(0, 0)) + scale_y_continuous(expand = c(0, 0))if (length(geneSetID) == 1) {v <- seq(1, sum(gsdata$position), length.out = 9)inv <- findInterval(rev(cumsum(gsdata$position)), v)if (min(inv) == 0) inv <- inv + 1col <- c(rev(brewer.pal(5, "Blues")), brewer.pal(5, "Reds"))ymin <- min(p2$data$ymin)yy <- max(p2$data$ymax - p2$data$ymin) * 0.3xmin <- which(!duplicated(inv))xmax <- xmin + as.numeric(table(inv)[as.character(unique(inv))])d <- data.frame(ymin = ymin, ymax = yy, xmin = xmin, xmax = xmax, col = col[unique(inv)])p2 <- p2 + geom_rect(aes_(xmin = ~xmin, xmax = ~xmax, ymin = ~ymin, ymax = ~ymax, fill = ~I(col)), data = d, alpha = 0.9, inherit.aes = FALSE)}df2 <- p$datadf2$y <- p$data$geneList[df2$x]p.pos <- p + geom_segment(data = df2, aes_(x = ~x, xend = ~x, y = ~y, yend = 0), color = "grey")p.pos <- p.pos + ylab("Ranked List Metric") + xlab("Rank in Ordered Dataset") + theme(plot.margin = margin(t = -0.1, r = 0.2, b = 0.2, l = 0.2, unit = "cm"))if (!is.null(title) && !is.na(title) && title != "") p.res <- p.res + ggtitle(title)if (length(color) == length(geneSetID)) {p.res <- p.res + scale_color_manual(values = color)if (length(color) == 1) {p.res <- p.res + theme(legend.position = "none")p2 <- p2 + scale_color_manual(values = "black")}else {p2 <- p2 + scale_color_manual(values = color) + theme(legend.position = "none",plot.margin=margin(t = 0.1, r = 0.2, b = 0.1, l = 0.2, unit = "cm"))}}if (pvalue_table) {pd <- x[geneSetID, c("Description", "pvalue", "p.adjust")]rownames(pd) <- pd$Descriptionpd <- pd[, -1]for (i in seq_len(ncol(pd))) {pd[, i] <- format(pd[, i], digits = 3)}tp <- tableGrob2(pd, p.res)p.res <- p.res + theme(legend.position = "none",plot.margin=margin(t = 0.8, r = 0.2, b = 0.2, l = 0.2,unit = "cm")) + annotation_custom(tp, xmin = quantile(p.res$data$x, 0.5), xmax = quantile(p.res$data$x, 0.95), ymin = quantile(p.res$data$runningScore, 0.75), ymax = quantile(p.res$data$runningScore, 0.9))}plotlist <- list(p.res, p2, p.pos)[subplots]n <- length(plotlist)plotlist[[n]] <- plotlist[[n]] + theme(axis.line.x = element_line(), axis.ticks.x = element_line(), axis.text.x = element_text())if (length(subplots) == 1) return(plotlist[[1]] + theme(plot.margin = margin(t = 0.2, r = 0.2, b = 0.2, l = 0.2, unit = "cm")))if (length(rel_heights) > length(subplots)) rel_heights <- rel_heights[subplots]aplot::gglist(gglist = plotlist, ncol = 1, heights = rel_heights)}gsInfo <- function(object, geneSetID) {geneList <- object@geneListif (is.numeric(geneSetID))geneSetID <- object@result[geneSetID, "ID"]geneSet <- object@geneSets[[geneSetID]]exponent <- object@params[["exponent"]]df <- gseaScores(geneList, geneSet, exponent, fortify=TRUE)df$ymin <- 0df$ymax <- 0pos <- df$position == 1h <- diff(range(df$runningScore))/20df$ymin[pos] <- -hdf$ymax[pos] <- hdf$geneList <- geneListdf$Description <- object@result[geneSetID, "Description"]return(df)
}tableGrob2 <- function(d, p = NULL) {# has_package("gridExtra")d <- d[order(rownames(d)),]tp <- gridExtra::tableGrob(d)if (is.null(p)) {return(tp)}# Fix bug: The 'group' order of lines and dots/path is differentp_data <- ggplot_build(p)$data[[1]]# pcol <- unique(ggplot_build(p)$data[[1]][["colour"]])p_data <- p_data[order(p_data[["group"]]), ]pcol <- unique(p_data[["colour"]])## This is fine too## pcol <- unique(p_data[["colour"]])[unique(p_data[["group"]])]  j <- which(tp$layout$name == "rowhead-fg")for (i in seq_along(pcol)) {tp$grobs[j][[i+1]][["gp"]] <- gpar(col = pcol[i])}return(tp)
}

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

行为型模式 | 观察者模式

一、观察者模式 1、原理 观察者模式又叫做发布-订阅&#xff08;Publish/Subscribe&#xff09;模式&#xff0c;定义了一种一对多的依赖关系。让多个观察者对象同时监听某一个主题对象&#xff0c;这个主题对象在状态上发生变化时&#xff0c;会通知所有观察者对象&#xff0…

Camunda Rest API

客户端像调用本地方法一样调用引擎中的接口。 https://docs.camunda.org/manual/7.17/reference/rest/ 一&#xff1a;pom.xml <dependency><groupId>org.camunda.community.rest</groupId><artifactId>camunda-platform-7-rest-client-spring-boot-…

【Kafka-3.x-教程】-【三】Kafka-Broker、Kafka-Kraft

【Kafka-3.x-教程】专栏&#xff1a; 【Kafka-3.x-教程】-【一】Kafka 概述、Kafka 快速入门 【Kafka-3.x-教程】-【二】Kafka-生产者-Producer 【Kafka-3.x-教程】-【三】Kafka-Broker、Kafka-Kraft 【Kafka-3.x-教程】-【四】Kafka-消费者-Consumer 【Kafka-3.x-教程】-【五…

【Docker】概述与安装

&#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 接下来看看由辉辉所写的关于Docker的相关操作吧 目录 &#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 一. Docker的概述 1.Docker为什么出现 2…

【设计模式-7】门面模式的代码实现和应用场景

门面模式&#xff0c;最简单的结构性设计模式&#xff0c;将多个不同的子系统逻辑封装起来&#xff0c;对外提供统一的调用接口。门面模式又叫做外观模式&#xff0c;可能是我们接触最多的模式&#xff0c;在开发中&#xff0c;可能不经意间就用到了门面模式。 1. 概述 门面模…

设计模式之组合模式【结构型模式】

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档> 学习的最大理由是想摆脱平庸&#xff0c;早一天就多一份人生的精彩&#xff1b;迟一天就多一天平庸的困扰。各位小伙伴&#xff0c;如果您&#xff1a; 想系统/深入学习某…

极客时间-读多写少型缓存设计

背景 内容是极客时间-徐长龙老师的高并发系统实战课的个人学习笔记&#xff0c;欢迎大家学习&#xff01;https://time.geekbang.org/column/article/596644 总览内容如下&#xff1a; 缓存性价比 一般来说&#xff0c;只有热点数据放到缓存才更有价值 数据量查询频率命中…

Dubbo接口测试没你想的那么高大上

主题&#xff1a;Dubbo接口测试没你想的那么高大上 一、Dubbo是什么&#xff1f; Dubbo是阿里巴巴公司开源的一个高性能优秀的服务框架一款分布式服务框架、高性能和透明化的RPC远程服务调用方案、SOA服务治理方案下图是阿里巴巴技术解决方案演变图&#xff0c;从单应用->…

CAN201 计网概念收集

Lecture 1 the theoretical basis for networking Network edge and core 地理覆盖范围&#xff1a;广WAN&#xff0c;城MAN&#xff0c;局LAN&#xff0c;个PAN 交换方式&#xff0c;电路&#xff0c;报文&#xff0c;分组 电路交换vs报文vs分组 Network performance pr…

文件上传进阶绕过技巧(一)和靶场实战

★★免责声明★★ 文章中涉及的程序(方法)可能带有攻击性&#xff0c;仅供安全研究与学习之用&#xff0c;读者将信息做其他用途&#xff0c;由Ta承担全部法律及连带责任&#xff0c;文章作者不承担任何法律及连带责任。 0、环境准备 请移步《文件上传靶场实战&#xff1a;upl…

倍福CX8090嵌入式PLC新风控制开发

实现新风系统控制的方法与硬件配置、软件编程以及控制需求等因素有关。以下是一个简化的示例&#xff0c;说明如何使用倍福CX8090 PLC来实现新风系统的控制&#xff1a; 硬件配置&#xff1a; 倍福CX8090 PLC温度和湿度传感器风阀执行器显示屏软件编程&#xff1a; 使用倍福的…

深度解析Java中的ReadWriteLock:高效处理并发读写操作

第1章&#xff1a;引言 大家好&#xff0c;我是小黑&#xff0c;今天咱们聊聊读写锁。当多个线程同时对同一数据进行读写操作时&#xff0c;如果没有合理的管理&#xff0c;那数据就乱套了。就好比小黑在写日记&#xff0c;突然来了一帮朋友&#xff0c;大家都想往日记本上写点…