如何在ggplot2中重新排序图例?

21

给定一个包含标签类别列和百分数数据量化列的二列数据框,我可以可靠地在ggplot中生成柱状图,按照值而不是按字母顺序对柱排序,使用以下方法:

ggplot(data=df, aes(x=reorder(Label, Percent), y=Percent, fill=Label)) + geom_bar()

这将告诉重新排序按百分比值而不是文本对柱状图进行排序,使更容易看到变化。

然而,我无法使图例匹配:相反,它仍然按原始的字母顺序进行排序。这导致图例与图表不匹配,令人困惑。

我在StackOverflow和其他地方查找过,但没有找到可行的解决方法。有什么建议吗?

编辑:根据请求,这基本上是数据:

Labels <- c("G", "G", "A", "C", "M", "B", "M", "G", "A","M")
Percent <- c("-0.241","-0.046", "-0.037", "-0.024", "-0.003","0.007","0.01","0.059","0.121", "0.152")

1
你能提供一个代表性的df示例,以便我们可以重现你的问题吗? - cdeterman
2
你有试过像这样的+ scale_fill_discrete(breaks=c("顶部","中间","底部"))吗? - Jota
提供数据。至于scale_fill_discrete,它并没有解决问题。如果有其他问题,请告诉我。 - sogrady
2个回答

16

根据你提供的数据,以下方法基本上适用于我,基于 Frank 的建议:

Labels <- c("G", "G", "A", "C", "M", "B", "M", "G", "A","M")
Percent <- c("-0.241","-0.046", "-0.037", "-0.024", "-0.003","0.007","0.01","0.059","0.121", "0.152")
df <- data.frame(Labels, Percent)
df$Percent <- as.numeric(as.character(df$Percent))
legend_ord <- levels(with(df, reorder(Labels, Percent)))

library(ggplot2)
p <- ggplot(data=df, aes(x=reorder(Labels, Percent), y = Percent, fill=Labels)) 
p <- p + geom_bar(stat="identity")
p + scale_fill_discrete(breaks=legend_ord)

关于您的后续问题,如果您有特定的颜色,可以在scale_fill_manual调用中分配它们。

p <- ggplot(data=df, aes(x=reorder(Labels, Percent), y = Percent, fill=Labels)) 
p <- p + geom_bar(stat="identity")
p + scale_fill_manual(breaks=legend_ord, 
    values=c("G"="#0000FF", "C"="#003FBF","B"="#007F7F","A"="#00BF3F","M"="#00FF00"))

输入图像描述


15

我发现最简单的方法是在绘图之前重新排列你的数据。通过在aes()中指定reorder((),你本质上为绘图部分创建了一个有序副本,但在内部对于ggplot来传递它很棘手,例如对于制作图例的函数。

这应该可以很好地工作:

df$Label  <- with(df, reorder(Label, Percent))
ggplot(data=df, aes(x=Label, y=Percent, fill=Label)) + geom_bar()

我假设你的Percent列是数字类型,而不是分类或字符类型。从你的问题中无法得知这一点。未来如果您发布dput(df)代码,将会使数据类型更加明确,并且让他人可以复制/粘贴您的数据到R语言。


2
这更容易,因为它同时解决了颜色问题。谢谢! - sogrady

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接