如何按Open Margin子集的巢数量重新排序ggplot的X轴?
按Open Margin类别巢数排序ggplot的X轴
当前图表的X轴按每个“蜂类/蜂群”的总巢数(Forested和Open Margin数值相加)排序,希望改为仅按Open Margin类别的巢数对X轴排序,现有ggplot代码如下:
ggplot(straw.gg.sum, aes(fill = Margin, y = sumNests, x = reorder(str_to_title(straw.gg.sum$Builder), sumNests, decreasing = TRUE))) + geom_bar(stat = "identity", position = "dodge") + xlab("Bee or wasp group") + ylab("Total nests") + theme(axis.text.x=element_text(angle=45, vjust=0.9, hjust=1, face="italic", size=8), panel.background = element_blank(), axis.line = element_line(colour = "black"), text = element_text(size = 11)) + scale_fill_manual("Margin", values=c("forested"="yellowgreen", "open"="cyan3"))
解决方案
核心是修改reorder()函数的排序依据,从总巢数替换为仅Open Margin类别的巢数。具体操作如下:
- 用
ave()函数按Builder分组,提取每组对应Open Margin类别的sumNests值作为排序权重 - 将该权重传递给
reorder()的第二个参数,实现按指定类别数值排序X轴
修改后的完整代码:
ggplot(straw.gg.sum, aes(fill = Margin, y = sumNests, x = reorder(str_to_title(Builder), ave(sumNests, Builder, FUN = function(x) x[Margin == "open"]), decreasing = TRUE))) + geom_bar(stat = "identity", position = "dodge") + xlab("Bee or wasp group") + ylab("Total nests") + theme(axis.text.x=element_text(angle=45, vjust=0.9, hjust=1, face="italic", size=8), panel.background = element_blank(), axis.line = element_line(colour = "black"), text = element_text(size = 11)) + scale_fill_manual("Margin", values=c("forested"="yellowgreen", "open"="cyan3"))
说明
ave(sumNests, Builder, FUN = function(x) x[Margin == "open"]):按蜂类/蜂群分组,筛选出每组中Open Margin类别的巢数,作为该组的排序依据reorder()会基于这个依据重新排列X轴的类别顺序,达到仅按Open Margin巢数排序的效果
内容的提问来源于stack exchange,提问作者stinkymushu
相关产品推荐
相关产品推荐

