You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何按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类别的巢数。具体操作如下:

  1. 用ave()函数按Builder分组,提取每组对应Open Margin类别的sumNests值作为排序权重
  2. 将该权重传递给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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 00:42:37