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"))
异常图表截图

数据截图

问题原因
你将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
相关产品推荐
相关产品推荐

