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

R语言ggplot离散X轴排序异常:(ix)位置错误问题求助

R柱状图X轴排序异常解决方案

问题描述

用R绘制柱状图时整体功能正常,但X轴的ix值排序错误——本该位于viii之后,却出现在iv之后。

复现代码

data<- read.csv("figure.csv", header = TRUE, colClasses = c("factor", "factor", "factor", "numeric"))

data %>% 
  ggplot(aes(x=Options.1, y=Value))+
  geom_bar(width= 0.6, stat = "identity", 
           position = "dodge",
           fill= "steelblue",
           color= "black", size= 0.8, 
           key_glyph= "polygon3")+ 
  geom_text(aes(label=Value),size=4, position = position_dodge(width=0.9), vjust = -1)+
  facet_wrap(~Rank.1, labeller = labeller(Rank.1=c("Rank 1"="Rank 1", 
                                                   "Rank 1_3"= "Rank 1-3",
                                                   "Rank 4_9"="Rank 4-9")))+
  labs(x=NULL, y= "Number of people")+
  scale_y_continuous(expand = expansion(0),limits = c(0,250), breaks = seq(0,250,50))+
  scale_x_discrete(breaks=c("i", "ii", "iii", "iv", "v", "vi", "vii", "viii", "ix"),
                   labels=c("(i)", "(ii)", "(iii)", "(iv)", "(v)", 
                            "(vi)", "(vii)", "(viii)", "(ix)"))+
  theme_grey()+
  theme(
    plot.margin = unit(c(1, 1, 1, 1), "cm"),
    axis.line.x.bottom = element_line(size = 1), 
    axis.line.y.left = element_line(size = 1),
    legend.title = element_text(face="bold", size=18),
    legend.position = c(0.8, 0.7),
    legend.background = element_rect(color = "black", linewidth = 0.95),
    legend.text =element_text(face="bold", size=14),
    strip.text = element_text(size=15), 
    axis.text=element_text(face="bold", size=18),
    axis.title = element_text(face="bold", size=18),
    axis.ticks.x = element_blank(),
    axis.ticks.y = element_line(size = 0.5)
    )+
    guides(fill = guide_legend(keywidth = 0.7, keyheight = 0.6, default.unit= "cm")) 

异常图表截图

柱状图X轴排序异常截图

数据截图

图表数据截图

问题原因

你将Options.1列设为因子(factor)后,R默认按字符串字典序排序。字典序中,ix的第二个字符x在iv的v之后,但在viii的v开头字符串之前,因此出现排序错位。

解决办法

手动指定因子的水平顺序,覆盖默认的字典序排序:

方法1:读取数据时直接指定因子水平

# 定义想要的X轴顺序
option_levels <- c("i", "ii", "iii", "iv", "v", "vi", "vii", "viii", "ix")

# 读取数据时设置因子水平
data <- read.csv("figure.csv", header = TRUE, 
                 colClasses = list(
                   Options.1 = factor(levels = option_levels),
                   Rank.1 = "factor",
                   .default = "numeric"
                 ))

方法2:读取数据后重新设置因子水平

如果已经读取了数据,可单独修改Options.1的因子属性:

option_levels <- c("i", "ii", "iii", "iv", "v", "vi", "vii", "viii", "ix")
data$Options.1 <- factor(data$Options.1, levels = option_levels)

修改后重新运行你的ggplot代码,X轴就会按照i→ii→iii→iv→v→vi→vii→viii→ix的正确顺序排列。


内容的提问来源于stack exchange,提问作者Falling Into Infinity

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 12:43:25