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

ggplot双变量柱状图按正数值降序排序及手动排序需求

我明白你的问题了——当每个NAME对应正负两个值时,直接用reorder(NAME, Values)会因为默认对每个NAME的所有Values取均值,导致排序结果不符合预期。下面分两种情况解决你的需求:

一、按正数值自动降序排序

你的示例数据里,Variable = "L"对应的是正数值,我们需要基于这部分值来给NAME排序。这里有两种实现方式:

方法A:在ggplot中直接指定排序逻辑

可以在reorder里精准提取每个NAME对应的正数值,再加负号实现降序(reorder默认是升序):

ggplot(data = example_data, aes(x = reorder(NAME, -Values[Variable == "L"]), y = Values, fill = Variable)) +
  geom_bar(stat = "identity", alpha = 1) +
  geom_text(aes(label = round(Values, 1)), position = position_stack(vjust = 0.5)) + # 让文本居中显示,避免重叠
  ylab("Unit of measurement") +
  scale_fill_manual(values = c('#AED6F1','#F5B7B1'))

这里Values[Variable == "L"]会为每个NAME匹配对应的正数值,-号将升序转为降序,最终就能得到你想要的[C, D, A, E, B]顺序。

方法B:先处理数据生成排序后的因子(更直观)

如果需要更清晰的逻辑,也可以先从数据中提取排序后的NAME列表,再把NAME转为指定顺序的因子:

# 提取正数值对应的NAME,并按Values降序排列
name_order <- example_data %>%
  dplyr::filter(Variable == "L") %>% # 需要加载dplyr包,或者用base R的subset
  dplyr::arrange(dplyr::desc(Values)) %>%
  dplyr::pull(NAME)

# 将NAME转换为因子,指定levels为排序后的顺序
example_data$NAME <- factor(example_data$NAME, levels = name_order)

# 绘图
ggplot(data = example_data, aes(x = NAME, y = Values, fill = Variable)) +
  geom_bar(stat = "identity", alpha = 1) +
  geom_text(aes(label = round(Values, 1)), position = position_stack(vjust = 0.5)) +
  ylab("Unit of measurement") +
  scale_fill_manual(values = c('#AED6F1','#F5B7B1'))

这种方法的好处是排序逻辑清晰可见,后续调整排序规则也更方便。

二、通用手动覆盖排序方法

不管数据中的数值是什么,如果你想完全手动指定NAME的顺序,只需要把NAME转换为因子,并通过levels参数定义你想要的顺序即可:

# 手动指定你想要的顺序
example_data$NAME <- factor(example_data$NAME, levels = c("C", "D", "A", "E", "B"))

# 绘图时x轴就会严格按照这个顺序排列
ggplot(data = example_data, aes(x = NAME, y = Values, fill = Variable)) +
  geom_bar(stat = "identity", alpha = 1) +
  geom_text(aes(label = round(Values, 1)), position = position_stack(vjust = 0.5)) +
  ylab("Unit of measurement") +
  scale_fill_manual(values = c('#AED6F1','#F5B7B1'))

这种方法适用于任何你想自定义排序的场景,完全不受数据中数值的影响。

内容的提问来源于stack exchange,提问作者DaMaGe91

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:27:13