3

相关: 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 恢复到字母顺序而不是查看因子级别顺序?
  • 是否有另一种(或更好的方法)在情节中挑出一行进行“特殊处理”?
4

2 回答 2

5

获得所需内容的另外两种方法:

  1. 使用scale_x_discrete(drop=FALSE)这是必要的,因为您使用的两组数据不存在相同的 x 值,尽管levels()因素相同。

    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
    
  2. 用派生的美学和地图着色(好吧,填充)

    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")
    

两者都给出了一个看起来就像你的答案中的图表。

于 2012-07-20T20:35:44.947 回答
3

叹...

答案上面的第二个相关问题中(如何更改 ggplot 中离散 x 比例的顺序?),但进一步下降且不被接受。执行此操作的手动方法是 via 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

在此处输入图像描述

于 2012-07-20T17:19:37.957 回答