如何调整ggplot2绘制的Cleveland点图y轴排列顺序
Hallmark Cleveland点图Y轴按总得分降序排列实现方法
ggplot2绘制分类轴时,默认按照因子型变量的水平顺序、字符型变量的字母顺序排列分类,你只需要提前按规则设定Hallmarks列的因子水平,即可实现目标排序效果,不需要大幅修改原有绘图逻辑。
步骤1:计算总得分并重排Hallmark顺序
以下两种方法选一种运行即可:
- 基础R实现(无需安装额外依赖包)
# 按Hallmark分组计算所有Status对应的富集得分总和 hallmark_es_sum <- aggregate(`Enrichment Scores` ~ Hallmarks, data = Table, FUN = sum) # 按总得分降序排列,提取排序后的Hallmark名称 ordered_hallmark_list <- hallmark_es_sum$Hallmarks[order(hallmark_es_sum$`Enrichment Scores`, decreasing = TRUE)] # 将Hallmarks列转换为因子,按总得分降序设定水平 Table$Hallmarks <- factor(Table$Hallmarks, levels = ordered_hallmark_list)
- dplyr实现(适配tidyverse数据分析流程)
library(dplyr) Table <- Table %>% group_by(Hallmarks) %>% # 计算每个Hallmark对应的总富集得分 mutate(total_es = sum(`Enrichment Scores`)) %>% ungroup() %>% # reorder第二个参数加负号代表按降序排列 mutate(Hallmarks = reorder(Hallmarks, -total_es))
如果你不想修改原始数据框的结构,可以跳过因子转换步骤,直接在绘图代码中添加
scale_y_discrete(limits = ordered_hallmark_list)即可实现相同排序效果。
步骤2:优化并运行绘图代码
原代码中aes映射内不需要重复写Table$前缀,否则容易出现数据映射错误;另外调整了点和线的图层顺序,避免连线遮盖散点,修正后代码如下:
library(ggplot2) ggplot(Table, aes(x = `Enrichment Scores`, y = Hallmarks)) + geom_line(aes(group = Hallmarks)) + geom_point(aes(color = Status)) + geom_vline(xintercept = ES_cutoff, color = "blue", linetype = "dashed", linewidth = 1) + ggtitle("Hallmarks")
注:ggplot2 3.4.0及以上版本中,线条粗细参数已从size更新为linewidth,使用旧参数会出现警告但不影响运行,可根据自身安装版本调整。
内容的提问来源于stack exchange,提问作者Shanlin Tong
相关产品推荐
相关产品推荐

