使用ggplot选出特定样本以获得美观

Hen*_*ndy 3 plot r ggplot2

相关: ggplot2条形图中的订购条。该问题涉及基于某些数字特征(例如,从最大到最小)的重新排序。我想基于不是数据固有的任意原因重新排序。

另外,如何更改ggplot中离散x刻度的顺序?。这建议对因子水平进行排序,这已在下面完成,但是我似乎无法结合使用子集数据和保持所需因子顺序的行为。


我有一些产品测试数据,我想在条形图中突出显示特定的样品。在我的特殊情况下,我想将我感兴趣的样本一直推到一侧,并用不同的颜色进行着色(即,将突出显示的样本以字母顺序移到右侧,并使其变为绿色)。

这是我尝试做的一个例子:

library(ggplot2)
test <- data.frame(names = c("A", "B", "C", "Last", "X", "Y", "Z"))
test$y <- 1:7
Run Code Online (Sandbox Code Playgroud)

如果我照原样绘制,众所周知的因素将按字母顺序排列。

ggplot(test, aes(x=Names, y=y)) + geom_bar()
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

我像这样重新排列了级别:

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
Run Code Online (Sandbox Code Playgroud)

到目前为止,一切都很好。如果我们现在绘图,我会得到这个,这给了我想要的顺序:

ggplot(test, aes(x=names, y=y)) + geom_bar()
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

但是我想将颜色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
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

如果我们查看传递给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
Run Code Online (Sandbox Code Playgroud)

因此,级别排序是正确的,但是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
Run Code Online (Sandbox Code Playgroud)

结果与最后一个图相同,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
Run Code Online (Sandbox Code Playgroud)

我仍然Last在中间。

问题

  • 为什么ggplot会恢复为按字母顺序排列的绘图顺序,而不是查看因子级别的顺序?
  • 是否有另一种(或更好的方法)在地块中单行进行“特殊处理”?

Bri*_*ggs 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
    
    Run Code Online (Sandbox Code Playgroud)
  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")
    
    Run Code Online (Sandbox Code Playgroud)

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