如何绘制按年度数值排序的分类水平条形图
解决方法:按年份分组排序的水平条形图
没问题,我来帮你搞定这个水平条形图的排序需求!先提个小细节:你代码里的列名yeat应该是year,我后面的代码会先修正这个小疏漏~
核心思路是:要让每个年份内的类别按对应数值排序,我们需要把categories列转换成「基于各年份内数值大小排序的因子」,这样绘图工具就会按照我们想要的顺序渲染条形。
方法一:用ggplot2(推荐,灵活美观)
首先加载需要的包,处理数据排序,再绘图:
# 先修正列名拼写错误 names(data)[names(data) == "yeat"] <- "year" # 加载所需包 library(dplyr) library(ggplot2) # 按年份分组,将categories按value降序转换为因子 data_sorted <- data %>% group_by(year) %>% mutate(categories = forcats::fct_reorder(categories, value, .desc = TRUE)) %>% ungroup() # 绘制水平条形图 ggplot(data_sorted, aes(x = value, y = categories, fill = factor(year))) + geom_bar(stat = "identity", position = "dodge") + # 让不同年份的条形并排显示 labs( title = "各年份类别按数值排序的水平条形图", x = "数值", y = "类别", fill = "年份" ) + theme_minimal()
代码解释:
fct_reorder()是forcats包的函数,它会根据value的大小重新排列categories的因子水平,.desc = TRUE表示降序排列,如果你想要升序,改成FALSE即可。position = "dodge"让同类别不同年份的条形并排,避免堆叠。
方法二:用Base R(无需额外包)
如果你不想加载第三方包,用Base R也能实现:
# 修正列名 names(data)[names(data) == "yeat"] <- "year" # 按年份分组,将categories转换为按value降序排序的因子 data$categories <- with(data, ave(value, year, FUN = function(x) { factor(categories, levels = categories[order(-x)]) })) # 绘制水平条形图 barplot( tapply(data$value, list(data$categories, data$year), sum), horiz = TRUE, beside = TRUE, # 并排显示不同年份的条形 col = c("#1f77b4", "#ff7f0e"), xlab = "数值", ylab = "类别", main = "各年份类别按数值排序的水平条形图" ) # 添加图例 legend("topright", legend = unique(data$year), fill = c("#1f77b4", "#ff7f0e"))
这样两种方法都能实现你想要的「每个年份下类别按数值排序」的水平条形图效果啦!
内容的提问来源于stack exchange,提问作者Adi Cohen
相关产品推荐
相关产品推荐

