You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

R语言group_by分组数字排序错乱导致堆叠直方图x轴异常

问题根因

x轴出现100排在90前面的乱序,和分组排序逻辑无关,核心是你构建数据集时的写法把CoOc列从数值型强制转成了字符型:

  • cbind()生成的是矩阵结构,要求所有列的数据类型完全一致。你用cbind(Sims, CoOc, Out)拼接时,因为Out是字符型向量,会把原本是数值型的Sims、CoOc两列全部强制转成字符型,再传入data.frame。
  • 当你把字符型变量映射到ggplot的x轴时,系统默认按字符串字典序排序——也就是逐位比较字符大小,第一位的1比9小,所以所有以1开头的数值(100、110……140)都会排在90~99的前面,就出现了你看到的数值回落乱序。
修复方案

两种方案选任意一种即可:

  • 方案1:修正数据集创建逻辑,去掉多余的cbind()嵌套。原生data.frame()本身支持不同列存储不同数据类型,直接传入向量就能保留CoOc的数值属性:
    把原代码的df <- data.frame(cbind(Sims, CoOc, Out))替换为df <- data.frame(Sims, CoOc, Out)
  • 方案2:如果不方便修改数据源,就在数据处理环节显式把CoOc转回数值型,避免排序异常,比如在分组统计前加类型转换步骤:
    df2 <- df %>% 
      mutate(CoOc = as.numeric(as.character(CoOc))) %>% # 兼容因子型的安全转换写法
      group_by(CoOc, Out) %>%
      summarize(Counts = n(), .groups = "drop")
    
修正后可直接运行的完整代码
library(tidyverse)

# 构造测试数据
Sims <- seq(1,100,1)
CoOc <- sample(90:140, 100, replace = TRUE)
Out <- sample(c("A Wins", "B Wins", "Tie"), 100, replace = TRUE)
df <- data.frame(Sims, CoOc, Out)

# 分组统计
df2 <- df %>% 
  group_by(CoOc, Out) %>% 
  summarize(Counts = n(), .groups = "drop")

# 绘制堆叠柱状图
ggplot(df2)+ 
  geom_bar(aes(fill = Out, y = Counts, x = CoOc), 
           position = "stack", stat = "identity")+
  labs(title="Example",
       x="CoOc",
       y="Num")+
  scale_fill_manual(name = "Outcome",
                    values = c("#AD1457", "#B3E5FC", "#FF9800"))+
  theme_bw()+ 
  theme(panel.border = element_blank(), 
        panel.grid.major = element_blank(), 
        panel.grid.minor = element_blank(), 
        axis.line = element_line(colour = "white"), 
        plot.caption.position = "plot", 
        plot.caption = element_text(hjust = 0))

运行后x轴会按照90到140的数值大小连续排列,不会再出现排序错乱的问题。


内容的提问来源于stack exchange,提问作者MadelineJC

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 13:06:30