使用ggplot为特定样本挑选出美学

时间:2012-07-20 17:07:08

标签: r plot ggplot2

相关: 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()

enter image description here

我重新安排了这样的水平:

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

enter image description here

但是我想将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

enter image description here

如果我们查看传递给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会恢复为按字母顺序排列的顺序,而不是查看因子级排序?
  • 是否还有另一种(或更好的方法)在情节中为“特殊处理”挑出一行?

2 个答案:

答案 0 :(得分:5)

另外两种获得你想要的方法:

  1. 使用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
    
  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")
    
  3. 两者都给出了一个与你答案中的图形相似的图表。

答案 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

enter image description here