如何在ggplot绘图时保持x轴原有顺序不自动排序
问题
现有包含rplau列的矩阵mat,使用自定义ggplot绘图函数时,x轴标签总是按字符首数字排序(比如所有以1开头的标签会排在前面),但希望保持输入字符向量的原有顺序(比如让“928:1854”紧跟在“1:927”之后)。以下是自定义绘图函数及示例数据:
belplauPlot<-function(belplau_mat, xlab, color, y="rplau", x="index", is_log_scale=TRUE) { ggplot(as.data.frame(belplau_mat) %>% mutate(!!sym(y):=(if(is_log_scale) log(!!sym(y)) else !!sym(y))) %>% mutate(!!x:=xlab)) + geom_point(aes(x=!!sym(x),y=!!sym(y),colour=factor(color))) + labs(color="") + theme_bw() + ylab(if (is_log_scale) paste0("log(",y,")") else y) }
示例调用及数据:
# 调用函数 belplauPlot(bel_plau3, part3_idx_s, lof_true3) # 输入的x轴标签向量 part3_idx_s [1] "1:927" "928:1854" "1855:2780" # 颜色分组向量 lof_true3 [1] 1 2 0
解决方案
问题根源是ggplot默认会把字符型x轴变量自动转为因子,并按字母顺序排序。要保留原有顺序,只需在数据处理时将x轴变量设置为指定了水平顺序的因子即可。
修改自定义函数中创建x轴变量的代码,把mutate(!!x:=xlab)替换为mutate(!!x:=factor(xlab, levels = xlab)),强制因子的水平顺序和输入的xlab向量顺序完全一致。
修改后的完整函数:
belplauPlot<-function(belplau_mat, xlab, color, y="rplau", x="index", is_log_scale=TRUE) { ggplot(as.data.frame(belplau_mat) %>% mutate(!!sym(y):=(if(is_log_scale) log(!!sym(y)) else !!sym(y))) %>% # 关键修改:将x轴变量转为指定水平顺序的因子 mutate(!!x:=factor(xlab, levels = xlab))) + geom_point(aes(x=!!sym(x),y=!!sym(y),colour=factor(color))) + labs(color="") + theme_bw() + ylab(if (is_log_scale) paste0("log(",y,")") else y) }
再次调用函数时,x轴标签就会严格按照part3_idx_s的原有顺序排列:“1:927” → “928:1854” → “1855:2780”,不会再出现按字符首数字乱序的情况。
内容的提问来源于stack exchange,提问作者monotonic
相关产品推荐
相关产品推荐

