我使用ggplot
绘制了一个构面图,这里是情节
我遇到的问题是,facet(标签)按字母顺序排序(例如:E1,E10,E11,E13,E2,E3,I1,I10,I2),但我需要它们是E1之类的自定义顺序, I1,E2,I2,E3,E10,I10,E11,E13。
我该怎么做?
答案 0 :(得分:44)
如果您提供的分组变量不是一个因素,请不要依赖factor()
或ggplot
内部强制的默认水平排序。自己明确设定等级。
dat <- data.frame(x = runif(100), y = runif(100),
Group = gl(5, 20, labels = LETTERS[1:5]))
head(dat)
with(dat, levels(Group))
如果我想以任意顺序使用它们会怎样?
set.seed(1)
with(dat, sample(levels(Group)))
为此,请按照您希望的方式设置级别。
set.seed(1) # reset the seed so I get the random order form above
dat <- within(dat, Group <- factor(Group, levels = sample(levels(Group))))
with(dat, levels(Group))
现在我们可以使用它来按照我们想要的顺序绘制面板:
require(ggplot2)
p <- ggplot(dat, aes(x = x)) + geom_bar()
p + facet_wrap( ~ Group)
产生:
答案 1 :(得分:1)
正在处理类似的问题。我的默认级别如下:
[1] "A1" "A10" "A2" "A3" "A4" "A5" "A6" "A7" "A8" "A9"
[11] "B1" "B2" "B3" "B4" "B5" "B6" "B7" "B8" "B9"
请注意,由于字母顺序,第二级不合适。
这是我正在做的修复订单:
reorder(factor(fct),
fct %>%
str_replace("([[:alpha:]]+)", "\\1|") %>%
str_split("\\|") %>%
sapply(function(d) sprintf("%s%02d", d[1], as.integer(d[2]))),
function(x) x[1])
它取代了像&#34; A1&#34;用&#34; A01&#34;然后根据这些重新排序。我确信你可以更有效地做到这一点,但它确实能够完成这项工作。
它可以用来解决原始问题。