相关: Order Bars in ggplot2 bar graph。该问题涉及基于某些数字特征(例如最大到最小)的重新排序。我想根据数据不固有的任意原因重新订购。
此外,how to change the order of a discrete x scale in ggplot?。这建议排序因子水平,我在下面做过,但是我似乎无法将数据子集化并保持我想要的因子顺序。
我有一些产品测试数据,我想让我的条形图中的特定样品脱颖而出。在我的特殊情况下,我想将我感兴趣的样本一直推到一边并对其进行不同的着色(即将我突出显示的样本从字母顺序向右移动并使其为绿色)。
以下是我尝试做的一个例子:
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
。
问题
答案 0 :(得分:5)
另外两种获得你想要的方法:
使用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
颜色(嗯,填充)与派生的美学和地图
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")
两者都给出了一个与你答案中的图形相似的图表。
答案 1 :(得分:3)
唉...
上面第二个相关问题(how to change the order of a discrete x scale in ggplot?)中的答案 ,但是进一步向下并且不被接受。手动方式是通过scale_x_discrete
,但我认为breaks=
就是这样。它实际上是使用limits=
。
我正在寻找的正确代码是:
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(limits=test$names[c(1:3, 5:7, 4)])
p
或者,因为我已经重新安排了等级:
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(limits=levels(test$names))
p