ggplot2中如何手动自定义Y轴分类的排列顺序?
手动指定ggplot2离散轴排列顺序的实现方式
ggplot2 对离散坐标轴的默认排序逻辑是:如果映射的列是字符型,会自动按字母顺序转换为因子,再按照因子的水平(levels)顺序排列轴标签,这就是反向比较项被字母顺序拆开的原因。要自定义顺序只需要手动指定因子水平/轴标度限制即可,不需要修改底层默认排序算法。
操作步骤
- 第一步:先整理你想要的轴排列顺序,把互为反向的比较项相邻排列,做成一个字符向量,注意要覆盖该分组列的所有唯一值,漏写的分组会在图中被丢弃。以你提到的主动脉内皮/生血内皮比较为例,顺序向量写法参考:
# 把你所有的比较分组按照想要的相邻规则补全即可 y_axis_order <- c("AEvsHE", "HEvsAE", "组1vs组2", "组2vs组1", "组1vs组3", "组3vs组1")
- 第二步:两种方式应用自定义顺序,选一种即可
- 提前修改数据源,把对应分组列转为自定义水平的因子:
# 注意:你原代码里把comparison映射到了X轴、DEG映射到了Y轴,如果要把比较分组放在Y轴,记得调整aes里的映射关系 cl$comparison <- factor(cl$comparison, levels = y_axis_order)- 不修改原数据,直接在绘图代码里加标度设置指定轴顺序:
如果比较分组在Y轴,加scale_y_discrete(limits = y_axis_order);如果在X轴就换成scale_x_discrete(limits = y_axis_order)。
修改后的参考绘图代码
按照你描述的「比较分组在Y轴」的需求,调整后的完整代码如下:
# 先自定义你需要的Y轴顺序,补全所有比较组 y_axis_order <- c("AEvsHE", "HEvsAE") # 自行补全剩余分组 ggplot(cl,aes(y=comparison, x=DEG, size=enrichment))+ geom_point(alpha=0.5)+ scale_size(range=c(1,5), name="enrichment")+ scale_y_discrete(limits = y_axis_order) + # 手动指定Y轴排列顺序 theme_bw()
小提示:如果你的比较组数量非常多,手动列顺序效率低,也可以写一段简单的字符串处理代码,自动把"vs"前后内容翻转的配对项排在一起,但是分组数量不多的情况下手动列顺序是最稳妥、完全符合预期的方式。
内容的提问来源于stack exchange,提问作者melita.t.r
相关产品推荐
相关产品推荐

