相关: ggplot2 bar graph 中的 Order Bars。该问题涉及基于某些数字特征(例如从最大到最小)的重新排序。我想基于非数据固有的任意原因重新排序。
另外,如何更改ggplot中离散x比例的顺序?. 这建议对因子水平进行排序,我在下面已经完成了,但是我似乎无法结合对数据进行子集化和保持我想要的因子顺序的行为。
我有一些产品测试数据,我想让一个特定的样本在我的条形图中脱颖而出。在我的特殊情况下,我想将我感兴趣的样本一直推到一侧并以不同的方式着色(即将我突出显示的样本不按字母顺序向右移动并使其变为绿色)。
这是我尝试做的一个例子:
library(ggplot2)
test <- data.frame(names = c("A", "B", "C", "Last", "X", "Y", "Z"))
test$y <- 1:7
如果我按原样绘制,众所周知,这些因素将按字母顺序排列。
ggplot(test, aes(x=Names, y=y)) + geom_bar()
我重新排列了这样的级别:
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
到现在为止还挺好。如果我们现在绘制,我会得到这个,这给了我想要的顺序:
ggplot(test, aes(x=names, y=y)) + geom_bar()
但我想染成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
如果我们查看传递给 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
所以级别排序是正确的,但 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
结果与上一张图相同,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
我还是Last
在中间。
问题
- 为什么 ggplot 恢复到字母顺序而不是查看因子级别顺序?
- 是否有另一种(或更好的方法)在情节中挑出一行进行“特殊处理”?