如何对矩阵条形图的各组分别按降序排序?
实现分组内降序排列的条形图
没问题,我来帮你调整代码,实现每个分组(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
相关产品推荐
相关产品推荐

