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

如何对矩阵条形图的各组分别按降序排序?

实现分组内降序排列的条形图

没问题,我来帮你调整代码,实现每个分组(W、X、Y、Z)内的条形按数值从高到低排列的效果~

思路说明

原代码的分组条形图是按原始行顺序展示每个组的数值,要实现组内降序,我们需要对每个列(分组)单独排序,同时保留每个数值对应的颜色关联(因为颜色是和原始行一一对应的)。

修改后的完整代码

# 原始数据和颜色定义
data <- structure(list(W= c(1L, 3L, 6L, 4L, 9L), 
                       X = c(2L, 5L, 4L, 5L, 12L), 
                       Y = c(4L, 4L, 6L, 6L, 16L), 
                       Z = c(3L, 5L, 6L, 7L, 6L)), 
                  .Names = c("W", "X", "Y", "Z"), 
                  class = "data.frame", 
                  row.names = c(NA, -5L)) 
colours <- c("red", "orange", "blue", "yellow", "green") 

# 对每个分组(列)按数值降序排序,同时记录对应颜色的原始索引
sorted_groups <- lapply(data, function(column) {
  # 按降序获取排序后的行索引
  sorted_indices <- order(-column)
  # 返回排序后的数值和对应的颜色索引
  list(sorted_values = column[sorted_indices], color_positions = sorted_indices)
})

# 整理排序后的数值为矩阵
sorted_data_matrix <- do.call(cbind, lapply(sorted_groups, function(g) g$sorted_values))
# 整理每个分组对应的颜色顺序,展平为barplot需要的向量格式
sorted_colors <- unlist(lapply(sorted_groups, function(g) colours[g$color_positions]))

# 绘制分组条形图
barplot(sorted_data_matrix, 
        main="My Barchart (Grouped Descending)", 
        ylab = "Numbers", 
        cex.lab = 1.5, 
        cex.main = 1.4, 
        beside=TRUE, 
        col=sorted_colors)

# 可选:添加图例(对应原始行的颜色标识)
legend("topright", legend = paste("Original Row", 1:5), fill = colours)

代码解释

  • 用lapply遍历每个分组(列),通过order(-column)获取降序排列的行索引,这样既能得到排序后的数值,又能保留原始颜色的对应关系。
  • 把每个分组排序后的数值整合成新的矩阵,确保每个组内的数值从高到低排列。
  • 颜色部分根据排序索引重新排列,展平成向量后传入barplot的col参数,完全匹配分组内条形的顺序。
  • 最终生成的图里,每个分组的条形都会从左到右按数值降序展示,比如W组最左侧是绿色(对应值9),依次是蓝色(6)、黄色(4)、橙色(3)、红色(1),完全符合你的需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:17:50