繁体   English   中英

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

[英]How to reorder a legend in ggplot2?

给定一个带有分类标签列的两列数据框和一个百分比数据的定量列,我可以在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")

根据您提供的数据,以下内容适用于我,基本上应用了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"))

在此输入图像描述

我发现最简单的方法是绘图之前重新排序数据。 通过在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中。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM