ggplot2中coord_flip()后分组柱状图轴标签顺序调整问题
我来帮你搞定这个问题!你遇到的核心问题是你的qid列是字符类型(比如"8"而不是数值8),但你设置limits用的是数值向量,类型不匹配导致设置没生效。咱们一步步解决:
第一步:补全可复现数据
你提供的dput没写完,我先补全完整的测试数据,方便验证:
all_Q <- structure(list( group = structure(c(1L, 2L, 3L, 4L, 1L, 2L, 3L, 4L, 1L, 2L, 3L, 4L, 1L, 2L, 3L, 4L), .Label = c("A", "B", "C", "D"), class = "factor"), correct_per = c(90.4761904761905, 100, 100, 87.5, 83.3333333333333, 90.9090909090909, 84.6153846153846, 87.5, 80.9523809523809, 88.6363636363636, 100, 70.8333333333333, 63.4146341463415, 76.7441860465116, 76.9230769230769, 62.5), nr_correct = c(38L, 44L, 26L, 21L, 35L, 40L, 22L, 21L, 34L, 39L, 26L, 17L, 26L, 33L, 20L, 15L), nr_incorrect = c(4L, 0L, 0L, 3L, 7L, 4L, 4L, 3L, 8L, 5L, 0L, 7L, 15L, 10L, 6L, 9L), length = c(42L, 44L, 26L, 24L, 42L, 44L, 26L, 24L, 42L, 44L, 26L, 24L, 41L, 43L, 26L, 24L), qid = c("8", "8", "8", "8", "9", "9", "9", "9", "10", "10", "10", "10", "11", "11", "11", "11") ), class = "data.frame", row.names = c(NA, -16L))
第二步:修改代码实现需求
因为qid是字符型,所以我们需要用字符向量来设置limits。另外,coord_flip()会把原x轴的顺序反转:原x轴从左到右的顺序,会变成flip后y轴从下到上的顺序。所以如果想让1在flip后的y轴顶部,我们需要让原x轴的顺序是从左到右16,15,...,1,或者直接对字符型的levels反转后设置。
这里提供两种靠谱的方法:
方法1:直接在scale_x_discrete中用字符型limits并反转
library(ggplot2) # 定义字符型的levels,覆盖你所有的qid(1到16) char_levels <- as.character(1:16) ggplot(all_Q, aes(x=qid, y=correct_per, fill=group)) + geom_bar(stat="identity", position=position_dodge()) + # 设置limits为反转后的字符向量,这样flip后1在顶部 scale_x_discrete(name = "Questions", limits = rev(char_levels)) + scale_y_continuous(name = "Percent correct") + coord_flip()
方法2:先把qid转换成有序因子(更推荐,后续分析也方便)
# 先将qid转为有序因子,指定顺序为16到1(这样原x轴默认就是这个顺序) char_levels <- as.character(1:16) all_Q$qid <- factor(all_Q$qid, levels = rev(char_levels), ordered = TRUE) ggplot(all_Q, aes(x=qid, y=correct_per, fill=group)) + geom_bar(stat="identity", position=position_dodge()) + scale_x_discrete(name = "Questions") + scale_y_continuous(name = "Percent correct") + coord_flip()
为什么之前的方法没用?
你之前定义的levels <- c(1,2,...16)是数值向量,但你的qid列是字符型(比如"8"),两者类型不匹配,scale_x_discrete无法识别这个数值型的limits,所以顺序没有变化。只要把limits改成和qid同类型的字符向量,问题就解决啦!
内容的提问来源于stack exchange,提问作者Ivan Bacher
相关产品推荐
相关产品推荐

