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

bla*_*p07 5 r ggplot2

我正在试图弄清楚如何转换我的条形图.现在,Gears填充按数字顺序排列.我试图能够以Gears任意顺序手动设置填充的顺序.

我找到的所有其他示例告诉我如何根据数据的计数或值以降序或升序对它们进行排序.我正在尝试以任意顺序手动设置订单.因此,我想手动告诉它我希望数据显示为3-5-4或5-3-4,而不是3-4-5.

这就是我现在拥有的:

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)
Run Code Online (Sandbox Code Playgroud)

圆柱图

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

Ale*_*own 12

您需要正确设置因子水平.

我们假设你有一个因素

> x=factor(c("a","c","b"))
> x
[1] a c b
Levels: a b c
Run Code Online (Sandbox Code Playgroud)

订单是a c b,但绘图顺序是a b c,因为默认因子以字母数字顺序生成级别.

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

> z=factor(x,unique(x))
> z
[1] a c b
Levels: a c b
Run Code Online (Sandbox Code Playgroud)

也许我们不想要这些 - 例如我们可能想要的c a b.

我们可以手动设置订单

> y=factor(c("a","c","b"),levels=c("c","a","b"))
> y
[1] a c b
Levels: c a b
Run Code Online (Sandbox Code Playgroud)

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

> 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
Run Code Online (Sandbox Code Playgroud)

现在你知道了,你可以应用你在其他地方找到的技术,比如

ggplot2条形图中的订单栏