如何在R中生成按主类别分组的子类别含纤维产品比例分组条形图
问题:生成按子类别划分并按主类别分组的含纤维产品比例条形图
用户提供的R数据集如下:
df <- data.frame( Product = c(755, 728, 417, 355, 913, 634, 385, 208, 204, 696, 968, 816, 279, 869, 823, 646, 986, 674, 806, 335, 731, 734, 107, 105, 512, 859, 159, 113, 353, 105, 205, 919, 243, 717, 838, 408, 423, 357, 408, 464, 724, 643, 943, 648, 623, 451, 449, 135, 842, 711), Category = c("Bread", "Cheese", "Bread", "Cheese", "Bread", "Cheese", "Bread", "Bread", "Bread", "Cheese", "Bread", "Bread", "Cheese", "Bread", "Cheese", "Bread", "Bread", "Bread", "Cheese", "Cheese", "Cheese", "Bread", "Bread", "Cheese", "Bread", "Cheese", "Bread", "Bread", "Bread", "Cheese", "Cheese", "Bread", "Bread", "Cheese", "Cheese", "Bread", "Bread", "Bread", "Bread", "Cheese", "Cheese", "Cheese", "Cheese", "Cheese", "Cheese", "Cheese", "Cheese", "Bread", "Bread", "Cheese"), Sub_Category = c("White", "Camembert", "White", "Camembert", "White", "Brie", "Brown", "Wholemeal", "White", "Brie", "Wholemeal", "Wholemeal", "Gouda", "Wholemeal", "Camembert", "Brown", "White", "Wholemeal", "Gouda", "Gouda", "Brie", "Wholemeal", "Wholemeal", "Camembert", "White", "Brie", "Wholemeal", "Wholemeal", "Brown", "Brie", "Brie", "White", "Wholemeal", "Camembert", "Gouda", "White", "Wholemeal", "Brown", "White", "Camembert", "Brie", "Brie", "Camembert", "Brie", "Camembert", "Gouda", "Camembert", "Wholemeal", "White", "Camembert"), Fibre = c(TRUE, FALSE, FALSE, FALSE, FALSE, TRUE, FALSE, TRUE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE, TRUE, TRUE, TRUE, FALSE, FALSE, FALSE, TRUE, TRUE, FALSE, FALSE, FALSE, FALSE, TRUE, FALSE, FALSE, TRUE, FALSE, TRUE, TRUE, TRUE, TRUE, TRUE, FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, TRUE, FALSE, TRUE, TRUE) )
需求是创建分组条形图:每个条形对应一个子类别(共6个),展示该子类别中含纤维产品的比例,同时通过颜色区分主类别(Bread/Cheese)。
解决方案
1. 数据预处理:计算各子类别含纤维产品比例
需要同时按**主类别(Category)和子类别(Sub_Category)**分组,计算每个子类别中含纤维产品的占比:
library(tidyverse) # 计算每个子类别的含纤维比例,保留主类别信息 subcat_proportions <- df %>% group_by(Category, Sub_Category) %>% summarise( Proportion = mean(Fibre) * 100, # 直接用mean(Fibre),因为TRUE=1,FALSE=0 .groups = "drop" # 取消分组,避免后续ggplot警告 )
2. 绘制分组条形图
用ggplot2绘制条形图,通过fill = Category让主类别对应不同颜色,x轴为子类别,y轴为比例:
ggplot(subcat_proportions, aes(x = reorder(Sub_Category, Proportion), y = Proportion, fill = Category)) + geom_col(width = 0.7) + # geom_col适合已汇总的数值,替代geom_bar(stat="identity") labs( title = "各子类别含纤维产品比例", x = "子类别", y = "含纤维产品比例(%)", fill = "主类别" ) + theme_minimal() + theme( plot.title = element_text(hjust = 0.5, size = 14, face = "bold"), axis.title = element_text(size = 12), axis.text.x = element_text(angle = 45, hjust = 1) # 旋转x轴标签避免重叠 )
代码说明
reorder(Sub_Category, Proportion):让子类别按比例从小到大排序,图表更直观geom_col:直接使用已计算好的比例值绘制条形,比geom_bar(stat="identity")更简洁fill = Category:让不同主类别的条形显示不同颜色,并自动生成图例- 主题调整:添加居中标题、旋转x轴标签,提升图表可读性
内容的提问来源于stack exchange,提问作者Jay Bee
相关产品推荐
相关产品推荐

