使用ggplot2手动设置任意顺序的填充条形图的顺序

7
我正在尝试找出如何转换我的条形图。当前,填充色“Gears”的顺序是按数字顺序排列的。我希望能够手动设置“Gears”填充色的任意顺序。
我发现的所有其他示例都告诉我如何根据数据的计数或值按升序或降序对它们进行排序。而我想手动以任意顺序设置顺序。因此,不是3-4-5,而是我想手动告诉它我想要将数据呈现为3-5-4或5-3-4等顺序。
这是我现在拥有的:
library(data.table)
library(scales)
library(ggplot2)

mtcars <- data.table(mtcars)
mtcars$Cylinders <- as.factor(mtcars$cyl)
mtcars$Gears <- as.factor(mtcars$gear)
setkey(mtcars, Cylinders, Gears)
mtcars <- mtcars[CJ(unique(Cylinders), unique(Gears)), .N, allow.cartesian = TRUE]

ggplot(mtcars, aes(x=Cylinders, y = N, fill = Gears)) + 
               geom_bar(position="dodge", stat="identity") + 
               ylab("Count") + theme(legend.position="top") + 
               scale_x_discrete(drop = FALSE)

圆柱图

如果需要进行不涉及ggplot2的任何数据操作,我希望使用data.table进行操作。感谢您的帮助!

1个回答

15

你需要正确设置因子水平。

假设你有一个因子:

> x=factor(c("a","c","b"))
> x
[1] a c b
Levels: a b c

顺序为a c b,但绘图顺序是a b c,因为默认因子按字母数字顺序生成级别。

也许您希望绘图顺序与向量中的顺序匹配-我们可以指定因子级别应按首次遇到每个级别的顺序排列:

> z=factor(x,unique(x))
> z
[1] a c b
Levels: a c b

也许我们都不想要这两个选项 - 例如,我们可能想要 c a b

我们可以手动设置顺序。

> y=factor(c("a","c","b"),levels=c("c","a","b"))
> y
[1] a c b
Levels: c a b

或者我们可以通过明确指定每个层级的位置来稍后调整因子:

> reorder(y,x,function(x)c(a=2,b=3,c=1)[x])
[1] a c b
attr(,"scores")
c a b 
1 2 3 
Levels: c a b

现在你知道了这一点,你可以将你在其他地方找到的技巧应用到这里,比如

如何在ggplot2条形图中排序条形


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接