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