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

问题
  • 为什么 ggplot 恢复为按字母顺序排列的绘图顺序而不是查看因子级别排序?
  • 是否有另一种(或更好的方法)在情节中挑出一行进行“特殊处理”?
  • 最佳答案

    获得您想要的东西的另外两种方法:

  • 使用 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
    
  • 具有派生美学和 map 的颜色(好吧,填充)
    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")
    

  • 两者都给出了一张与您的答案中的图相似的图。

    关于r - 使用 ggplot 挑出一个特定的样本以获得美学,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11583948/

    10-13 00:09