R 使用ggplot为美学选择特定样本

R 使用ggplot为美学选择特定样本,r,plot,ggplot2,R,Plot,Ggplot2,相关:。该问题涉及基于某些数值特征(例如从最大到最小)的重新排序。我想基于非数据固有的任意原因重新排序 也。这建议对因子水平进行排序,我在下面已经做了,但是我似乎无法将数据子集和保持因子顺序的行为结合起来 我有一些产品测试数据,我想让一个特定的样本在我的条形图中脱颖而出。在我的特殊情况下,我希望将我感兴趣的样本一直推到一边,并以不同的颜色对其进行着色(即,将突出显示的样本按字母顺序向右移动,并使其为绿色) 下面是我尝试做的一个例子: library(ggplot2) test <- da

相关:。该问题涉及基于某些数值特征(例如从最大到最小)的重新排序。我想基于非数据固有的任意原因重新排序

也。这建议对因子水平进行排序,我在下面已经做了,但是我似乎无法将数据子集和保持因子顺序的行为结合起来


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

下面是我尝试做的一个例子:

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

我重新安排了级别,如下所示:

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

但是我想把
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
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
因此,级别顺序是正确的,但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

我在中间仍然得到<代码>最后的<代码>。< /P> 问题

  • 为什么ggplot恢复为字母顺序的绘图顺序,而不是查看因子级别的顺序
  • 是否有其他(或更好的方式)在情节中挑出一行进行“特殊处理”
叹气

答案在上面的第二个相关问题()中,但再往下一点,不被接受。手动方法是通过
scale\u x\u discrete
,但我认为
breaks=
是一种方法。它实际上使用了
限制=

执行我正在寻找的操作的正确代码是:

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获得所需的其他两种方法:

  • 使用
    scale\u x\u discrete(drop=FALSE)
    这是必要的,因为您使用的两组数据没有相同的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
    

  • 两者都给出了一个与您答案中的图形类似的图形。

    您能否展开“没有相同的级别集”
    levels()
    使用
    test[criteria==“”,]
    为两个数据子集提供了相同的集合。我真的很喜欢第二种解决方案。我不知道有人能做到。所以填充向量最终是T/F值的向量,然后告诉ggplot如何将颜色映射到T/F?有没有办法在aes()之外执行此操作,这样就不必通过
    guide=“none”
    ?谢谢你!我的措辞很糟糕。正如您所指出的,这些因素确实具有相同的
    级别()。然而,实际存在的值并不相同。至于第二个问题,它必须在
    aes()
    调用中,因为颜色/填充是由数据决定的,而不是被分配一个常量值。如果它是数据驱动的,那么它必须位于
    aes()
    中。感谢您的解释。感觉有点傻,我意识到我也可以在df中创建一个新的向量,使用某种填充值(duh)并将其设置为该值。你在原地做,很整洁。再次感谢!最后一个(希望如此)问题。
    fill=
    aes()之外是否只允许包含一个值?我问,如果填充不是由数据决定的,而是由手动输入决定的,比如
    ggplot(dat,aes(x=x,y=y),fill=c(rep(“black”,6),“darkgreen”)
    。这似乎不起作用,所以我想提供一个特定值的
    fill=
    ,只有1)在
    aes()
    之外有效,2)只有当所有条都具有相同的值时才有效。这是正确的吗?除了
    aes()
    ,任何美学都只允许使用一个值,这是图形中所有(点/条/任何东西)的值。所以,对1和2都是肯定的。如果指定多个值,则这些值与数据之间存在隐式关系;ggplot要求这个关系是明确的(在data.frame中)。
    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
    
    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
    
    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")