相关: ggplot2条形图中的订购条。该问题涉及基于某些数字特征(例如,从最大到最小)的重新排序。我想基于不是数据固有的任意原因重新排序。
另外,如何更改ggplot中离散x刻度的顺序?。这建议对因子水平进行排序,这已在下面完成,但是我似乎无法结合使用子集数据和保持所需因子顺序的行为。
我有一些产品测试数据,我想在条形图中突出显示特定的样品。在我的特殊情况下,我想将我感兴趣的样本一直推到一侧,并用不同的颜色进行着色(即,将突出显示的样本以字母顺序移到右侧,并使其变为绿色)。
这是我尝试做的一个例子:
library(ggplot2)
test <- data.frame(names = c("A", "B", "C", "Last", "X", "Y", "Z"))
test$y <- 1:7
Run Code Online (Sandbox Code Playgroud)
如果我照原样绘制,众所周知的因素将按字母顺序排列。
ggplot(test, aes(x=Names, y=y)) + geom_bar()
Run Code Online (Sandbox Code Playgroud)

我像这样重新排列了级别:
test$names <- factor(test$names, levels = test$names[ c(1:3, 5:7, 4) ])
test$names
[1] A B C Last X Y Z
Levels: A B C X Y Z Last
Run Code Online (Sandbox Code Playgroud)
到目前为止,一切都很好。如果我们现在绘图,我会得到这个,这给了我想要的顺序:
ggplot(test, aes(x=names, y=y)) + geom_bar()
Run Code Online (Sandbox Code Playgroud)

但是我想将颜色Last涂成绿色,所以我尝试了一下:
p <- ggplot(test[!test$names=="Last" ,], aes(x=names, y=y)) + geom_bar()
p <- p + geom_bar(aes(x=names, y=y), test[test$names=="Last" ,], fill="darkgreen")
p
Run Code Online (Sandbox Code Playgroud)

如果我们查看传递给ggplot的原位子集:
test[!test$names=="Last" , ]$names
[1] A B C X Y Z
Levels: A B C X Y Z Last
test[!test$names=="Last" , ]$names
[1] A B C X Y Z
Levels: A B C X Y Z Last
Run Code Online (Sandbox Code Playgroud)
因此,级别排序是正确的,但是ggplot不会使用它来确定打印顺序。
我想知道问题是否出自同一数据帧的绘图数据,因此我将它们拆分,想知道ggplot是否会将单独的数据附加到末尾:
test2 <- test[test$names=="Last" , ]
test <- droplevels(test)
test2 <- droplevels(test2)
p <- ggplot(test, aes(x=names, y=y)) + geom_bar()
p <- p + geom_bar(aes(x=names, y=y), test2, fill="darkgreen")
p
Run Code Online (Sandbox Code Playgroud)
结果与最后一个图相同,Last中间是。
最后,我认为可以通过完成此操作scale_x_discrete,因此我尝试了以下操作:
p <- ggplot(test[!test$names=="Last" ,], aes(x=names, y=y)) + geom_bar()
p <- p + geom_bar(aes(x=names, y=y), test[test$names=="Last" ,], fill="darkgreen")
p <- p + scale_x_discrete(breaks=test$names[c(1:3, 5:7, 4)])
p
Run Code Online (Sandbox Code Playgroud)
我仍然Last在中间。
问题
获得所需内容的其他两种方法:
使用scale_x_discrete(drop=FALSE)这是必要的,因为尽管levels()因素相同,但您使用的两组数据却没有相同的x值。
p <- ggplot(test[!test$names=="Last" ,], aes(x=names, y=y)) + geom_bar()
p <- p + geom_bar(aes(x=names, y=y), test[test$names=="Last" ,], fill="darkgreen")
p <- p + scale_x_discrete(drop = FALSE)
p
Run Code Online (Sandbox Code Playgroud)用派生的美学效果和填充色(填充)
ggplot(test, aes(x=names, y=y, fill=(names=="Last"))) +
geom_bar() +
scale_fill_manual(breaks = c(FALSE,TRUE),
values = c("black", "darkgreen"),
guide = "none")
Run Code Online (Sandbox Code Playgroud)两者都给出了一个看起来像您答案中的图的图。