【发布时间】:2013-05-16 12:53:52
【问题描述】:
在 R 中使用 plot 会导致 x 轴上的因子按字母顺序排列。
如何指定 x 轴上因子的顺序?
例子:
y <- 1:9
x <- c(rep("B", 3), rep("A", 3), rep("C", 3))
plot(y ~ as.factor(x))
这会导致:
我怎样才能让它绘制为“B”、“A”、“C”?
【问题讨论】:
在 R 中使用 plot 会导致 x 轴上的因子按字母顺序排列。
如何指定 x 轴上因子的顺序?
例子:
y <- 1:9
x <- c(rep("B", 3), rep("A", 3), rep("C", 3))
plot(y ~ as.factor(x))
这会导致:
我怎样才能让它绘制为“B”、“A”、“C”?
【问题讨论】:
您只需要按照您想要的顺序指定因子的水平。所以这里我新建一个变量x1
x1 = factor(x, levels=c("B", "C", "A"))
在哪里
R> x1
[1] B B B A A A C C C
Levels: B C A
plot 函数现在可以正常工作了。
plot(y ~ x1)
【讨论】:
您似乎想根据每个箱形图的 50% 值以某种形式的顺序绘制它们?以不同的数据框为例:
temp <- structure(list(
Grade = c("U","G", "F", "E", "D", "C", "B", "A", "A*"),
n = c(20L, 13L, 4L, 13L, 36L, 94L, 28L, 50L, 27L)),
.Names = c("Grade", "n"),
class = c("tbl_df", "data.frame"),
row.names = c(NA, -9L))
如果我们绘制这个,我们可以看到标签是混乱的(A 在 A* 之前)。
library(ggplot2)
ggplot(temp) +
geom_bar(stat="identity", aes(x=Grade, y=n))
我们可以如上所示手动排序,或者我们可以决定按照每个成绩的学生人数的顺序绘制成绩。这也可以手动完成,但如果我们可以自动完成会更好:
首先我们订购数据框:
library(dplyr)
temp <- temp %>% arrange(n)
然后我们改变Grade列内的层级来表示数据的顺序
temp$Grade <- as.vector(temp$Grade) #get rid of factors
temp$Grade = factor(temp$Grade,temp$Grade) #add ordered factors back
运行上面显示的相同图形命令,您可以使用不同顺序的 x 轴绘制数据。
【讨论】:
在 ggplot 中,除了更改外部数据的顺序之外,您还可以使用以下命令简单地指定图中的顺序:
+scale_x_discrete(limits = c("B","A","C"))
当然,这仅适用于类别数量有限的情况!
【讨论】: