ggplot2+dplyr处理含字符的样本列排序及geom_col图x轴间隔问题
问题解决方法
核心解决思路:将x轴的样本名列转换为自定义顺序的因子类型,使用离散坐标轴绘制,既可以实现「数值样本升序、阴性对照N放末尾」的排序要求,也不会出现连续坐标轴的不均匀间隔问题。
方法1:手动指定因子顺序(逻辑清晰,适配绝大多数场景)
library(tidyverse) # 构造示例数据 sample_names <- c(100,22,4,5,6,"N") size <- c(3,2,3,4,2,3) d <- data.frame(sample_names, size) # 提取非"N"的数值样本,转整数后升序排序,再把"N"拼接在末尾作为因子层级 num_levels <- sort(as.integer(setdiff(d$sample_names, "N"))) custom_levels <- c(as.character(num_levels), "N") # 将样本名列转为指定顺序的因子 d <- d %>% mutate(sample_names = factor(sample_names, levels = custom_levels)) # 直接绘图即可得到符合要求的x轴顺序 ggplot(d, aes(x = sample_names, y = size)) + geom_col(fill = "steelblue") + labs(x = "样本名称", y = "数值")
方法2:自动排序(适合大样本量场景,无需手动提取数值样本)
如果样本量极大,手动提取数值样本效率低,可以通过自定义排序规则直接生成因子层级:
d <- d %>% # 排序规则:非N样本按数值升序排列,N的排序权重设为无穷大自动排到末尾 arrange(ifelse(sample_names == "N", Inf, as.integer(sample_names))) %>% # 按排序后的行顺序直接设置因子层级 mutate(sample_names = fct_inorder(sample_names))
原方案问题说明
之前将样本名转为数值型的操作会让ggplot将x轴识别为连续数值轴,100、22等数值的间隔会按照实际数值差渲染,才会出现多余间隔。转为因子后x轴为离散轴,所有类别间隔均匀,完全避免该问题。
内容的提问来源于stack exchange,提问作者CoDa
相关产品推荐
相关产品推荐

