给定两列数据框,其中包含标签的分类列和定量的百分比数据列,我可以使用以下方法可靠地在ggplot中生成条形图,该条形图按值而不是按字母顺序对条形进行排序:
ggplot(data=df, aes(x=reorder(Label, Percent), y=Percent, fill=Label)) + geom_bar()
Run Code Online (Sandbox Code Playgroud)
这告诉重新排序按百分比值而不是文本对条形图进行排序,从而更容易查看更改。
但是,我无法使图例匹配:相反,它仍然坚持按原始字母值排序。这会导致图例与图表不匹配,从而造成混淆。
我已经查看了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")
Run Code Online (Sandbox Code Playgroud)
cde*_*man 10
根据您提供的数据,以下内容对我来说基本上适用于弗兰克的建议:
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)
Run Code Online (Sandbox Code Playgroud)

关于您的后续问题,如果您有特定的颜色,您可以在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"))
Run Code Online (Sandbox Code Playgroud)

我发现最简单的方法是在绘制之前对数据重新排序。通过指定reorder(()inside aes(),您基本上可以为绘图零件制作一个有序的副本,但是在内部将ggplot其传递给例如图例制作函数很麻烦。
这应该可以正常工作:
df$Label <- with(df, reorder(Label, Percent))
ggplot(data=df, aes(x=Label, y=Percent, fill=Label)) + geom_bar()
Run Code Online (Sandbox Code Playgroud)
我确实假设您的Percent栏是数字,而不是因数或字符。您的问题不清楚。将来,如果您发布信息,dput(df)这些类将是明确的,并且允许人们将您的数据复制/粘贴到R中。