如何用R按区域办公室可视化各区域TOP5合作方
解决按区域办公室生成TOP5合作方柱状图的问题
我明白你现在的困扰——本来以为是个简单的任务,结果卡在按区域筛选TOP5合作方,还不知道怎么把绘图逻辑串起来。咱们一步步来搞定它:
第一步:修正数据格式并模拟完整数据集
首先你的示例数据里字符型变量没加引号,R会把它们当成对象,先修正成可运行的格式:
# 模拟你提供的示例数据 Partner <- c("A", "B", "C", "D", "E", "F", "G", "A", "A", "B", "B", "C", "D", "E", "G", "G", "H", "I", "F") Region_Off <- c("AU", "BE", "CA", "DK", "EU", "FR", "GER", "AU", "AU" , "BE", "BE", "CA", "DK", "EU", "GER", "GER", "HK", "IR", "FR") MY_df <- data.frame(Partner, Region_Off)
第二步:按区域筛选TOP5合作方
你之前的代码核心问题是没有按区域分组计算,导致得到的是全局TOP5而非每个区域的TOP5。用dplyr的分组操作可以轻松解决:
library(dplyr) # 按区域分组,统计每个合作方的数量,取每个区域的TOP5 top_partners_by_region <- MY_df %>% group_by(Region_Off, Partner) %>% tally(sort = TRUE) %>% # tally等价于count,sort=TRUE直接按数量降序排列 slice_head(n = 5) %>% # 每个组取前5个 ungroup() # 取消分组,方便后续绘图
第三步:绘制分区域柱状图
现在用ggplot2绘制柱状图,为了让每个区域的柱子按合作方数量排序,我们可以用reorder()调整x轴顺序,再用分面展示不同区域:
library(ggplot2) ggplot(top_partners_by_region, aes(x = reorder(Partner, n), y = n)) + geom_bar(stat = "identity", fill = "#2E86AB") + # 绘制柱状图 coord_flip() + # 翻转坐标轴,让长名称更易读 facet_wrap(~Region_Off, scales = "free_y") + # 按区域分面,free_y避免空类别占空间 labs(x = "合作方", y = "合作次数", title = "各区域办公室TOP5合作方") + theme_minimal()
为什么你的原有代码行不通?
- 第一个代码:
count(Partner)没有按Region_Off分组,统计的是全局所有合作方的数量,之后的facet_wrap只是把全局TOP5重复分到各个区域,完全不是你要的效果。 - 第二个代码:
apply是按列处理数据,逻辑上就不对——你需要的是按区域分组取TOP5,而不是对每一列单独排序取前5。
这样运行下来,就能得到每个区域独立的TOP5合作方柱状图了!
内容的提问来源于stack exchange,提问作者BloopFloopy
相关产品推荐
相关产品推荐

